DQL数据查询语言
查询的基本结构:
是数据库中最为常用和复杂的一种SQL结构,它也是数据库用最关注的部分。数据库的查询是使用select语句来实现查询的。
SQL中的查询语句只有一个:SELECT,它可与其他语句配合完成所有的查询功能。select语句的完成语法,可以有六个子句语法如下:
SELECT 目标表的列名或列表达式集合
FROM基本表或(和)视图集合
[WHERE 条件表达式]
[GROUP BY 列名集合]
[HAVING 组条件表达式]
[ORDER BY 列名[集合]]
[LIMIT ]
投影操作
是查询语句里必须有的子句,关键字则为SELECT,它将选择对表中哪些列进行操作,这些列将出现在结果中。
标准结构:先执行from 再执行select
select 列1,列2,......列N from 表名
表前缀:表名.列名/表别名.列名(可以规避列名相同的情况)
select t_student.name from t_student;
如果是代表所有信息用“*”表示
通过AS给表设置别名 简便写法,将AS改为空格
SELECT s_name as stuName,s_address as stuAddr,s_tel as stuTel from t_student as s;
计算列
返回计算列意味着数据不存在于数据库中,但是可以从数据库中的数据构造或者计算得来。
1.可以直接对数据进行加减乘除等运算
2.CONCAT 字符串拼接函数
select CONCAT(t_student.name,"同学") from t_student;
条件查询
where子句应用搜索条件于SELECT查询获得的数据,搜索条件可以采用不同的形式,但是条件的值都是布尔值。
单条件查询:
标准结构:
select 列1,列2,......列N
from 表名
where 列=值
=、 !=、 >、 < 、>=、 <=
多条件查询:
标准结构:(and/or)
select 列1,列2,......列N
from 表名
where 列1=值1 and 列2=值2
范围查询
列名 between 下限 and 上线
模糊查询
like
标准结构:
select 列1,列2 from 表 where 列3 like 模式
通配符:
- “_”通配符,匹配任何单个字符
- “%”,匹配零个或任意多个字符
示例:
-- 查询姓张的学生信息
SELECT * FROM t_student
WHERE s_name LIKE "张%";
-- 查询名字里含张的同学
SELECT * FROM t_student
WHERE s_name LIKE "%张%" ;
-- 查询姓名为null的学生
-- 判断空不能使用=或!= 要使用 is (not) null
SELECT * FROM t_student
WHERE s_name IS NULL ;
去重
去重 distinct
去重后,重复数据仅显示一条
--查看员工所在的所有城市
SELECT DISTINCT f_city FROM t_employee;
返回限定行
返回限定行
标准结构:select 列名1,列名2,列n from 表名 limit 开始序列号(从0开始),返回行数
limit、仅限mysql使用
如果从0开始,则开始序列号可以省略不写
如果表格剩余行数不足,那么我就只会返回剩余的行数。比如 表格只有80行,写的(0,100)那么只返回80行
-- 返回11-15行的数据
SELECT * from t_employee LIMIT 10,5;
-- 返回0-5行的数据
SELECT * from t_employee LIMIT 5;
定义集合关系
可以从定义的集合中进行搜索,此时不能使用=/!=/>/</>=?<= ,需要使用in(属于)not in(不属于)
标准结构:
-- 查询 技术部或销售部的员工
-- 利用集合
SELECT * FROM t_employee WHERE f_deptName IN ("技术部","销售部");
排序
order by
对查询数据按照指定列进行排序
默认为升序(asc) 降序(desc)
-- order by 列名
-- 按员工工资降序排列
select * from t_employee order by f_money desc
-- 按员工工资和入职时间排序
-- 先对工资进行降序,如果工资相同,以入职时间升序
select * from t_employee order by f_money desc,f_indate;
mysql时间函数
1.now() 当前年月日 时分秒
2.curdate() 当前年月日
3.date_add(@dt,interval 100 day) 得到一百天以后的日期
4.year(@dt) 得到指定事件的年份
5.timestampdiff(day,@dt1,@dt2) 得到两个日期之间的时间间隔
-- now 查询现在的时间(年月日时分秒)
select now();
-- curdate 查询当前时间(年月日)
select curdate();
-- year(日期) 得到指定日期的年份
select year("2020-03-02");
-- date_add(@dt,interval 间隔 单位(year/month/day))
select date_add("2022-12-22",interval 100 day);
-- 两个日期之间的间隔
-- TIMESTAMPDIFF(单位,小时间,大时间)
select timestampdiff(DAY,"2022-12-22",NOW());-- 126天
条件判断语句
if(条件,结果为真,结果为假) 类比三目运算符
-- 对员工的工资进行分类显示,大于等于6000 高工资,小于6000 低工资
select *,if(f_money > 6000,"高工资","低工资") info from t_employee
case-when语句 类比于if-else-if
结构:
– case
– when 条件1 then 数据1
– when 条件2 then 数据2
– … …
– when 条件n then 数据n
– else 数据n
– end
-- 按照工资分类显示
-- 工资小于等于5000 显示低工资
-- 工资大于5000 小于等于8000 中等工资
-- 工资大于8000 小于等于10000 显示较高工资
-- 工资大于10000 显示高工资
select *,case
when f_money <= 5000 then "低工资"
when f_money <= 8000 then "中等工资"
when f_money <= 10000 then "较高工资"
else "高工资" end info from t_employee;
-- 根据部门的不同进行不同的工资涨幅
-- 技术部+500
-- 开发部+800
-- 广告部+200
-- 剩下+100
update t_employee set f_money=f_money+
case when f_deptName ="技术部" then 500
when f_deptName = "开发部" then 800
when f_deptName ="广告部" then 200
else 100 end
聚合函数
count() 统计某列数据的行数
计算规范: *:匹配所有行数,包含空行 all 列名 匹配非空行 distinct 列名 匹配非空行后去重
-- 统计所有行数
select count(*) from t_employee;
-- 统计非空行
select count(all f_money) from t_employee;
-- 统计非空行并去重
select count(distinct f_money) from t_employee;
sum() 统计和 计算规范只有all和distinct
avg() 平均值
max() 最大值
min() 最小值
分组查询
所谓的分组就是将指定规则中相同的数据进行“小区域”(组)的划分
Group by 子句
按照制定规则进行分组,分组之后相当于把表格划分为多个小的表格,然后聚合函数就应用在多个小表格上。
分组时可以进行多列分组,在多列分组时,只有多列数据都相同时才会被分到一个组
例子:按照部门以及性别分组,只有部门和性别相同才会被分到同一组
-- 统计显示每个部门工资大于等于7000的员工数
SELECT f_deptName, count(*) as emNum from t_employee where f_money>=8000 group by f_deptName;
-- 按照部门以及性别分组
SELECT f_deptName, f_gender, count(*) as emNum from t_employee where f_money>=8000 group by f_deptName,f_gender;
分组语句对投影列的限制
1.分组列(group by后的列名)
2.聚合函数列
having子句
聚合(group by)后的分组进行筛选要用having
聚合函数在分组后再执行,分组又是在过滤条件后(where)后执行
where 和 having的区别
1、where运行在分组前,因此不能执行任何聚合函数。
2、having是运行在分组后,只能用做聚合函数的过滤
基本查询SQL的执行顺序
后执行的子句可以使用前置性语句的计算结果、定义的别名等。
基本查询SQL的执行顺序为:
1、执行from
2、where条件过滤
3、group by 分组
4、执行select投影列
5、having条件过滤
6、执行order by排序
7、执行limit语句,返回限定行