Database-SQL语句总结

不同的数据库语法有差异,本文以MySQL数据库语法为例!    
数据库优点:
    共享/减少冗余/集中控制
    一致/完整/可维护
    安全/可靠/故障恢复
    
SQL语言分为三类:  
    DDL(Data Definition Language):   数据库定义语言,对数据库/表结构定义或修改,大多在建表时使用,create/alter/drop
    DML(Data Manipulation Language): 数据库操作语言,对表行记录数据操作,insert/update/delete/select
    DCL(Data Control Language):      数据库控制语言,用户权限管理/事务控制,grant/rollback/commit
    
SQL语言注释:  单行--  多行/* */

一.数据库(DDL)

1.创建数据库

创建一个数据库(字符校对规则: 指字符集的排序规则)
create database 库名 [character set 码表名 collate 字符校对规则]
            
创建一个utf8字符集的数据库 
create database 库名 character set utf8;
    
创建一个utf8字符集并带校对规则的数据库(utf8_bin 按二进制排序)
create database 库名 character set utf8 collate utf8_bin; 

2.修改数据库

修改数据库   alter database 库名 character set 字符集 collate 校对集;    
删除数据库   drop database 库名;

3.使用数据库

切换当前数据库  use 库名;        
查看当前数据库  select database();     
查看所有数据库  show databases;        
查看建库语句    show create database 库名;

二.表列(DDL)

1.创建表

create table 表名(列名1 类型1, 列名2 类型2...)[character set 字符集 collate 校对规则];   
create table user(
        id int primary key auto_increment,
        loginname varchar(10) not null unique,
        password varchar(20) not null,
        age int(3) not null,
        birthday datetime not null
    );

类型:
    字符串(255B): char(n)/varchar(n) 
    数值: tinyint(1B)/smallint/int/bigint/float/double    
    逻辑: bit(0/1) 
    日期: Date/Time/DateTime/timestamp
    大数(4GB): Blob/Text

2.修改表

增加列        alter table 表名 add 列名 类型;
删除列        alter table 表名 drop 列名;
修改列名      alter table 表名 change 列名 新列名 类型;
修改列类型    alter table 表名 modify 列名 类型;
修该表字符集  alter table 表名 character set 字符集 collate 校对集;
修改表名      rename table 表名 to 新表名;
删除表        drop table 表名; 

3.查看表

查看表结构     desc 表名; 
查看所有表     show tables;
查看建表语句   show create table 表名;

三.表行/记录(DML)

1.增insert

insert into 表名(列名1,列名2...) values(value1,value2...);    
insert into user(name,password) values('lioil','**lioil**');

2.删delete

delete from 表名 [where ....]
1.逐行删除记录,不删除表本身
    delete from user;
2.删除表本身
    drop user;
3.先摧毁表,再新建表(删除效率高),不能在事务中恢复
    TRUNCATE TABLE user;

3.改update

update 表名 set 列名1=value1, 列名2=value2... [where 条件1,条件2...]
update user set name='lioil' where id=1;

4.查select

SELECT selection_list         /*列名*/
FROM table_list               /*表名*/
WHERE condition               /*行条件*/
GROUP BY grouping_columns     /*对结果分组*/
HAVING condition              /*分组后的行条件*/
ORDER BY sorting_columns      /*对结果排序*/
LIMIT offset_start, row_count /*结果限量*/

1).select 列名 from 表名    
查找所有列 select * from 表名  (*需要运算,效率较低,最好列出列名,表结构变了后不易出错)
剔除重复行 select distinct 列名 from 表名 
设置别名   select 列名1+列名2 (as) 别名 from 表名; (as可省略)

2).where
可用的运算符如下: 
    =  !=  >  <  >=  <=  <>
    and or not
    between 1 and 10   取值在1到10之间  
    in(5,3,6)          取值是5或3或6
    not in(1,2,3)
    is null            值是否空
    is not null
    like 'lio%'        %表示任意个字符, _表示1个字符
select * from user where name != 'li';  
select * from user where not name = 'li';
select * from user where name not in('li'); 
select * from user where name = null;   错误(null不等于null)
select * from user where name is null;  正确
select * from user where name is not null;
select * from user where not name is null;
select * from user where name like '___';  name是三个字符

3).聚合函数(纵向运算,多行计算)
有null参与计算,结果都是null,此时可用ifnull(列名,0)处理,
如: select ifnull(列1,0) + ifnull(列2,0) from user;    

count(列名) 指定列的记录个数      
sum(列名)   指定列的记录值求和     
avg(列名)   指定列的记录值平均值                
max(列名)、min(列名) 指定列中的最大记录值和最小记录值(不是数值类型,计算结果为0)

select sum(age) from user;
select avg(age) from user;
select max(age) from user;
select min(age) from user;
select count(*) from user where age > 25;

4).group by 列名1,列名2 having...
having子句对group by结果筛选
having和where区别:
where用在分组之前, having用在分组之后, having可用sum(), where不行

