DQL数据查询语言常用版

DQL数据查询语言

查询的基本结构

是数据库中最为常用和复杂的一种SQL结构,它也是数据库用最关注的部分。数据库的查询是使用select语句来实现查询的。

SQL中的查询语句只有一个:SELECT,它可与其他语句配合完成所有的查询功能。select语句的完成语法,可以有六个子句语法如下:

SELECT 目标表的列名或列表达式集合
	FROM基本表或(和)视图集合
	[WHERE 条件表达式]
	[GROUP BY 列名集合]
	[HAVING 组条件表达式]
	[ORDER BY 列名[集合]]
	[LIMIT ]

投影操作

是查询语句里必须有的子句,关键字则为SELECT,它将选择对表中哪些列进行操作,这些列将出现在结果中。

标准结构:先执行from 再执行select

select1,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查询获得的数据,搜索条件可以采用不同的形式,但是条件的值都是布尔值。

单条件查询:

标准结构:

select1,2,......列N 
from 表名 
where=

=、 !=、 >、 < 、>=、 <=

多条件查询:

标准结构:(and/or)

select1,2,......列N 
from 表名 
where1=1 and2=2

范围查询

列名 between 下限 and 上线

模糊查询

like

标准结构:

select1,2 fromwhere3 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语句,返回限定行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值