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;
目前多表查询先写到这,后面的会补上,多多关注!!!