03-DQL

nobility 发布于 2020-05-19 1361 次阅读


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 likegroup by column_1,...
-- 当sql语句中有group by的话,select后只能跟分组函数和参与分组的字段
-- 多个字段联合分组,就将多个字段看成一个字段having conditon
-- 只有group by 后才能用having语句
-- 分组后过滤,一般都是对分组函数进行条件筛选,例sal(column)>xxxorder 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省略情况下不会出现重复数据,若不省略会出现重复数据
-- 其中的查询语句字段数量必须一致
此作者没有提供个人介绍
最后更新于 2020-05-19