MySQL(8.0.18)的DQL---数据查询语言

DQL是什么?
DQL(Data Query Language)数据查询语言

接下来我们一起来了解DQL,首先我们先了解基本查询、过滤及排序、分组、多表查询是如何查询的(我会以一个数据库表来解释和执行下面的操作,先要有一个数据库,里面有很多张表的形式来看)

一、 基本查询

查询所有列

select * from t_mysql_employees;(这个不推荐使用)

指定特定的列

#最好以这种方式来查表,查询你要所查的列
SELECT employee_id,first_name,last_name FROM t_mysql_employees;
在这里插入图片描述

列的别名(1、两个有相同的列段的时候;2、后续要使用这个列段的时候)

SELECT first_name 姓,last_name 名 FROM t_mysql_employees
在这里插入图片描述

字符串:字符串可以是 SELECT 列表中的一个字符,数字,日期(配合字符串函数使用

SELECT CONCAT(first_name,last_name) FROM t_mysql_employees; //concat这里的作用相当于+字符,是可以连接在一起的
在这里插入图片描述

去重

SELECT DISTINCT department_id FROM t_mysql_employees;
----distinct是去重的意思,下面执行代码是已经去重了的
在这里插入图片描述

MySQL的版本查询select version();

SELECT VERSION();
在这里插入图片描述

显示表结构

desc 表名----->DESC t_mysql_employees;
在这里插入图片描述

二、过滤及排序

语法:select * from 表名 where 条件(Boolean表达式)
使用WHERE 子句,将不满足条件的行过滤掉。

1.按条件表达式筛选

简单条件运算符:> < = != <> >= <=

查询工资>12000的员工信息
在这里插入图片描述

SELECT 
	*
FROM
	t_mysql_employees
WHERE
	salary>12000;

查询部门编号不等于90号的员工名和部门编号
在这里插入图片描述

SELECT
	last_name,
	department_id 
FROM
	t_mysql_employees 
WHERE
	department_id <> 90;

2. 按逻辑表达式筛选

逻辑运算符:
作用:用于连接条件表达式
&& || !
and or not
&&和and:两个条件都为true,结果为true,反之为false
||或or: 只要有一个条件为true,结果为true,反之为false
!或not: 如果连接的条件本身为false,结果为true,反之为false

查询工资z在10000到20000之间的员工名、工资以及奖金
SELECT
last_name,
salary,
commission_pct
FROM
t_mysql_employees
WHERE
salary > 10000
AND salary < 20000;
在这里插入图片描述

模糊查询筛选(like、between and 、in、is null || is not null)
-----ike
特点:
①一般和通配符搭配使用
通配符:
% 任意多个字符,包含0个字符
_ 任意单个字符

查询员工名中包含字符a的员工信息
SELECT * FROM t_mysql_employees WHERE last_name LIKE ‘%a%’;
在这里插入图片描述

between and
①使用between and 可以提高语句的简洁度
②包含临界值
③两个临界值不要调换顺序

查询员工编号在100到120之间的员工信息
SELECT * FROM t_mysql_employees WHERE employee_id BETWEEN 100 AND 120;
在这里插入图片描述

in
含义:判断某字段的值是否属于in列表中的某一项
特点:
①使用in提高语句简洁度
②in列表的值类型必须一致或兼容
③in列表中不支持通配符

查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号

SELECT last_name,job_id FROM t_mysql_employees WHERE job_id in(‘IT_PROG’,‘AD_VP’,‘AD_PRES’);
在这里插入图片描述

is null
=或<>不能用于判断null值
is null或is not null 可以判断null值

查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
t_mysql_employees
WHERE
commission_pct IS NULL;
在这里插入图片描述

查询有奖金的员工名和奖金率

SELECT last_name, commission_pct FROM t_mysql_employees WHERE
commission_pct IS NOT NULL;
在这里插入图片描述

is null pk <=>
IS NULL:仅仅可以判断NULL值,可读性较高,建议使用
<=> :既可以判断NULL值,又可以判断普通的数值,可读性较低

查询工资为12000的员工信息
SELECT
last_name,
salary
FROM
t_mysql_employees
WHERE
salary <=> 12000;
在这里插入图片描述

排序查询
语法:
select 查询列表
from 表名
【where 筛选条件】
order by 排序的字段或表达式;

特点:
1、asc代表的是升序,可以省略
desc代表的是降序
2、order by子句可以支持 单个字段、别名、表达式、函数、多个字段
3、order by子句在查询语句的最后面,除了limit子句

查询部门编号>=90的员工信息,并按员工编号降序
SELECT *
FROM t_mysql_employees
WHERE department_id>=90
ORDER BY employee_id DESC;
在这里插入图片描述
如果order by 后面排序不写desc,就默认为升序

三、 分组查询

1、概念
​ 分组函数作用于一组数据,并对一组数据返回一个值。

语法
group by 列名 having 条件(Boolean条件)

2.分组函数类型
功能:用作统计使用,又称为聚合函数或统计函数或组函数
分类:
sum 求和、avg 平均值、max 最大值 、min 最小值 、count 计算个数
特点:
1、sum、avg一般用于处理数值型
max、min、count可以处理任何类型
2、以上分组函数都忽略null值
3、可以和distinct搭配实现去重的运算
4、count函数的单独介绍
一般使用count(*)用作统计行数
5、和分组函数一同查询的字段要求是group by后的字段

分组的简单使用

select count(*) from t_mysql_employees;
在这里插入图片描述
select max(salary) from t_mysql_employees;
在这里插入图片描述
select min(salary) from t_mysql_employees;
在这里插入图片描述
select avg(salary) from t_mysql_employees;
在这里插入图片描述

GROUP BY

查询每个工种的员工平均工资
SELECT avg(salary),job_id FROM t_mysql_employees GROUP BY job_id;
在这里插入图片描述

可以实现分组前的筛选

查询 有奖金 的 每个领导 手下员工的 平均工资
SELECT AVG(salary),manager_id
FROM t_mysql_employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
在这里插入图片描述

where与having的使用场景

员工工资大于12000的,然后进行分部门展示;
SELECT
department_id,
count( department_id ) num
FROM
t_mysql_employees
where salary >12000
GROUP BY
department_id;
在这里插入图片描述

分部门统计员工信息,筛选出工资大于12000的员工
SELECT
department_id,
count( department_id ) num
FROM
t_mysql_employees
GROUP BY
department_id
having department_id >90
在这里插入图片描述

where与having不一样的用法

#不一样的
#统计部门人数大于3的部门id及部门对应人数
SELECT
department_id,
count( department_id ) num
FROM
t_mysql_employees
where num > 3
GROUP BY
department_id
这个where num >3会报错

SELECT
department_id,
count( department_id ) num
FROM
t_mysql_employees
GROUP BY
department_id
having num > 3
在这里插入图片描述

Group by子句

每个工种 有奖金 的员工的 最高工资>6000 的 工种编号和最高工资,按最高工资升序
SELECT
job_id,max(salary) smax
from t_mysql_employees
where commission_pct IS NOT NULL
group by job_id
#having smax > 6000
order by smax asc;
在这里插入图片描述

四、多表查询

迪卡尔积
笛卡尔积在SQL中的实现方式既是交叉连接(Cross Join)。所有连接方式都会先生成临时笛卡尔积表,笛卡尔积是关系代数里的一个概念,表示两个表中的每一行数据任意组合,上图中两个表连接即为笛卡尔积(交叉连接)。
(如果使用笛卡尔积去连接多表,它连接多表查询是以乘积来算查询数据,这样会造成很多没必要的数据,占用内存资源,消耗大,)

注意事项:
1、一定要避免笛卡尔积
2、链表查询涉及的表,需要避免重复列的出现,一般需要添加表别名实现

使用连接在多个表中查询数据:
• 在 WHERE 子句中写入连接条件。
• 在表中有相同列时,在列名之前加上表名前缀

区分重复的列名:
• 在不同表中具有相同列名的列可以用表的别名
加以区分。
• 如果使用了表别名,则在select语句中需要使
用表别名代替表名
• 表别名最多支持32个字符长度,但建议越少越

表的别名:
• 使用别名可以简化查询。
• 使用表名前缀可以提高执行效率。

多表连接(可以加筛选)

查询 有奖金 的员工名、部门名
select e.last_name,d.department_name from t_mysql_employees e,t_mysql_departments d
where e.department_id = d.department_id
and e.commission_pct is not null;
在这里插入图片描述

多表连接(可以加分组)

查询 每个城市 的部门个数
ELECT COUNT(*) 个数,city
FROM t_mysql_departments d,t_mysql_locations l
WHERE d.location_id=l.location_id
GROUP BY city;
在这里插入图片描述

目前多表查询先写到这,后面的会补上,多多关注!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值