结构化查询语言(SQL)

不区分大小写,[]可选,非数值用''包围,字段名可以用``来包围,以区别于关键字

1. DDL(数据定义语言)

1.1. CREATE(创建表)

1,CREATE database name --创建数据库
2,CREATE table name(   --创建表(每行末尾可以用回车)
     col_name1 col_type(len) [not null],
     col_name2 col_type(len) [not null],
       ...);
3,CREATE table t_name1 AS SELECT col_name(s) From t_name  --把查询结果当成表创建

1.2. DROP(删除表)

1,DROP database name --删除数据库
2,drop table [if exists] table_name1,table_name2 [CASCADE|RESTRICT] --删除无关数据表
3,alter table f_table_name drop FOREIGN KEY con_name[CASCADE|RESTRICT] --解除外部约束
  • restrict: 确保只有不存在相关视图和完整性约束的表才能删除
  • cascade: 任何相关视图和完整性约束一并被删除

1.3. ALTER(修改表)

1,alter table old_name rename to new_name --修改表名
2,alter table table_name 
    • change old_name new_name new_type  --修改字段名modify col_name new_type 约束  --修改字段类型add new_col_name new_type --增加字段drop col_name --删除字段alter col_name set DEFAULT value  --添加默认值
3,alter table table_name --修改表级约束
      add CONSTRAINT con_name  --增加表级约束 PRIMARY KEY(col)_name)  --增加主键约束FOREIGN KEY(f_col)references m_table(M_col)  --增加外键约束CHECK(exp) --定义约束DROP 约束关键字 约束名  --删除约束

2. DML(数据操作语言)

2.1. INSERT(新增数据)

1,INSERT INTO table_name values(V1,V2,...Vn)  --插入一行记录,列值同数同序(不建议使用,无法修改变结构因为会导致该语句失效)
2, INSERT INTO table_name (col1,col2...coln) values(V1,V2,....Vn) --插入指定列的值,多行插入就在values后写多个()用,隔开
3,INSERT INTO table_name SELECT col_name(s) FROM table_name1 --插入查询结果

2.2. DELETE(删除数据)

1,delete from table_name  --删除所有行数据(清空表)
     where condition_expression  --删除指定行
2,on delete cascade  --外键约束定义语句,级联删除

2.3. UPDATE(更新数据)

update table_name
set{col_name=expression}[,...n] --修改列数据,可以多列
where condition_expression --条件语句,限定范围

例:

update users
set user_sex='女'
where user_QQ='12302'

3. DQL(数据查询语言)

3.1. SELECT格式和顺序

1,select database();  --显示当前使用的数据库,未进库时显示所有库
2,select [distinct] col1,col2,..coln  --写出要显示的列,distinct消除重复,*所有列
from table1,table2,...tablen
[where conditions] --显示满足conditions的数据
[group by col_name...] --根据col_name分组并分别显示结果
--多字段分组,先按第一个分组,在对这些组按第二个分组...
[聚合函数在分组之后进行计算并显示结果]
[having conditions] --显示满足聚合函数的conditions的分组
[显示select选择的列项]
[order by col_name[asc|desc]] --按照order_list的升序或降序排序,后跟数字指第几列
多列排序:order by col_name1 asc, col_name2 desc --按1升,2降,1优先级高
[LIMIT index,count  或者 count]  --指定显示从index(0开始)开始的count个数据,或从头开始的count个数据  (mysql独有)

3.2. 连接查询

内连接INNER JOIN(交集)

SELECT column_name(s) FROM table1 a [INNER] JOIN table2 b
ON a.column_name=b.column_name; --等值连接
ON a.column_name between b.column_name1 and b.column_name2  --非等值连接

SELECT column_name(s) FROM table a [INNER] JOIN table b
ON a.column_name1=b.column_name2; --自连接

外连接LEFT/RIGHT OUTER JOIN

执行步骤:先求笛卡尔积得结果集-->用on语句筛选-->把left/right表中未匹配的行以外部行的形式加到结果集上,并用null补全。

SELECT column_name(s)
FROM table1
LEFT/RIGHT [OUTER] JOIN table2
ON table1.column_name=table2.column_name;

全连接FULL OUTER JOIN(mysql内没有)

可以用UNION把left和right结合起来就是full了

多表连接

前两个表的结果表和后一个表连接

注意:ON的条件再筛选完后会补上主表的剩余的数据加上填满null值得副表,要对主副两表做限制可以先用where筛选过后的表进行关联查询

内外连接图解

652656-20161201180708037-1291931523

3.3. 子查询

IN(以in里的值查询目标)

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);(SELECT column_name From)

EXISTS(子查询有返回行时执行外查询)

SELECT column_name(s)
FROM table_name
WHERE column_name EXISTS(SELECT * From)

WHERE(用子查询来使用聚合函数)

SELECT column_name(s) FROM table_name
WHERE column_name >(SELECT avg(name) From table)

FROM(把子查询作为临时表)

SELECT column_name(s)
FROM (SELECT * From)

SELECT(只适用于单行子查询)

SELECT column_name(s),(SELECT column_name From)
FROM table_name

3.4. 联合查询UNION

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

注意:UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

SELECT column_name(s) FROM table1
UNION [ALL]
SELECT column_name(s) FROM table2**;

All为允许重复,默认不允许,可以用''替代没有值的列

4. Like通配符

通配符 描述
% 替代 0 个或多个字符
_ 替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist][!charlist] 不在字符列中的任何单一字符
  1. 'A_Z':所有以 'A' 起头,另一个任何值的字原,且以'Z' 为结尾的字串。 'ABZ' 和 'A2Z' 都符合这一个模式,而 'AKKZ' 并不符合 (因为在 A 和 Z 之间有两个字原,而不是一个字原)。
  2. 'ABC%':所有以 'ABC' 起头的字串。举例来说,'ABCD' 和 'ABCABC' 都符合这个套式。
  3. '%XYZ':所有以 'XYZ' 结尾的字串。举例来说,'WXYZ' 和 'ZZXYZ' 都符合这个套式。
  4. '%AN%':所有含有 'AN' 这个套式的字串。举例来说,'LOS ANGELES' 和 'SAN FRANCISCO' 都符合这个套式。

5. CASE表达式

-- 简单case
CASE expr
WHEN expr_value THEN case_value
WHEN expr_value THEN case_value
ELSE case_value END
-- expr 可以是列名,也可以是函数或表达式
-- expr_value expr表达式的值
-- case_value expr满足expr_value后,整个case表达式的值

-- case搜索函数
CASE WHEN expression THEN case_value
WHEN expression THEN case_value
ELSE case_value END
-- expression 条件表达式
-- case_value expression满足后,整个case表达式的值

使用场景:SELECT后,GROUP BY后,CHECK约束内,SET赋值时“=”后

CASE内可以使用BETWEEN,LIKE,IS NULL,IN,EXISTS等等。

results matching ""

    No results matching ""