DQL 数据查询语句
查询结构:
select 目标表的列名或列表达式集合 from基本表或(和)视图集合 【where 条件表达式】 【group by 列名集合】 【having 组条件表达式】 【order by 列名【集合】】
注意 Where,GroupBy,Having,OrderBy 顺序
1.投影操作
投影操作是查询语句里必须有的,关键字是select.
select 列1 from 表名
select 列1,列2,列3 from 表名
select * from 表名 -- 全部查询
怎么寻找到的?
先去找表,执行form后面,然后找到该表的列名
2.表前缀.列名.别名查询
select 表名.列名 from 表名
别名可以直接写中文,可以不用双引号或者单引号
第二种
别名就是为了在输出看结果的时候,改变列名,便于观察,不会改名表的列名。
select 表名.列名 as 别名 from 表名
select t_student_table.t_name from t_student_table
select t.t_name as name from t_student_table as t
这里 t.t_name 是用的表名的别名t ,在跟上列名t_name
还可以空格+别名 ,这样可以省略as
select t.t_name name from t_student_table t
select 别名.列名 as 别名 from 表名 as 别名,使用表别名的时候,原表的表名就不能再使用
select t_student_table.t_name from t_student_table as t -- 这里的表名暂时变成t了, t_student_table.列名就找不到了。 -- 注意执行顺序是先执行from,在执行select
3.计算列
在数据库管理中,我们可以
select t.t_class*10 from t_student_table as t
我们可以在返回t_class列的数据是可以计算,不影响原来的表中的值。
select concat(t.t_class*10,"班") class from t_student_table as t
concat关键字是字符串拼接函数,得到的数据是乘10后的多少班,比如10班,20班
4.去重 (distinct)
select distinct f_city from t_employee; -- 查找员工都来自什么城市 -- 去掉重复的数据,查出不同的城市
5.条件查询
where子句应用搜索条件在select查询获得的数据之后。但是条件值都是布尔值。
类别 | 运算符 | 说明 |
---|---|---|
比较运算符 | =,<,>,<=,>=,<> | 比较两个表达式 |
逻辑运算符 | AND ,OR, NOT | 组合两个表达式的运算结果或取反 |
范围运算符 | BETWEEN,NOT BETWEEN | 搜索值是否在范围内 |
列表运算符 | IN,NOT IN | 查询值是否属于列表值之一 |
字符匹配符 | LIKE ,NOT LIKE | 字符串是否匹配 |
未知值 | IS NULL ,IS NOT NULL | 查询值是否为NULL |
比较运算符 | 说明 |
---|---|
= | 等于 |
<,> | 大于 小于 |
,<=,>= | 大于等于 小于等于 |
<> |
逻辑运算符 | 说明 |
---|---|
AND | 并且(都要成立) |
OR | 或者(成立其一就可以) |
NOT | 取反 |
范围运算符 | 说明 |
---|---|
BETWEEN 下限 and 上限 | 在这个范围 |
NOTBETWEEN 下限 and上限 | 不在这个范围 |
列表运算符 | 说明 |
---|---|
IN | 属于这个类型 |
NOT IN | 不属于属于这个类型 |
字符匹配符 | 说明 |
---|---|
LIKE | 字符串匹配 |
NOT LIKE | 字符串不匹配 |
select 列1, 列2 from 表名 where 列c like 模式
通配符:
“ _”:匹配任何字符
“%”:匹配0或者任意个数的字符
“[]”:匹配单个字符 eg: H[ea]% Have Hand
"[^]":不在指定范围的单个字符
eg:Hea% Hope,Hub
未知值 | 说明 |
---|---|
IS NULL | 查询值是NULL |
IS NOT NULL | 查询值不是NULL |
判断是否为空时,不能用=,is null 或 is not null |
6.limit查询
select 列1,列2... from 表面 limit 开始序列号,返回行数 -- 注意开始序列号是从0开始,仅在mysql使用。 -- 如果是从0开始,也就是第一条开始,那么可以写成 limit 返回行数
select 列1,列2,列3...列n from t_employee limit 开始序列, 结束序列; -- 列如 select * from t_employee limit 5,4; -- 从第6列开始,查询以下4条信息 -- 缩写格式:limit n = limit 0, n;
7.in查询
-- 定义集合关系,在指定的某几个值进行查询,不能使用运算符
-- 查询技术部/销售部员工,可以用定义结合
-- in(值1,值2...)查看int里面的值
not int(值1,值2...)查看除了int里的值
-- 查看职位是"舔狗部","女神部","保安部"的员工信息 select * from t_employee where f_deptName in ("舔狗部","女神部","保安部"); -- 查看除了职位是"舔狗部", "女神部","保安部"的员工信息 select * from t_employee where f_deptName not in("舔狗部","女神部","保安部");
8.order by
排序操作,指查询出来的结果投影出来以后哪一列的顺序进行排序
-- order by 默认情况下升序(ASC),降序(desc)
select * from t_employee order by f_money desc ; -- 按照工资的从大道小排序(desc)
-- 多列排序时,首先以列1排序,而且只有当列1相同时,才会以列2规则排序,依次类推
-- 多列排序时,列1写order by ,后面的多列只需要列名即可。
select * from t_employee order by f_money desc , f_birthday; -- 按工资排序从大到小(desc)时, 当工资相同的时候,在按照生日的从小到大排序。
9.mysql的时间函数
-- now() 得到当前时间的年月日 时分秒
-- curdate() 得到当前时间的年月日
-- date_add(@dt,interval 数值 时间) 得到指定时间数值后的以后日期
-- timestampdiff(时间,@dt1,@dt2) @dt1与@dt2之间相差多少时间
-- year(@dt) 得到指定的时间年份
-now();
获得当前的 年月日 时分秒
select now(); -- 当前的时间 2023-04-27 14:03:45
curdate();
获得当前的 年月日
select curdate(); -- 当前的时间 2023-04-27
yaer();
得到指定日期的年份 select year(now()); 2023(今年)
select year(now()); -- 2023(今年) select year(2000-3-3); -- 得到 2000,只得到年份
month()
SELECT MONTH("2000-2-2") -- 获得某一年份的月份,只得到月份
date_add
date_add(@dt,interval 数值 时间);
-- 获取指定日期多少时间间隔后的日期, @dt为指定日期,数值是你的时间, 时间是以哪种方式计算 select date_add (now(),interval 20 year); -- 得到当前时间20年以后 select date_add (now(),interval 20 day); -- 得到当前时间的20天以后 select date_add (now(),interval 3month); -- 得到当前时间的3个月以后
timestampdiff
timestampdiff(时间,@dt1,@dt2)
select timestampdif (day,"2022-3-3",now()); -- 2022-3-3到现在相差多少天 select timestampdiff (year,"1998-4-3",now()); -- 1998-4-3到现在相差多少年 -- 查询员工的同时查出他的年龄 (原来列中并没有age列), 所以我们需要他的生日-当前时间 select * timestampdiff (year,f_birthday,now()) age from t_employee ;
10.条件判断语句(if与case when)
1.if判断语句
-- mysql 允许调查结果的不同,返回不同的内容
-- if语句类似于三目运算符,条件为真返回第一个,为假返回第二个
select *,if (f_money>2000,"合格","不合格") moneyNotOrNo from t_employee
2.case when 判断语句
多分支采用case when
-- case when 条件1 then 数据1
-- when 条件2 then 数据2
-- when 条件3 then 数据3
-- ...
-- else 数据n
end
---------在书写的时候,先写case与end,只有当条件满足的时候,才会执行then后面的数据,同时注意多分支的时候别忘了else保底。
-- 加工资 update t_employee set f_money= f_money+(case when f_deptName="管理部" then 500 when f_deptName="开发部" then 300 when f_deptName="成品课" then 200 else 100 end );
11.聚合函数
-- count() 统计数量
-- sum() 获取单个列的合计值
-- avg() 获取单个列的平均值
-- max() 获取单个列的最大值
-- min() 获取单个列的最小值
-- count() 函数
来计算表中记录的个数或者列中值的个数
-- * 统计所以行,包括空行(null)
-- all 列名 统计所以非空行数 默认情况直接写列名,不写all
-- distinct 列名 统计所以非空且不重复的行数
select count(*) from t_employee ; -- 统计所以的行 select count(f_money) from t_employee; -- 统计所得的非空行 select count(distinct f_money) from t_employee; -- 统计所以非空行数且不重复的和
-- sum()函数
获取单个列的合计值
-- all 列名 统计所以非空行数的和 默认情况直接写列名,不写all
-- distinct 列名 统计所以非空且不重复的行数的和
select sum(f_money) from t_employee; -- 统计所以工资的非空行数的和 select sum(distinct f_money) from t_employee; -- 统计所以工资的非空行数且不重复的和
-- avg()函数
获取单个列的平均值
-- all 列名 统计所以非空行数和的平均值 默认情况直接写列名,不写all
-- distinct 列名 统计所以非空且不重复的行数和的平均值
select avg(f_money) from t_employee; -- 这里的平均值没有算空行。 select avg(distinct f_money) from t_employee; -- 这里的平均值没有算空行和重复。 select sum(f_money)/count(*) from t_employee; -- 平均工资算了空行和重复数据
max() 与min()
-- max(列名) 获取单个列的最大值
-- min(列名) 获取单个列的最小值
select max(f_money),min(f_money) from t_employee;
13.分组查询(Group by)
-- mysql 提供了一种
-- group by 语句是根据by 指定的规则对数据进行分组。
select 列A 聚合函数(聚合函数规范) from 表名 where 过滤条件 group by 列A; -- 根据规则分组,会把规则相同的数据分到一组 -- 多规则分组时,多条规则都相同才会分到一组 -- 例:按照部门和性别分组 销售部和女 销售部和男 select f_deptName , t_gender, count(*) emdu from t_employee group by f_deptName, t_gender;
分组列的限制
-- 1.分组列(group by),也就是group by出现的语句,也就是只能分出group by出现的语句
-- 2.聚合函数列
having 语句
-- 用于在聚合后进行筛选。因为聚合函数在分组后执行,而分组又在过滤条件(where)之后执行
-- 只有通过where语句在能分组,所以having语句是在分组之后进行过滤
where与 having 的区别
-- where运行在分组之前,不能执行任何聚合函数 -- having 是运行在分组之后,只能用于聚合函数的过滤
SQL语句的执行顺序
非常重要
--SQL语句的执行顺序(后执行的子句,可以使用前执行的子句中的计算结果、定义的别名等)
--第一步 先执行 from
-- 第二步 where的条件过滤
-- 第三步 group by 分组
-- 第四步 执行select的投影列
-- 第五步 having的条件过滤
-- 第六步 执行order by 排序
-- 第七步 执行limit语句 返回限定值