DQL语句
SQL语言的DQL语句主要是select语句,用于对数据库中的表进行数据的检索、筛选和关联,是最基本也是最常见的一种操作。在这个过程中,单表查询和多表关联查询是两种常用的数据检索方式。
单表查询是指在SQL查询中只涉及一个表的查询操作,这种查询方式相对简单,适用于数据全部存储在单个表中的情况。多表关联查询则涉及多个表之间的数据关联和检索,在实际应用中,数据通常分布在多个相关联的表中,这时就需要使用多表关联查询来获取需要的数据。
SQL语言在不同的数据库管理系统中的使用略有差异,本文的示例均在MySQL数据库中实现。
单表查询
SQL语句中所有对数据表的查询操作都是基于当前数据库,若要对非当前数据库中的表进行操作,可以在数据表前使用数据库名加以限定,格式为:数据库名.数据表名。
语句格式
select 字段名1,字段名2,...
from 数据表
[where 条件]
[group by 分组字段 [having 条件]]
[order by 排序字段 [asc|desc]]
[limit 起始位置,返回数量]
语句详解
1、select 字段名1,字段名2,... from 数据表:查询数据表中指定字段的值或使用聚合函数对字段值进行统计计算,常用的聚合函数包括:
- count():字段值个数,count(*)表示记录数。
- max():字段最大值。
- min():字段最小值。
- avg():字段平均值。
- sum():字段值的和。
2、where 条件:查询符合条件的记录,条件表达式可包括以下运算符:
- 比较运算符:=(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。
- 逻辑运算符:and(与)、or(或)、not(非)。
- 模糊查询:like(字符串模糊查询)。
- 区间查询:between 区间起点 and 区间终点。
- 空值查询:is null(为空)、is not null(不为空)。
- 集合查询:in。
3、group by 分组字段 [having 条件]:按字段分组查询并使用条件过滤返回结果。
4、order by 排序字段 [asc|desc]:对查询结果进行排序。asc为升序,desc为降序。
5、limit 起始位置,返回数量:返回从起始位置开始的指定数量的记录。
使用示例
1、select 字段名1,字段名2,... from 数据表:查询数据表中指定字段的值,使用星号(*)可以查询所有字段的值。
1.1、select * from 数据表:查询数据表中的所有记录。

1.2、select 字段名1,字段名2,字段名3,... from 数据表:查询数据表中所有数据的指定字段值。

1.3、SQL聚合函数的使用。
1.3.1、count():统计字段值的个数。

1.3.2、max():最大的字段值。

2、where 条件:查询符合条件的所有记录。
2.1、条件运算符。
2.1.1、=(等于)、!=(不等于)。

- 查询所有sex值为'男'的记录。
2.1.2、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。

- 查询所有birthday值大于'2005−01−01'的记录。
2.2、逻辑运算符。
2.2.1、and(与):and两边的表达式都成立时最终结果成立,否则不成立。

- 查询所有birthday值大于等于'2003−01−01'且小于等于'2005−12−31'的记录。
2.2.2、or(或):or两边的表达式都有一个成立时最终结果成立,否则不成立。

- 查询所有birthday值小于'2003−01−01'或大于'2005−12−31'的记录。
2.2.3、not(非):not是对后面表达式的否定,后面表达式成立时最终结果不成立,反之后面表达式不成立时最终结果成立。

- 查询所有sex值不等于'男'的记录。
2.3、like(字符串模糊查询):表达式中的通配符(%)代表一串字符。

- 查询所有username值以'li'开头的记录。
2.4、between 区间起点 and 区间终点:查询字段值在某一个区间的所有记录。

- 查询所有birthday在'2003−01−01'至'2005−12−31'之间的所有记录。
2.5、in:查询字段值在指定值集合中的所有记录。

- 查询username为'lisi','liwu'或'liliu'的所有记录。用逻辑运算符or可以实现同样效果。
3、group by 分组字段 [having 条件]:按指定字段进行分组查询,通常用于分组统计,最终结果可使用having进行条件过滤。
3.1、分组查询:按字段值进行分组查询。

- 按sex值分组查询记录数量。count(*)为聚合函数,返回记录条数。
3.2、条件过滤:对分组查询结果进行过滤输出。

- 按sex值分组查询记录数量,只输出sex值为'男'的结果。
4、order by 排序字段 [asc|desc]:对返回结果按指定字段排序,asc为升序,desc为降序,默认为升序。

- 查询结果按birthday值降序排列。
5、limit 起始位置,返回数量:返回从起始位置开始的指定数量的记录,起始位置从0开始。

- 查询结果按birthday值降序排列,并且只返回前5条。
多表查询
SQL提供了多种关联查询方式可以从多个库的多个表中查询数据,并能根据表之间的关系组合来自多个表的数据。若要查询的表是非当前数据库中的表,需要在数据表前使用数据库名加以限定,格式为:数据库名.数据表名。
语句格式
select 字段名1,字段名2,...
from 数据表1
[inner | left | right] join 数据表2
on 连接条件
语句详解
1、SQL中常见的关联查询类型包括:
- 内连接(INNER JOIN):返回两个或多个表都存在且条件匹配的行。
- 左外连接(LEFT [OUTER] JOIN):返回左表的所有行(右表中没有匹配的行也返回)。
- 右外连接(RIGHT [OUTER] JOIN):返回右表的所有行(左表中没有匹配的行也返回)。
使用示例
1、示例表格。
1.1、角色表role,rid为主键。

1.2、用户表user,其中字段rid为外键,引用角色表role的主键rid。

2、连接查询。
2.1、内连接:一个表中的主键(外键)值与另一个表的外键(主键)值有对应关系时才出现在最终的查询结果中。
2.1.1、select 字段名1,字段名2,... from 数据表1,数据表2 where 连接条件:隐式内连接。

- 角色表role中无rid为5的角色,所以在最终结果中,user表rid为5的用户不会出现在查询结果中。
2.1.2、select 字段名1,字段名2,... from 数据表1 [inner] join 数据表2 on 连接条件:显式内连接。

2.2、外连接:一个表中的主键(外键)值与另一个表的外键(主键)值没有对应关系时使用空值null填充。
2.2.1、select 字段名1,字段名2,... from 数据表1 left join 数据表2 on 连接条件:左连接,左表(数据表1)中的所有记录都会出现在查询结果中。

- 结果包含左表user的所有数据,因为角色表role中无rid为5的角色,所以在最终结果中,user表rid为5的用户角色名称使用null填充。
2.2.2、select 字段名1,字段名2,... from 数据表1 right join 数据表2 on 连接条件:右连接,右表(数据表2)中的所有记录都会出现在查询结果中。

- 结果包含右表role的所有数据,因为用户表user中无rid为4的用户,所以在最终结果中,role表rid为4的用户信息使用null填充。