DQL
单表查询
执行顺序:
from(从那张表)-->
where(筛选有用的数据)-->
group by(进行分组)-->
having(再对分组后数据过滤)-->
select(查询出来)-->
order by(对查询结果排序)
-- 语句顺序不可以换,语法要求
⑤ select [distinct] *|column_1[Math|function] [as alias_1],...
-- distinct 关键字 代表不出现重复数据,只能出现在所有字段的最前方,但是可以出现在function中
-- *映射全部列,也可以单独映射某些列
-- 列后可以跟数学表达式或用函数包装列
-- as 后可以为当前列起一个别名,注意英文不能加单引号非英文加单引号包裹
① from table [as alias_1],...
-- as 后可以为当前表起一个别名,注意英文不能加单引号非英文加单引号包裹
② where conditon
-- 条件可以是关系运算符,注意等于是单个等号,<>等价于!=
-- and or not 与或非 可多条件连接,优先级是not>and>or
-- between ... and ... 两者之间,是闭区间即包括两端(若是字符左闭右开),注意一定要左小右大,否则会返回空
-- not between ... and ... 不在俩这之间
-- is null 是空条件,不能用=null,否则返回空
-- is not null 是非空,不能用<>null,否则返回空
-- in 等于集合中任意元素
-- not in 不等于集合中的所有元素
-- like 只能查字符类型,%表示0-*个字符,_表示1个字符,[模糊字段1,模糊字段2,..]表示或的关系
-- not like
③ group by column_1,...
-- 当sql语句中有group by的话,select后只能跟分组函数和参与分组的字段
-- 多个字段联合分组,就将多个字段看成一个字段
④ having conditon
-- 只有group by 后才能用having语句
-- 分组后过滤,一般都是对分组函数进行条件筛选,例sal(column)>xxx
⑥ order by column_1 [asc | desc],...
-- 默认升序,asc升序,desc降序
-- 多字段排序,越靠前的字段越起到主导作用
-- 列名也可以是数字,代表根据第几列字段排序
function
多行处理函数(分组函数/聚合函数)
特点:
- 分组函数输入多行,输出一行
- 分组函数在group by后执行,所以where语句后无法使用分组函数
- 对分组后的数据进行处理,若无group by 语句则默是一组
- 分组函数自动忽略空,有null参与的数学运算结果也是null
- 例
count(*)
是统计数据条目数而coubt(column)
会忽略为空的数据,固统计出的条目>=count(*)
- 例
类别:
- count 计数
- sum 求和
- avg 求平均
- max 最大值
- min 最小值
单行处理函数
- ifnull(column,default):若column是null当作default处理
- year(datetime):参数是date类型,返回年份
- now():返回当前日期和时间
- curdate():返回当前日期
- curtime():返回当前时间
连接查询
注意;不管使用什么连接都不会消除产生笛卡尔积,不能减少其匹配次数
以下是sql1999语法,sql92不建议用,因为结构不够清晰
虽然on字句后括号可以省略不写,建议写上,层次更加清晰
交叉连接
select * from table_1 [cross|inner] join table_2;
-- 在没有连接条件下inner也是交叉连接
-- cross或inner 可以省略不写,默认交叉连接
-- cross 和 inner 只可以写一个,否则语法错误
内连接
-
等值连接
select * from table_1 natural join table_2; -- 自然连接,自动找到同名字段采用内连接消除显示的笛卡尔积 select * from table_1 join table_2 using(column); -- 交叉连接后,使用column字段进行内连接关联 -- using会消除同名的列,也就是说关联字段只会留一个 select * from table_1 join table_2 on(table_1.id = table_2.id); -- 交叉连接后,使用on子句进行条件等值内连接 -- on子句不会去重同名列,两个关联字段会同时保留
-
非等值连接
select * from table_1 join table_2 on(table_1.grade between table_2.lograde and table_2.higrade); -- 非等值连接是连接条件非等条件 -- 非等值连接只能使用on来指定非等值条件 -- 一般用于对某个范围取某个值的这种连接
-
自链接
select * from table_1 join table on(table_1.stu = table_1.staff); -- 自连接就是将自己看成两张表,自身连接条件 -- 一般用于包含关系中,如学生包括班干部,员工包括领导...
外连接
-
左外连接
select * from table_main left [outer] join table_sub on(table_main.id = table_sub.id)|using(id); -- 左面的表为主表进行外连接 -- 外连接必须有管理条件,可以使用on子句,或using -- outer 可以省略
-
右外连接
select * from table_main right [outer] join table_sub on(table_main.id = table_sub.id)|using(id); -- 右面的表为主表进行外连接 -- 外连接必须有管理条件,可以使用on子句,或using -- outer 可以省略
-
全外连接
select * from table_main right full [outer] join table_sub on(table_main.id = table_sub.id)|using(id); -- 左右都为主表进行外连接 -- 外连接必须有管理条件,可以使用on子句,或using -- outer 可以省略
多连接
select *
from table_1 join table_2 on(condition)
join table_3 on(condition)
...
-- 可以是外连接也可以是内连接
-- 执行顺序是table_1连接table_2后的结果表再与table_3进行连接,依次类推
子查询
where子句中的子查询
-
子查询返回单行单列,即一个单元格
select * from table_1 where column>(select sal(column) from table_1); -- 由于where后不能直接使用分组函数,所以将子查询中的结果当作查询条件 -- where后的子查询,将子查询的单个结果当作筛选条件,进行筛选
-
子查询返回单行多列,即一行单元格
select * from table_1 where (column_1,column_2)=(select sal(column_1),sal(column_2) from table_1); -- 由于where后不能直接使用分组函数,所以将子查询中的结果当作查询条件 -- where后的子查询,将子查询的多个结果当作筛选条件,条件用逗号分隔,进行筛选 select * from table_1 where colum_1=(select sal(column_1) from table_1) and colum_2=(select sal(column_2) from table_1) -- 上面写法是此写法的简写
-
子查询返回多行单列,即一列单元格
select * from table_1 where column in (select column from table_2); -- 若返回结果是一个单列集合,则必须用集合筛选操作,in、not in、any、all,some与any功能相同 -- any:存在量词,存在一个,<any小于其中一个元素就跳出 -- all:全称量词,任意一个,<all小于其中所有元素,遍历所有元素 -- any 和 all 只能在子查询中出现 -- 注意not in返回null的情况
having子句中的子查询
使用规则与where子句一样,由于where效率高于having所以,在有统计函数且是子查询结果是单行单例时才用
from子句中的子查询
将子查询看作临时表即可,且必须指定别名
注意:在连接查询中也是产生临时表
集合操作
union(交集)
select ...
union [all]
select ...
union
...
-- 将两个查询结果并集
-- all省略情况下不会出现重复数据,若不省略会出现重复数据
-- 其中的查询语句字段数量必须一致
Comments NOTHING