DQL语言
基础查询
1. 语法
select 查询列表
from 表名;
2. 特点
① 查询列表可以是字段、常量、表达式、函数,也可以是多个的组合
② 查询结果是一个虚拟的表
3. 示例
-
查询单个字段
select 字段名 from 表名;
-
查询多个字段
select 字段名,字段名 from 表名;
-
查询所有字段
select * from 表名;
-
查询常量
select 常量值;
注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要
-
查询函数
select 函数名(参数列表);
-
查询表达式
select 100/10;
-
别名
① as
②空格
-
去重
select distinct 字段名 from 表名;
select distinct 字段名,字段名 from 表名;(两个字段都重复才能去重)
-
符号+
作用:加法运算
select 数值+数值;--直接运算
select 字符+数值;--将字符转换为数值进行计算,若转换不成功则将字符转换为0
select null+值;--结果都为null
-
concat函数
功能:拼接字符
select concat(字符1,字符2,字符3...);
-
ifnull函数
功能:判断某字段或表达式是否为null,如果为null,返回指定的值,否则返回原本的值
select ifnull(commission_pct,0) from employees;
-
isnull函数
功能:判断某字段或表达式是否为null,如果为null返回1,反之返回0
条件查询
1. 语法
select 查询列表
from 表名
where 筛选条件;
2. 分类
-
简单条件运算符
< > = != or <> <= >=
-
逻辑运算符
&& || !
and or not -
模糊查询
like关键字,一般和通配符搭配使用
通配符:
%:任意多个字符,包含0个字符
_:任意单个字符between and关键字
in关键字
is null关键字
安全等于 <=>
排序查询
1. 语法
select 查询列表
from 表名
where 筛选条件
order by 排序列表【asc|desc】
2. 特点
-
asc:升序,默认为升序
desc:降序
-
排序列表支持单个字段、多个字段、函数、表达式、别名
-
order by的位置一般放在查询语句的最后(除limit语句之外)
常见函数
1. 概述
功能:类似于Java中的方法
优点:提高重用性、隐藏实现细节
调用:select 函数名(参数列表)
2. 单行函数
-
字符函数
concat:连接字符串
length:获取字符串的长度
substr:截取字符串
instr:获取子串第一次出现的索引
upper:转换为大写
lower:转换为小写
replace:替换
trim:去除前后空格
lpad:左填充
rpad:右填充
-
数学函数
ceil:向上取整
floor:向下取整
round:四舍五入
mod:取模
truncate:截断
rand:获取0-1区间(左闭右开)的随机数
-
日期函数
now:返回当前日期+时间
curdate:返回当前日期
curtime:返回当前时间
year:返回年
month:返回月
monthname:以英文姓氏返回月
day:返回日
hour:返回小时
minute:返回分钟
second:返回秒
str_to_date:将字符转换为日期
date_format:将日期转换为字符
datediff:返回两个日期之间相差的天数
-
其他函数
version:当前数据库服务器的版本
datebase:当前打开的数据库
user:当前用户
password('字符串'):返回该字符的加密结果
md5('字符串'):返回该字符以md5形式加密的结果
-
流程控制函数
-
if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1,否则返回表达式2
-
case情况一:
case 要判断的字段或表达式
when 常量1 then 要显示的值1或 语句1;
when 常量2 then 要显示的值2或 语句2;
...
else 要显示的值n或 语句n;
end情况二:
case
when 条件1 then 要显示的值1或 语句1;
when 条件2 then 要显示的值2或 语句2;
...
else 要显示的值n或 语句n;
end
-
3. 分组函数
-
分类
max:最大值
min:最小值
sum:和
avg:平均值
count:计算个数
-
特点
语法:
select max(字段) from 表名;
支持的类型:
sum和avg一般处理数值型
max、min、count可以处理任意类型
以上分组函数均忽略null,均可搭配distinct使用,实现去重的统计
分组查询
1. 语法
select 分组函数,分组后的字段
from 表
【where 筛选条件】
group by 分组的字段
【having 分组后的筛选】
【order by 排序列表】
2. 特点
使用关键字 筛选的表 位置
分组前筛选 where 原始表 group by的前面
分组后筛选 having 分组后的结果 group by的后面
连接查询
1. 含义
当查询中涉及到了多个表的字段,需使用多表连接
select 字段1,字段2
from 表1,表2
笛卡尔乘积现象:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接
解决:添加有效的连接条件
2. 分类
按年代分类:
SQL92:
等值
非等值
自连接
支持一部分外连接(用于oracle、sqlserver,mysql不支持)
SQL99:(推荐使用)
内连接
等值
非等值
自连接
外连接
左外连接
右外连接
全外连接(mysql不支持)
交叉连接
3. SQL92语法
-
等值连接
语法:
select 查询列表
from 表1 别名,表2 别名
where 表1.key=表2.key
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
特点:
① 一般需要为表起别名
② 多表的顺序可以调换
③ n表连接至少需要n-1个连接条件
④ 等值连接的结果是多表的交集部分
-
非等值连接
语法:
select 查询列表
from 表1 别名,表2 别名
where 非等值的连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
-
自连接
语法:
select 查询列表
from 表 别名1,表 别名2
where 等值的连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
4. SQL99语法
-
内连接
语法:
select 查询列表
from 表1 别名
【inner】 join 表2 别名
on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 偏移,条目数;
特点:
- 表的顺序可以调换
- 内连接的结果=多表的交集
- n表的连接至少需要n-1个连接条件
分类:
等值连接
非等值连接
自连接
-
外连接
语法:
select 查询列表
from 表1 别名
left | right | full【outer】 join 表2 别名
on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 偏移,条目数;
特点:
- 查询的结果=主表中所有的行,其中从表和主表匹配的将显示匹配行,不匹配则显示为null
- left join左边为主表,right join右边为主表,full join两边都是主表
- 一般用于查询除了交集部分的剩余的不匹配行
-
交叉连接
语法:
select 查询列表
from 表1 别名
cross join 表2 别名;
特点:
显示结果为两表的笛卡尔乘积
子查询
1. 含义
嵌套在其他语句内部的select语句称为子查询或内查询,外面的语句可以是insert、update、delete、select等,select居多。
外面的语句若为select语句,则此语句称为外查询或主查询
2. 分类
-
按出现位置
select后面
仅支持标量子查询
from后面
表子查询
where或having后面
标量子查询
列子查询
行子查询
exists后面
标量子查询
列子查询
行子查询
表子查询
-
按结果集的行列
标量子查询(单行子查询):结果集为一行一列
列子查询(多行子查询):结果集为多行一列
行子查询:结果集为多行多列
表子查询:结果集为多行多列
3. 示例
where或having后面
-
标量子查询
查询最低工资的员工姓名和工资
①查询最低工资
select min(salary) from employees
②查询员工的姓名和工资,要求工资=①
select last_name,salary
from employees
where salary=(
select min(salary)
from employees
);
-
列子查询
查询所有是领导的员工的姓名
①查询所有员工的manager_id
select manager_id
from employees
②查询姓名,employee_id属于①表中的一个
select last_name
from employees
where employee_id in (
select manager_id
from employees
);
分页查询
1. 应用场景
当要查询的条目数太多,一页显示不全
2. 语法
select 查询列表
from 表
limit 【offset,】 size;
注意:
offset代表的是起始的条目索引,默认从0开始;
size代表的是显示的条目数
公式:
假如要显示的页数为page,每一页的条目数为size
select 查询列表
from 表
limit (page-1)*sizesize;
联合查询
1. 含义
union:合并、联合,将多次查询结果合并成一个结果
2. 语法
查询语句1
union 【all】
查询语句2
union 【all】
...
3. 意义
- 将一条比较复杂的查询语句拆分成多条语句
- 适用于查询多个表的时候,查询的列基本是一致的
4. 特点
- 要求多条查询语句的查询列数必须一致
- 要求多条查询语句的查询的各列类型、顺序最好一致
- union去重,union all 包含重复项
总结
语法: 执行顺序
select 查询列表 ⑦
from 表1 别名 ①
连接类型 join 表2 别名 ②
on 连接条件 ③
where 筛选 ④
group by 分组列表 ⑤
having 筛选 ⑥
order by 排序列表 ⑧
limit 起始条目索引,条目数; ⑨