5).order by 列名 asc/desc limit
asc升序(默认), desc降序   
从第3行开始,查询2行记录 select * from user limit 3,2;

6).执行顺序
from join on
where
group by(从此开始可用select别名,而在此之前无法使用,如在where中不能用)
avg,sum,count等聚合函数
having 
select 
distinct 
order by

四.约束(主键和外键)

1.创建表时指定外键约束

create table A(
    id int primary key auto_increment,
    fkey int,
    foreign key(fkey) references B(id)
);
create table B(
    id int primary key auto_increment
);

2.外键约束

增加外键 alter table 表1 add foreign key(列名) references 表2(列名) [on delete restrict] [on update cascade];
    restrict: 本表外键引用了主表的记录, 在主表就无法删除相关记录
    cascade:  本表和在主表会级联删除       
删除外键 alter table 表名 drop foreign key 列名;

3.主键约束

增加主键      alter table 表名 add  primary key(列名) auto_increment;
删除主键      alter table 表名 drop primary key
增加自动增长  alter table 表名 modify id int auto_increment;
删除自动增长  alter table 表名 modify id int;

五.多表关系和查询

一对一(教室和班级): 在任意方保存另一方主键作为外键
一对多(班级和学生): 在多方保存另一方主键作为外键
多对多(教师和学生): 中间表保存两张表主键作为两个外键,保存对应关系

ta表
+----+------+-------+
| id | name | tb_id |
+----+------+-------+
|  1 | aaa  |   1   |
|  2 | bbb  |   2   |
|  3 | bbb  |   4   |
+----+------+-------+

tb表
+----+------+
| id | name |
+----+------+
|  1 | xxx  |
|  2 | yyy  |
|  3 | yyy  |
+----+------+

1.笛卡尔积查询

两张表记录相乘操作,左表有n条记录,右表有m条记录,最后得到m*n条记录,
select * from ta ,tb;
+----+------+-------+----+------+
| id | name | tb_id | id | name |
+----+------+-------+----+------+
|  1 | aaa  |     1 |  1 | xxx  |
|  2 | bbb  |     2 |  1 | xxx  |
|  3 | bbb  |     4 |  1 | xxx  |
|  1 | aaa  |     1 |  2 | yyy  |
|  2 | bbb  |     2 |  2 | yyy  |
|  3 | bbb  |     4 |  2 | yyy  |
|  1 | aaa  |     1 |  3 | yyy  |
|  2 | bbb  |     2 |  3 | yyy  |
|  3 | bbb  |     4 |  3 | yyy  |
+----+------+-------+----+------+

2.内连接

查询两张表中都有的关联数据,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。 
select * from ta inner join tb on ta.tb_id = tb.id; (可用逗号,代替inner join)
select * from ta,tb on ta.tb_id = tb.id;
+----+------+-------+----+------+
| id | name | tb_id | id | name |
+----+------+-------+----+------+
|  1 | aaa  |     1 |  1 | xxx  |
|  2 | bbb  |     2 |  2 | yyy  |
+----+------+-------+----+------+

3.外连接

1).左外连接: 内连接基础上左表全部显示的结果
select * from ta left join tb on ta.tb_id = tb.id;
+----+------+-------+------+------+
| id | name | tb_id | id   | name |
+----+------+-------+------+------+
|  1 | aaa  |     1 |    1 | xxx  |
|  2 | bbb  |     2 |    2 | yyy  |
|  3 | bbb  |     4 | NULL | NULL |
+----+------+-------+------+------+
    
2).右外连接: 内连接基础上右表全部显示的结果        
select * from ta right join tb on ta.tb_id = tb.id;
+------+------+-------+----+------+
| id   | name | tb_id | id | name |
+------+------+-------+----+------+
|    1 | aaa  |     1 |  1 | xxx  |
|    2 | bbb  |     2 |  2 | yyy  |
| NULL | NULL |  NULL |  3 | yyy  |
+------+------+-------+----+------+
    
3).全外连接: 内连接基础上左表和右表都全部显示的结果
mysql不支持全外连接
    select * from ta full join tb on ta.tb_id = tb.id;  

mysql可用union合并两条select语句,间接实现全外连接
    select * from ta left join tb on ta.tb_id = tb.id;
    union
    select * from ta right join tb on ta.tb_id = tb.id;
+------+------+-------+------+------+
| id   | name | tb_id | id   | name |
+------+------+-------+------+------+
|    1 | aaa  |     1 |    1 | xxx  |
|    2 | bbb  |     2 |    2 | yyy  |
|    3 | bbb  |     4 | NULL | NULL |
| NULL | NULL |  NULL |    3 | yyy  |
+------+------+-------+------+------+

简书: http://www.jianshu.com/p/b4e63c010ed1
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54743585
GitHub博客:http://lioil.win/2017/01/25/SQL.html
Coding博客:http://c.lioil.win/2017/01/25/SQL.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容