MySQL之浅谈DQL(查询语句)
Posted Michelhjx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL之浅谈DQL(查询语句)相关的知识,希望对你有一定的参考价值。
目录
前言
在上一篇文章MySQL简介_Michelhjx的博客-CSDN博客中,我们介绍了数据库以及mysql的概念,这篇文章我们就来介绍学习MySQL中的查询语句。同样,话不多说,走着!
一、简单查询
1.1 查询表中所有数据
语法: select * from 表名;
在查询语句中,我们通常使用*来表示所有数据。
案例: 查询员工表中的所有数据。
查询结果:
我们可以看到,通过查询员工表中有107条数据。
1.2 基础查询
1.2.1 多个字段查询
语法: select 字段1,字段2... from 表名;
1.2.2 起别名 as
在查询字段时,如果有重复的字段,我们可以给字段其别名,这样就便于理解和区别。当然我们也可以用空格来代替as。
1.2.3 去重 distinct
在查询数据的时候,有时候会出现重复数据,这时候我们在select后面使用distinct关键字进行书籍去重。
案例: 查询部门编号,且不出现重复。
查询结果:
1.2.4 concat() 字段拼接
使用方式: concat(str1,str2,..)
案例:查询员工的姓名。
查询结果:
通过查询我们得到107行员工姓名,跟之前的查询所有员工信息的行数吻合。
1.2.5 计算列
1.一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
这里要着重说一下+这个运算符。
(1).当两个数值型相加时,直接作加运算。
(2).当一个为数值型,另一个为字符型的数值,则把字符型转换成数值型再进行加运算。
(3).当某一个为字符,则加运算时值为0。
(4).当某个为null,则加运算后的值为null。
2.ifnull(表达式1,表达式2):null参与的运算,计算结果都为null。
表达式1:哪个字段需要判断是否为null。
如果该字段为null后的替换值。
二、条件查询
2.1 基本用法
语法:select 字段名 from 查询表名 where 筛选条件
案例:查询员工编号为160的员工信息。
查询结果:
2.2 运算符
条件运算符:> 、< 、<= 、>= 、= 、<>
逻辑运算符:and 或 &&、or 或 || 、not 或 !
案例:选择在20或50号部门工作的员工姓名和部门号
查询结果:
2.3 模糊查询
BETWEEN...AND
IN( 集合)
LIKE:模糊查询
这里强调一个点:
占位符:
_:单个任意字符
%:多个任意字符
案例:选择员工姓名的第三个字母是a的员工姓名。
查询结果:
IS NULL
案例:选择公司中没有管理者的员工姓名及job_id
查询结果:
三、排序查询
语法: select 要查询的东西
from 表
where 条件
order by 排序的字段|表达式|函数|别名 【asc|desc】
排序方式:
ASC:升序(默认)
DESC:降序
排序分类:
1. 按单个字段进行排序
2. 按多个字段进行排序
3. 按表达式进行排序
4. 按别名进行排序
5.按函数进行排序
案例:查询员工的姓名和部门号和年薪,按年薪降序按姓名升序
注:年薪 = salary * 12 * (1+奖金率)
这里我们通过前面的查询信息可知,奖金率有为空的数据,所以我们要使用IFNULL()
SELECT
CONCAT(last_name,first_name)AS 姓名,department_id,salary*12*(1+IFNULL(commission_pct,0))AS 年薪
FROM employees ORDER BY 年薪 DESC,姓名;
这里还要注意一点,按姓名升序的时候,因为SQL语句里默认数据是升序,所以ASC可以省略不写。
查询结果:
四、常用函数
4.1 字符函数
concat() | 拼接 |
substr() | 截取子串 |
upper() | 转换成大写 |
lower() | 转换成小写 |
trim() | 去前后指定的空格和字符 |
ltrim() | 去左边空格 |
rtrim() | 去右边空格 |
replace() | 替换 |
lpad() | 左填充 |
rpad() | 右填充 |
instr() | 返回子串第一次出现的索引 |
length() | 获取字节个数 |
4.2 数学函数
round() | 四舍五入 |
rand() | 随机数 |
floor() | 向下取整 |
ceil() | 向上取整 |
mod() | 取余 |
truncate() | 截断 |
4.3 日期函数
now() | 当前系统日期+时间 |
curdate() | 当前系统日期 |
curtime() | 当前系统时间 |
str_to_date() | 将字符转换成日期 |
date_format() | 将日期转换成字符 |
4.4 流程控制函数
if 处理双分支
case语句 处理多分支
情况1:处理等值判断
情况2:处理条件判断
4.5 其他函数
version() | 版本 |
database() | 当前库 |
user() | 当前连接用户 |
五、分组查询
语法: select 查询的字段,分组函数
from 表
group by 分组的字段
特点:
1、可以按单个字段分组
2、和分组函数一同查询的字段最好是分组后的字段
3、可以按多个字段分组,字段之间用逗号隔开
4、可以支持排序
5、having后可以支持别名
案例:选择具有各个job_id的员工人数
SELECT COUNT(*) 人数,job_id
FROM employees
GROUP BY job_id;
查询结果:
六、连接查询
语法: select 字段列表
from 表名1
[连接类型] join 表名2 on 条件
where 筛选条件
group by 分组条件
having 分组后的筛选条件
order by 排序字段
连接类型:内连接 【inner】
外连接:
左外连接:left[outer] 左边的为主表
右外连接:right[outer] 右边的为主表
全外连接:full[outer]
交叉连接:cross 笛卡尔积
案例:查询哪个部门没有员工
SELECT d.*,e.employee_id
FROM departments d
LEFT OUTER JOIN employees e
ON d.`department_id` = e.`department_id`
WHERE e.`employee_id` IS NULL;
查询结果:
七、子查询
概念:查询中嵌套查询,称嵌套查询为子查询
特点:
1、子查询都放在小括号内
2、子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
3、子查询优先于主查询执行,主查询使用了子查询的执行结果
4、子查询根据查询结果的行数不同分为以下两类:
① 单行子查询
结果集只有一行
一般搭配单行操作符使用:> < = <> >= <=
非法使用子查询的情况:
a、子查询的结果为一组值
b、子查询的结果为空
② 多行子查询
结果集有多行
一般搭配多行操作符使用:any、all、in、not in
in: 属于子查询结果中的任意一个就行
any和all往往可以用其他查询代替
八、分页查询
语法:
select 字段|表达式,...
from 表
where 条件
group by 分组字段
having 条件
order by 排序的字段
limit 起始的条目索引,条目数;
特点:
1.起始条目索引从0开始
2.limit子句放在查询语句的最后
3.公式:select * from 表 limit (page-1)*sizePerPage,sizePerPage
假如:
每页显示条目数sizePerPage
要显示的页数 page
案例:查询前五条员工信息。
SELECT * FROM employees LIMIT 0,5;
查询结果:
九、联合查询
语法:
select 字段|常量|表达式|函数 from 表 where 条件 union 【all】
select 字段|常量|表达式|函数 from 表 where 条件 union 【all】
select 字段|常量|表达式|函数 from 表 where 条件 union 【all】
.....
select 字段|常量|表达式|函数 from 表 where 条件
特点:
1、多条查询语句的查询的列数必须是一致的
2、多条查询语句的查询的列的类型几乎相同
3、union代表去重,union all代表不去重
总结
以上就是查询语句的全部介绍了,虽然看着很多,但是只要多去思考、实践,就会发现好像也不是挺多。动手才是关键!
以上是关于MySQL之浅谈DQL(查询语句)的主要内容,如果未能解决你的问题,请参考以下文章