三、DQL语言
目录
一、基础查询
(一)语法
select 查询列表 from 表名;
(二)特点
- 查询列表可以是字段、常量、表达式、函数,也可以是多个
- 查询结果是虚拟的表
(三)示例
- 查询单个字段
- select 字段名 from 表名;
- 查询多个字段
- select 字段名, 字段名 from 表名;
- 查询所有字段
- select * from 表名;
- 查询常量
- select 100 + 90;
- 查询函数
- select 函数名();
- 查询表达式
- select 1000 / 102;
- 起别名
- as 关键字,比如:select user_id as "用户编号" from user_info;
- 空格 比如:select user_id "用户编号" from user_info;
- 去重
- select distinct 字段名 from 表名;
- "+"号的含义
- 作用就是:做加法运算
- select 数值+数值; 直接运算
- select 字符+数值; 先试图将字符转换为数值,如果转换成功,则继续运算;否则转换成"0",再运算
- select null + "任意值"; 结果都为 null
- 作用就是:做加法运算
concat() 函数
- select concat(字符1, 字符2, 字符3 )
二、条件查询
(一)语法
select 字段 from 表名 where 筛选条件;
如果条件不成立,数据不会显示
(二)筛选条件的分类
简单条件的运算符
- >, <, =, <>, <=>, !=, <=, >=
逻辑运算符
- &&(and), ||(or), !(not)
模糊查询
like
- 一般搭配通配符使用("%", "_"),可以判断字符型数值或者数值型
- %:任意多个字符
- _:任意单个字符
between and,
in, not in,
is null, is not null
is null 和 <=> 区别
普通类型数值 | null值 | 可读性 | |
---|---|---|---|
is null | × | √ | √ |
<=> | √ | √ | × |
三、排序查询
(一)语法
select 字段 from 表名 where 条件 order by 排序列表【asc/desc】(默认 asc排序)
(二)特点
- asc代表的是升序,desc代表的是降序,如果不写,默认是升序
- order by子句中可以支持单个字段、多个字段、表达式、函数、别名
- order by一般放在查询语句最后面,如果有 limit 的话,limit 在最后面
四、常见函数
(一)介绍
概念:类似于 编程语言 中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
好处
- 隐藏了实现细节
- 提高了代码复用性
调用
- select 函数名(实参) from 表名;
- select 函数名();
(二)分类
单行函数
- 如:concat(), length(), is null 等等
分组函数
- 功能:做统计使用,又称为统计函数、聚合函数、组函数
五、单行函数
(一)字符函数
length()
- select length("hello")
- 获取参数值的字节个数
concat()
- 拼接字符
- select concat("a", "b", "c");
upper()、lower()
- 转为大写、小写
substr(索引从“1”开始)
- 切割字符
instr(返回字符第一次出现的索引)
trim(去前后空格)
- select trim('a' from 'aaaaaaaMaaaaYaaaSQLaaaa'); 结果为:MaaaaYaaaSQL
lpad(左填充指定长度的)
- select lpad('哈哈哈', 10, ''); 结果:哈哈哈
rpad(右填充指定长度的)
- select rpad('哈哈哈', 10, ''); 结果:哈哈哈
replace(替换字符)
- select replace('哈嘿嘻', '嘻', ''); 结果:哈嘿
(二)数学函数
round(四舍五入)
- select round(1.65); 结果:2
- select round(1.65547, 2); 结果:1.66
ceil(向上取整,返回 >= 该参数最小整数)
- select ceil(1.001); 结果:2
- select ceil(1.000); 结果:1
floor(向下取整,返回 <= 该参数最大整数)
- select floor(1.2154); 结果 1
- select floor(-9.99); 结果 -10
truncate(截断,小数点后保留几位)
- select truncate(1.65, 1); 结果:1.6
mod(取余,取余公式:a-a/b*b)
- select mod(10, 3); 结果:1
rand(随机数)
- select rand();
(三)日期函数
now(返回当前系统日期+时间)
- select now(); 结果:2019-08-21 23:19:52
curdate(返回当前日期,不包含时间)
- select curdate(); 结果:2019-08-21
curtime(返回当前时间,不包含日期)
- select curtime(); 结果:23:22:37
year、month(获取指定部分,年、月、日、时、分、秒)
- select year(now()); 结果:2019
- select month(now()); 结果:8
str_to_date(将字符通过指定的格式转换成日期)
- select str_to_date('2018-8-1', '%Y-%m-%d'); 结果:2018-08-01
date_format(将日期转换成字符)
- select date_format('2018/06/01', '%Y-%m-%d'); 结果:2018-06-01
datediff(日期查计算)
select datediff('2019-08-23', '2019-08-10'); 结果:13
(四)其他函数
version(查看数据库版本号)
- select version(); 结果:5.7.26
database(查看当前数据库)
- select database(); 结果:test
user(代表当前用户)
- select user(); 结果:root@localhost
(五)流程控制函数
if函数
- select if(10 > 5,'大','小'); 结果:大
case函数
- case 要判断的字段或表达式 when 常量值1 then 要显示的值或语句; when 常量2 then 要显示的值或语句; else 要显示的值或者语句;
- select (case a.id when 5 then '等于5' else '不等于5' end) as id from (select 10 as id) a
- select (case when a.id > 5 then '大于5' when a.id < 5 then '小于5' else '未知' end) as id from (select 10 as id) a
六、分组函数
(一)分类
- sum 求和
- avg 平均值
- max 最大值
- min 最小值
- count 计算个数
(二)简单使用
sum(求和)
- select sum(字段) from 表名;
avg(平均值)
- select avg (字段) from 表名;
max(最大值)
- select max(字段) from 表名;
min(最小值)
- select min(字段) from 表名;
count(计算个数)
select count(字段) from 表名;
select count(1) from 表名; 意思是:在查询时候 新建了一个虚拟表,对应实际表的行数,实际上统计的是 1 的行数。
效率:
- MyISAM存储引擎下:count(*) 比 count(1) 效率高,因为这个引擎内部有计数器,直接返回了个数。
- InnoDB存储引擎下:count(*) 和 count(1) 差不多,比 count('字段') 效率高一些
和 distinct 关键字搭配使用
- select sum(distinct('字段')), sum('字段') from 表名;
注意
和分组函数一同查询的字段要求是 group by 后的字段。
七、分组查询
数据源 | 位置 | 关键字 | |
---|---|---|---|
分组前筛选 | 原始表 | group by子句的前面 | where |
分组后筛选 | 分组后的结果集 | group by子句的后面 | having |
group by (分组函数)
- select count(*), user_id from user_info group by user_id; 查询每个user_id的个数
having(查询结果后的筛选函数)
- select count(*) as cou, user_id as userId from user_info group by userId having cou>2;
注意
- 分组函数做条件肯定是放在 having 字句中
- 能用分组前筛选的,就优先考虑使用分组前筛选
- group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求)
- 也可以添加排序(排序放在整组语句的最后)
八、连接查询
含义
连接查询又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
错误示例
笛卡尔乘积的错误情况
select count(*) from a; 假设输出12行
select count(*) from b; 假设输出4行
最终结果:12×4=48(行)
查询分类
按年代分类
- sql 92标准:MySQL中仅支持内连接
- sql 99标准【推荐使用】:MySQL中支持内连接、外连接(左外、右外)、交叉间接
按功能分类
内连接
- 等值连接
- 非等值连接
- 自连接
外连接
- 左外连接
- 右外连接
- 全外连接
交叉连接
sql92标准
内连接>等值连接
简单示例
select a.id,b.age from user_info a,user_ageb where a.id= b.user_id
加筛选条件示例
select a.id,b.age from user_info a,user_ageb where a.id= b.user_id and b.age > 18;
总结
- 多表等值连接的结果为多表的交集部分
- n表连接,至少需要n - 1个连接条件
- 多表的顺序没有要求
- 一般需要为表加别名,便于操作
- 可以搭配子句使用,比如:排序、分组等待
内连接>非等值连接
简单示例
job_grade:员工工资等级表,每个等级都用工资范围值
employess:员工表
select e.salary,g.grade_level from employess e, job_grade g
where e.salary between g.lowest_sal and g.highest_sal
内连接>自连接
简单示例
查询员工名和上级名称
select e.employee_id, e.last_name,a.employee_id,a.last_name
from employees e, employees a where e.manager_id = a.employee_id
sql99标准
简单示例
select 查询列表
from 表1 别名【连接类型】join 表2 别名 on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】
内连接:inner
外连接:
左外:left 【outer】
右外:right【outer】
全外:full【outer】
交叉连接:cross
内连接
语法
select * from user_info u inner join user_like ui on u.user_id = ui.user_id;
特点
- 添加排序、分组、筛选
- inner join 可以省略为 join
- 筛选条件放在 where 后面,连接条件放在 on 后面,提高分离性、可读性
- inner jion 和 sql92 的等值连接效果一样,查询多表的交集
等值连接
select * from user_info u inner join user_like ui on u.user_id = ui.user_id;
非等值连接
job_grade:员工工资等级表,每个等级都用工资范围值
employess:员工表
select e.salary,g.grade_level from employess e inner join job_grade g
one.salary between g.lowest_sal and g.highest_sal
自连接
查询员工名和上级名称
select e.employee_id, e.last_name,a.employee_id,a.last_name
from employees e inner join employees a on e.manager_id = a.employee_id;
外连接
特点
- 外连接的查询结果为主表中的所有记录,如果从表中有和它匹配的,显示匹配值,如果没有匹配的,则显示 null,外连接查询结果=内连接结果+主表中有而从表没有的记录
- 左外连接,left 左边是主表,右外连接,right join右边的是主表
- 左外和右外交换两表的顺序,查询结果没有区别
全外连接(MySQL暂不支持)
特点
- 全外连接 = 内连接的结果 + 表1中有但表2没有的 + 表2中有单表1中没有的
示例
select b.,bo. from beauty b full join boys bo on b.boyfriend_id = bo.id;
交叉连接
select a.,b. from A a cross join B b; 结果为:笛卡尔乘积
sql92和sql99的区别
功能上
- sql99支持的较多
可读性
- sql99实现连接条件和筛选条件的分离,可读性较高
示例
inner join 图示:
left join图示:
right join图示:
左、右连接过滤字段为空行
全连接和交叉连接
子查询
含义
出现在其它语句中的 select 查询,成为子查询或内查询,外部的查询语句,
成为主查询或外查询
简单示例
select * from user_info where user_id in (select user_id from user_info);
分类
按子查询出现的位置:
select 后面:仅支持标量子查询
from 后面:支持表子查询
where 或 having后面:主要支持标量子查询、列子查询,也支持行子查询
exists后面(相关子查询):表子查询
按结果集行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集有一行多列)
表子查询(结果集一般为多行多列)
where或having后面
- 标量子查询(单行子查询)
- 列子查询(多行子查询)
- 行子查询(多列多行)
特点:
- 子查询放在小括号内
- 子查询一般放在条件的右侧
- 标量子查询,一般搭配着单行操作符使用;列子查询,一般搭配着多行操作符使用
标量子查询
select * from user where id = (select id from user where id = 12);
列子查询(多行子查询)
特点
- 返回多行
使用多行比较操作符:如图
行子查询(结果集一行多列或多行多列)
select * from user where (user_id,user_name) = (
select user_id,user_name from user
where user_id = 10 and user_name like '%张%';
);
select 后面
select o.,(select count() from user a where a.id = o.user_id) from user_order o;
from 后面
简介:将子查询的结果充当一张临时表,要求必须起别名
示例:
select u.*,ag.grade_level from (select avg(age) as age from user) user_age
inner join age_grades ag
on user_age.age between lowest_age and highest_age;
exists后面(相关子查询)
示例:
select exists(select * from user;) 结果:1
select exists(select * from user where id = 10000000000;) 结果:0
查询:
使用in:
select bo* from boys bo where bo.id not in (select boy_id from beauty);
使用 exists:
select bo* from boys bo where
not exists (select b.boy_id from beauty b where bo.id = b.boy_id));
分页查询
应用场景:
- 需要显示的数据,一页显示不全,需要分页提交sql查询
- 海量数据,使用分页提高性能
特点:
limit 语句放在查询语句的最后
公式:
- page:页数,size:条目数
- page = (page - 1) * size
执行顺序
联合查询
语句
- union:联合、合并:将多条查询语句中的结果合并成一个结果
- union all:同上
应用场景
要查询的结果来自于多个表,且多个表没有直接的连接关系,单查询信息一致时
特点
- 要求多条查询语句的查询列数是一致的
- 要求多条查询语句的查询的每一列的类型和顺序最好一致
- 使用 union 关键字,默认去重的,如不想去重,应该使用 union all
示例
select * from user where id = 1
union
select * from user where user_name like '%张三%';
完整查询顺序
语法
select 查询列名 -------------------------- ⑥
from 表1 别名 ---------------------------- ①
连接类型 join 表2 别名 on 连接条件 - ②
where 筛选条件 ------------------------- ③
group by 分组列表 ---------------------- ④
having 筛选 ------------------------------ ⑤
order by 排序列表 ---------------------- ⑦
limit 起始条目索引, 条目数; ----------- ⑧
三、DQL语言的更多相关文章
- MySQL笔记总结-DQL语言
DQL语言 基础查询 一.语法 select 查询列表 from 表名; 二.特点 1.查询列表可以是字段.常量.表达式.函数,也可以是多个 2.查询结果是一个虚拟表 三.示例 1.查询单个字段 se ...
- java php c# 三种语言的AES加密互转
java php c# 三种语言的AES加密互转 最近做的项目中有一个领取优惠券的功能,项目是用php写得,不得不佩服,php自带的方法简洁而又方便好用.项目是为平台为其他公司发放优惠券,结果很囧的是 ...
- MySQL的DQL语言(查)
MySQL的DQL语言(查) DQL:Data Query Language,数据查询语言. DQL是数据库中最核心的语言,简单查询,复杂查询,都可以做,用select语句. 1. 查询指定表的全部字 ...
- 手把手和你一起实现一个Web框架实战——EzWeb框架(三)[Go语言笔记]Go项目实战
手把手和你一起实现一个Web框架实战--EzWeb框架(三)[Go语言笔记]Go项目实战 代码仓库: github gitee 中文注释,非常详尽,可以配合食用 本篇代码,请选择demo3 这一篇文章 ...
- 三种语言(c++、as、lua)中函数的差异性
对于不同的语言, 尤其是静态语言和动态语言, 对于函数的定义(即如何看待一个函数)和处理截然不同.具体来说可以分为两类: 1.将函数视为第一类型值, 即函数和其他的对象一样, 都是语言中一个普通的对象 ...
- JavaSE回顾及巩固的自学之路(三)——————所有语言的都存在的基本运算
在上一篇的博客中,我回顾到Java中的关键字,标识符等知识点,而今天这篇博文将回顾Java的,哦,不,不止Java,据本人了解,几乎在所有的语言中的基础阶段,都会存在这些运算,只是语法不一样而已. 今 ...
- 冒泡排序算法的C++,Java和Python实现和冒泡排序算法三种语言效率的比较
冒泡排序原理: 这一篇百度经验讲得很好,我不多说了 https://jingyan.baidu.com/article/6525d4b13f920bac7d2e9484.html 他讲的是C语言,没有 ...
- 从三个语言(C++,Java,.Net)的几个性能测试案例来看性能优化
随着时间的发展,现在的虚拟机技术越来越成熟了,在有些情况下,Java,.Net等虚拟机密集计算的性能已经和C++相仿,在个别情况下,甚至还要更加优秀.本文详细分析几个性能测试案例,探讨现象背后的原因. ...
- R入门<三>-R语言实战第4章基本数据管理摘要
入门书籍:R语言实战 进度:1-4章 摘要: 1)实用的包 forecast:用于做时间序列预测的,有auto.arima函数 RODBC:可以用来读取excel文件.但据说R对csv格式适应更加良好 ...
随机推荐
- 参照UB单创建DN并过账
*&---------------------------------------------------------------------* *& Form FRM_DN_POST ...
- Android学习笔记之View
转载: 0.7562018.10.22 21:44:10字数 5,423阅读 189 导图 一.View事件体系 1.什么是 View 和 View的位置坐标 View是什么: View 是一种界 ...
- 提示/bin/roslyn/csc.exe权限不足
给/bin/roslyn/csc.exe 读取/执行 权限
- imregionalmax imregionalmin imextendedmax imextendedmin imhmax imhmin 函数的详解 matlab中函数
BW = imregionalmax(I): 该函数获得灰度图像 I 的局部极大值,返回值BW为和原图像大小相同的二值图像,BW中元素1对应极大值,其他元素为0 BW = imregionalmax( ...
- 02.03 win server r2 搭建FTP站点
============ftp服务器搭建=============== 先要搭建iis信息服务: 1.打开服务器管理器,角色>添加角色 2.选择角色服务:应用程序开发.FTP服务器.安全性 3. ...
- OpenGL.Qt551.问题
1.Qt551 + vs2013 + Win7x64 缘由:将“教程14:渲染到纹理.html(http://www.opengl-tutorial.org/cn/intermediate-tutor ...
- 使用 pycharm调试docker环境运行的Odoo
2019日 星期一 安装docker windows系统,参考 docker官方文档 Mac系统,参考 docker官方文档 构建自定义ODOO镜像 标准ODOO镜像可能不包含特别的python模块, ...
- 最新 4399java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.4399等10家互联网公司的校招Offer,因为某些自身原因最终选择了4399.6.7月主要是做系统复习.项目复盘.Leet ...
- when i import skimage,it occurred --"cannot import name '_validate_lengths'"
how to sovle this prolem? 1)with the administrator user to run cmd 2)imput and run : pip install --u ...
- 浪潮服务器NF84260M3安装Windows server 2012 R2 RAID配置
这里是已经做了RAID6,再做系统 浪潮服务器NF84260M3 U盘启动,光盘刻录 Windows server 2012 R2 镜像,地址:迅雷下载,ed2k://|file|cn_windows ...