【mysql基础】二.DQL语言(查询)

一.基础查询

1.语法:

Select 查询列表 from 表名;
特点:
(1)查询列表可以是:表中的字段、常量、表达式、函数
(2)查询的结果是一个虚拟的表格(值展现出来,并不把查询的结果作保存)

2.查询表中的单个字段

//last_name是单个字段(列名)
SELECT last_name FROM employees;

3.查询表中的多个字段

//可以同时查询多个字段(列名)
SELECT last_name,salary,email FROM employees;

4.查询表中的所有字段

//星号*表示:所有
SELECT * FROM employees;
		
//用于区分关键字
SELECT 'name' FROM employees;

5.查询常量值

//此时的100和john都是常量
SELECT 100;
SELECT 'john';

6.查询表达式

//此时会得到100x98的结果,9800
SELECT 100*98;

7.查询函数

//函数后带个括号(一般函数都为大写)
SELECT VERSION();

8.起别名

(1)便于理解。
(2)若要查询的字段有重名的情况,使用别名可以区分开来

//下一次可以直接select 结果;
// 就能直接得到9800
SELECT 100*98 AS 结果;

方式一:使用AS

SELECT last_name AS,First_name ASFROM employees;

方式二:使用空格

//可以省略AS直接加个空格之后写别名
SELECT last_name 姓,first_name 名 FROM employees;
SELECT salary AS "OUT put" FROM employees;

9.去重

案例:查询员工表中涉及到的所有的部门编号

//关键字DISTINCT是查询department_id的时候去除相同的id
SELECT DISTINCT department_id FROM employees;

10.+号的作用

mysql中的+号功能:做运算符

(1)都为整型,则相加

SELECT 100+90; //两个操作数都为整型,则相加

(2)一个为字符,一个为整型
尝试将字符型转为整型,如果转换成功,则继续做加法运算

//其中一个操作数有一个为字符型,则试图将字符型转换成数值型

SELECT `100`+90

如果转换失败,字符型数值转换成0

//如果转换失败,则将字符型数值转换成0
SELECT `john`+90;

如果其中一个操作数有一个为null,则结果直接为null

//如果操作数其中有一个为null,则结果直接为null
SELECT null+90;

案例:查询员工名和姓连接成一个字段,并显示为姓名(concat()方法:将两个字段拼接在一起)

SELECT CONCAT (last_name,first_name) AS 姓名 FROM employees;

11.判断是否为null

IFNULL(commission_pct,0) AS 奖金率;

IFNULL的第一个参数为可能为null的值,如果为null则返回0

二.条件查询

1.语法:

SELECT 查询列表 FROM 表名 WHERE 筛选条件;

执行顺序:先执行FROM,再执行WHERE ,最后执行SELECT

	分类:
		1.按条件表达式筛选
			条件运算符:> < = >= <= (<>是不等于)
		2.按逻辑表达式筛选
			逻辑运算符:&& || !(mysql中也有and or not表示与或非)
		3.模糊查询
			Like
			Between and
			In
			Is null		

2.按条件表达式筛选

案例1:查询工资大于12000的员工信息

SELECT * FROM employees WHERE salary>12000;

案例2:查询部门编号不等于90号的员工名和部门编号

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

3.按逻辑表达式筛选

案例1:查询工资在10000到20000之间的员工名、工资以及奖金

SELECT last_name,salary,commission_pct FROM employees WHERE salary>10000 and salary<20000;

案例2:查询部门编号不是在90到110之间,或者工资高于15000的信息

SELECT * FROM employees WHERE NOT(department_id >=90 and department_id <=110 OR salary >15000);

4.模糊查询

	1.Like
	①特点:一般和通配符搭配使用
		通配符:
		%:任意多个字符
		_:任意单个字符
	between and
	In
	is null
	is not null

案例1:查询员工名中包含字符a的员工信息
//%是通配符,表示可能在a前面出现的字符或后面出现的字符

SELECT * FROM employees WHERE last_name like '%a%';

案例2:查询员工名中第三个字符为e,第五个字符为a的员工名和工资

SELECT last_name,salary FROM employees WHERE last_name like '__e_a';

案例3:查询员工名中第二个字符为_的员工名

SELECT last_name FROM employees WHERE last_name LIKE '_\_';
	2.between and
	①使用between and 可以提高语句的简洁度
	②包含临界值
	③两个临界值不要调换顺序

案例1:查询员工编号在100到120的所有员工信息

SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;
	3.in
	①含义:判断某字段的值是否属于in列表中的某一项
	特点:使用in提高简洁度
		in列表的值必须统一/兼容

案例:查询员工的工种编号是IT_PROG,AD_VP,AD_PRES中的一个员工名和工种编号。

SELECT last_name,job_id FROM employees WHERE job_id IN ('IT_PROT','AD_VP','ADPRES');
	4.is null
	①=或<>不能用于判断null值
	Is null或is not null

案例1:查询没有奖金的员工名和奖金率

SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NULL;

案例2:查询有奖金的员工名和奖金率

SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NOT NULL;
	5.安全等于<=>:可以用于比较null

案例1:查询没有奖金的员工名和奖金率

SELECT last_name,commission_pct FROM employees WHERE commission_pct <=> NULL;

案例2:查询工资为12000的员工信息

SELECT last_name,salary FROM employees WHERE salary <=>12000;

三.排序查询

1.语法:

	**SELECT 查询列表 FROM 表 【WHERE 筛选条件】ORDER BY 排序列表 【asc | desc】**

案例1:查询员工信息,要求工资从高到低排序

DESC:从高到低
ASC:从低到高

SELECT * FROM employees ORDER BY salary DESC;
SELECT * FROM employees ORDER BY salary ASC;
	特点:
		1.asc代表升序,desc代表的是降序
			如果不写,默认为升序
		2.order by子句中可以支持单个字段,多个字段、表达式、函数、别名。
		3.order by一般放在查询语句的最后面,limit子句除外

案例2:查询部门编号>=90的员工信息,按入职时间的先后排序【添加筛选条件】

SELECT * FROM employees WHERE department_id >=90 ORDER BY hiredate ASC;

案例3:按年薪的高低显示员工的信息和年薪【按表达式排序】

SELECT *,salary*12*(1+IFNULL(commission_pct,0)) FROM employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;

案例4:按年薪的高低显示员工的信息和年薪【按别名排序】

SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪FROM employees ORDER BY 年薪 DESC;

案例5:按姓名的长度显示员工的姓名和工资【按函数排序】

SELECT LENGTH(last_name) AS 字节长度,last_name,salary FROM employees ORDER BY 字节长度 DESC;

案例6:查询员工信息,要求先按工资升序,再按员工编号降序【按多个字段排序】

SELECT * FROM employees ORDER BY salary ASC,employee_id DESC;

四.常见函数(单行函数)

1.概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
	好处:隐藏了实现细节,提高代码的重用性
2.调用:select 函数名(实参列表) 【from 表】;

3.特点:①函数名
	②函数功能

4.分类:1.单行函数
		如:concat,length、ifnull等
		
		2.分组函数
		功能:做统计使用【统计函数,聚合函数,组函数】

一.字符函数

1.Length:获取参数值的字节个数

SELECT LENGTH('john');
SELECT LENGTH('hahaha');

2.concat 拼接字符串

SELECT CONCAT(last_name,'_',first_name) 姓名 FROM employees;

3.upper,lower

SELECT UPPER('john');
SELECT LOWER('joHn');
//示例:将姓变大写,名变小写,然后拼接
SELECT CONCAT(UPPER(last_name),LOWER(first_name)) FROM employees;
Tips:	mysql的索引都从1开始的

4.substr、substring(arg1,arg2)
Arg1表示要截取的字符,Arg2表示要从下表为哪个开始截取

SELECT SUBSTR('玛卡巴卡唔系迪西',6) out_put;

Substr(arg1,arg2,arg3)
Arg1表示要截取的字符,Arg2表示从指定索引开始截取,Arg3表示从索引处开始指定长度的字符

SELECT SUBSTR('玛卡巴卡唔系迪西',1,3) out_put;

案例:姓名中首字母大写,其他字符小写然后用_拼接,显示出来

SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(first_name,2)) out_put FROM employees;

5.instr(arg1,arg2):返回arg2arg1中第一次出现的起始位置索引,如果找不到则返回0

SELECT INSTR('玛卡巴卡是全世界最帅的蓝人','蓝人') AS out_put FROM employees;

6.trim()
去掉(替换)空格

SELECT LENGTH(TRIM('         玛卡巴卡         ')) AS out_put;
SELECT LENGTH(TRIM( a FROM 'aaaaa玛卡巴卡aaa') AS out_put;

7.lpad:用指定的字符左填充指定长度

SELECT lPAD('玛卡巴卡',10,'*') AS out_put;

8.Rpad:用指定的字符右填充指定长度

SELECT RPAD('柏建江',12,'ab') AS out_put;

9.replace 替换:将Arg1中的Arg2换成Arg3

SELECT REPLACE('玛卡巴卡和唔系迪西','唔系迪西','萌不利多') AS out_put;

二.数学函数

1.round 四舍五入

SELECT ROUND (1.76);
SELECT ROUND(1.567,2);//小数点后保留两位

2.ceil 向上取整,

SELECT CEIL(1.01);

3.floor 向下取整

SELECT FLOOR(9.99);

4.truncate 截断

SELECT TRUNCATE(1.7666,1);

5.mod 取余 a-a/b*b

SELECT MOD(10,3);

三.日期函数

1.now:返回当前系统日期+时间

SELECT NOW();

2.curdate: 返回当前系统日期,不包含时间

SELECT CURDATE();

3.curtime: 返回当前系统的时间,不包含日期

SELECT CURTIME();

4.可以获取指定的部分,年月日时分秒

SELECT YEAR(NOW());

5.str_to_date:将字符按指定的格式转换成日期

SELECT STR_TO_DATE('1998-3-2','%Y-%m-%d') 日期;

案例:查询入职日期为1992-4-3的员工信息

SELECT * FROM employees WHERE hiredate = STR_TO_DATE('1992-4-3','%Y-%c-%d');

6.date_format:将日期转换成字符

SELECT DATE_FORMAT(NOW(),'%Y年%c月%d日') AS out_put;

案例:查询有奖金的员工名和入职日期(xx月/xx日 xx年)

SELECT last_name,DATE_FORMAT(hiredate,'%m/%d日 %Y年) FROM employees;

四.其他函数

Select version();
Select database();
Select user();

五.流程控制函数

1.if函数 if else的效果

SELECT IF('10>5','大','小');
SELECT last_name,commission_pct,IF(commission_pct IS NULL,'无奖金','有奖金') FROM employees;

2.case函数的使用1:switch case 的效果(为值时不能加; 为语句时要加;
mysql中
Case 要判断的字段或表达式
When 常量1 then 要显示的值1或语句1;
When 常量2 then 要显示的值1或语句2;
。。。
Else 要显示的值n或语句n;
End

案例:查询员工的工资,要求
部门号=30,显示的工资为1.1倍
部门号=40,显示的工资为1.2倍
部门号=50,显示的工资为1.3倍
其他部门,为原工资

SELECT salary 原始工资,department_id,
	CASE department_id
	WHEN 30 THEN salary*1.1
	WHEN 40 THEN salary*1.2
	WHEN 50 THEN salary*1.3
	ELSE salary
	END AS 新工资
	FROM employees;

3.case 函数的使用二:类似于多重if
java中
If(条件1){
语句1;
}else if(条件2){
语句2;
……
}else{
语句n;
}

mysql中:
Case
When 条件1 then 要显示的值1或语句1;
when 条件2 then 要显示的值2或语句2;
……
Else 要显示的值n或语句n
end

案例:查询员工的工资情况
如果工资>20000,显示A级别
如果工资>15000,显示B级别
如果工资>10000,显示c级别
否则,显示D级别

SELECT salary,
	CASE
	WHEN salary>20000 THEN 'A'
	WHEN salary>15000 THEN 'B'
	WHEN salary>10000 THEN 'C'
	ELSE 'D'
	END AS 工资级别
	FROM employees;

五.常见函数(分组函数)

一.功能:用作统计使用,又称为聚合函数或统计函数

二.分类:

Sum,求和,avg平均值,max 最大值,min 最小值,count 计算个数

1.简单的使用

SELECT SUM(salary) FROM employees;
SELECT AVG(salary) FROM employees;
SELECT MIN(salary) FROM employees;
SELECT MAX(salary) FROM employees;
SELECT COUNT(salary) FROM employees;

三.特点

1.sum,avg:一般用于处理数值型
max,min,count:可以处理任何数据类型

2.以上分组函数都忽略null值

3.可以和distinct搭配实现去重运算

4.count函数的单独介绍

SELECT COUNT(*) FROM employees;//统计行数(常用)
SELECT COUNT(1) FROM employees;//统计行数
		

5.和分组函数一同查询的字段要求是group by 后的字段

Datadiff(arg1,arg2):得到两个日期之间相差的天数

六.分组查询

一.语法:

Select 分组函数,列(要求出现在group by的后面)from 表 【where筛选条件】group by 分组的列表 【order by 子句】

二.注意事项:

查询列表必须特殊,要求是分组函数和group by 后出现的字段

案例1:查询每个工种的最高工资

SELECT MAX(salary),job_id FROM employees GROUP BY job_id;

案例2:查询每个位置的部门个数

SELECT COUNT(*),location_id FROM departments GROUP BY location_id;

添加筛选条件
案例1:查询邮箱中包含a字符的,每个部门的平均工资

SELECT AVG(salary),department_id, FROM employees WHERE email LIKE '%a%' GROUP BY department_id;

案例2:查询有奖金的每个领导手下员工的最高工资

SELECT MAX(salary),manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id;

添加分组后的筛选条件
案例1:查询哪个部门的员工个数>2
①查询每个部门的员工个数

SELECT COUNT(*),department_id FROM employees GROUP BY department_id;

②根据①的结果进行筛选,查询哪个部门的员工个数>2

SELECT COUNT(*),department_id FROM employees GROUP BY department_id HAVING count(*)>2;

案例2:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
①查询每个工种有奖金的员工的最高工资

SELECT MAX(salary),job_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id;

②根据①的结果继续筛选,

SELECT MAX(salary),job_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING MAX(salary)>12000;

案例3:查询领导编号>102的每个领导手下的最低工资>5000的领导编号及其最低工资

SELECT MIN(salary),manager_id FROM employees WHERE manager_id>102 GROUP BY manager_id HAVING MIN(salary)>5000;

三.特点:

1.分组查询中的筛选分为两类
数据源 使用
分组前筛选 原始表
分组后筛选 筛选后的表
①分组函数做条件肯定放在having中
②优先使用分组前筛选条件

2.group by 支持单个字段分组,多个字段分组(多个字段之间用逗号隔开,没有顺序要求)。表达式或函数(用的较少)

3.也可以添加排序(排序放在整个分组查询的最后)

按表达式或函数分组
案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
①查询每个长度的员工个数

SELECT COUNT(*),LENGTH(last_name) len_name FROM employees GROUP BY LENGTH(last_name);

②添加筛选条件

SELECT COUNT(*),LENGTH(last_name) len_name FROM employees GROUP BY LENGTH(last_name) HAVING COUNT(*)>5;

按多个字段分组
案例:查询每个部门每个工种的员工的平均工资

SELECT AVG(salary) ,department_id,job_id FROM employees GROUP BY department_id,job_id;

添加排序

SELECT AVG(salary) ,department_id,job_id FROM employees GROUP BY department_id,job_id ORDER BY AVG(salary) DESC;

七.连接查询

一.含义:又称为多表查询,要查询的字段来自多个表时

笛卡尔积想象:表1 有m行,表2有n行,结果=m*n行
如何发生的:没有有效的连接条件

SELECT name,boyName FROM boys,beauty WHERE beauty.boyfriend_id=boys.id;

二.分类:按年代分类:

		**Sql92**标准:仅仅支持内连接
		**Sql99**标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接

按功能分类:
内连接:等值连接,非等值连接,自连接
外连接:左外连接,右外连接,全外连接
交叉连接

#一.sql92标准
#1.等值连接
①多表等值连接的结果为多表的交集部分
②n表连接至少需要n-1个连接条件
③多表的顺序没有要求
④一般需要为表起别名
⑤可以搭配前面介绍的所有子句使用,比如排序,分组,筛选

案例1:查询女神名和对应的男神名

SELECT name,boyName FROM boys,beauty WHERE beauty.boyfriend_id=boys.id;

案例2:查询员工名和对应的部门名

SELECT last_name,department_name FROM employees,departments WHERE employees.department_id=
			departments.department_id;

#2.为表起别名:提高语句的简洁度
Tips:如果为表起了别名,则查询字段不能用原来的表名
查询员工名,工种号,工种名

SELECT last_name,e.job_id,job_title FROM employees e,jobs j WHERE e.job_id=j.job_id;

#3两个表的顺序可以调换

#4可以加筛选
案例:查询有奖金的员工名,部门名

SELECT last_name,department_name,commission_pct FROM employees e,departments d WHERE e.`department_id`=d.`department_id` AND e.`commission_pct` IS NOT NULL;

案例2:城市名中第二个字符为o的部门

SELECT department_name,city FROM departments d,locations l WHERE d.`location_id`=l.`location_id` AND city LIKE '_o%';

#5可以加筛选
#案例1:查询每个城市的部门个数

SELECT COUNT(*) 个数,city FROM departments d,locations l WHERE d.`department_id`=l.`department_id` GROUP BY city;

#案例2:查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资

SELECT department_name,d.`manager_id`,MIN(salary) FROM departments d,employees e WHERE d.`department_id`=e.`department_id` AND commission_pct IS NOT NULL GROUP BY department_name,d.`manager_id`;

#6.可以加排序
#案例:查询出每个工种的工种名和员工的个数,并且按员工个数降序

SELECT job_title,COUNT(*) FROM employees e,jobs j WHERE e.`job_id`=j.`job_id` GROUP BY job_title ORDER BY COUNT(*) DESC;

#7.可以实现三表连接
#案例:查询员工名、部门名和所在的城市

SELECT last_name,department_name,city FROM employees e,departments d,locations l WHERE e.`department_id`=d.`department_id` AND d.`location_id`=l.`location_id`

#2.非等值连接
#案例:查询员工的工资和工资级别

SELECT salary,grade_level FROM employees e,job_grades g WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal` AND g.`grade_level`='A';

#3.自连接(同一张表)
#案例:查询 员工名和上级的名称

SELECT e.employee_id,e.last_name,m.employee_id,m.last_name FROM employees e,employees m WHERE e.`manager_id`=m.`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 表1 别名 inner join 表2 别名 on 连接条件;

分类:等值连接,非等值连接,自连接

1.等值连接:
特点:①添加排序,分组,筛选
②inner 可以省略
③筛选条件放在where后,连接条件放在on后面,提高分离性。
④inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集部分

#案例1:查询员工名,部门名

SELECT last_name,department_name FROM employees INNER JOIN departments d ON e.`department_id`=d.`department_id`;

#案例2:查询名字中包含e的员工名和工种名(添加筛选)

SELECT last_name,job_title FROM employees INNER JOIN jobs j ON e.`job_id`=j.`job_id` WHERE e.`last_name` LIKE '%e%';

#案例3:查询部门个数>3的城市名和部门个数(添加分组+筛选)

SELECT city,COUNT(*) 部门个数 FROM departments d INNER JOIN locations l ON d.`location_id`=l.`location_id` GROUP BY city HAVING 部门个数>3;

#案例4:查询每个部门的员工个数>3的部门名和员工个数,并按个数降序(排序)

SELECT department_name,COUNT(*) 员工个数 FROM employees e INNER JOIN departments d ON e.`department_id`=d.`department_id` GROUP BY department_name HAVING 员工个数>3 ORDER BY 员工个数 DESC;

#案例5:查询员工名,部门名,工种名,并按部门名降序(多表连接)

SELECT last_name,department_name,job_title  FROM employees e INNER JOIN departments d ON e.`department_id`=d.`department_id` INNER JOIN jobs j ON e.`job_id`=j.`job_id` ORDER BY department_name DESC;

#2.非等值连接
#查询员工的工资级别

SELECT salary,grade_level FROM employees e JOIN job_grades g ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`;

#查询每个工资级别的个数>2,并且按工资级别降序

SELECT salary,grade_level,COUNT(*) FROM employees e JOIN job_grades g ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal` GROUP BY grade_level  HAVING COUNT(*)>2 ORDER BY grade_level DESC;

#3.自连接
#查询员工的名字、上级的名字

SELECT e.last_name,e.manager_id,m.employee_id,m.last_name FROM employees e JOIN employees m ON e.`manager_id`=m.`employee_id` WHERE e.`last_name` LIKE 'K%';

#四.外连接
1.应用场景:用于查询一个表中有,另外一个表中没有的记录
2.特点:
1.外连接的查询结果为主表中的所有记录,如果从表中有与其匹配的,则显示匹配的值,如果没有匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表中没有的记录
2.左外连接,left左边的是主表
右外连接,right join右边的是主表
3.左外和右外交换两个表的顺序,可以实现同样的效果
4.全外连接=交集部分+表1没有但表2有的结果+表2没有但表1有的结果

#案例:查询男朋友不在男神表的女神名

SELECT b.name,bo.* FROM beauty b LEFT OUTER JOIN boys bo ON b.`boyfriend_id`=bo.`id` WHERE bo.`id` IS NULL;

#案例:查询哪个部门没有员工

SELECT d.*,employee_id FROM departments d LEFT OUTER JOIN employees e ON d.`department_id`=e.`department_id` WHERE employee_id IS NULL;

#五.交叉连接(笛卡尔乘积)

SELECT b.*,bo.* FROM beauty b CROSS JOIN boys bo;

八.子查询

一.含义:出现在其他语句中的select语句,称为子查询或内查询

外部出现的查询语句,称为主查询或外查询

二.分类:

	1.按子查询出现的位置:
					Select 后面:仅仅支持标量子查询
					From 后面:支持表子查询
					Where或having 后面:支持标量子查询、列子查询、行子查询(用的较少)
					Exists 后面(相关子查询):支持表子查询
	2.按结果集的行列数不同:
					标量子查询(结果集只有一行一列)
					列子查询(结果集只有一列多行)
					行子查询(结果集有一行多列)
					表子查询(结果集有多行多列)

三.where或having后面

	1.标量子查询:(单行子查询)
	2.列子查询(多行子查询)
	3.行子查询(多列多行)
	
	特点:①子查询放在小括号内
		②子查询一般放在条件的右侧
		③标量子查询,一般搭配着单行子查询操作符
			<,>,>=,<=, =,<>
			列子查询,一般搭配着多行操作符使用
			in,any/some,all
		④子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果

四.select后面

仅仅支持标量子查询

五.from后面

/*
要求把from后的子查询结果当成一张表,要求必须起别名
*/

#案例:查询每个部门的平均工资的工资等级
①查询每个部门的平均工资

SELECT AVG(salary),department_id FROM employees GROUP BY department_id;

②连接①的结果集和job_grades表,筛选条件

between lowest_sal and highest_sal
	SELECT ag_dep.*,g.`grade_level`
	FROM (
		SELECT AVG(salary) ag,department_id 
		FROM employees 
		GROUP BY department_id
	) ag_dep//必须起别名
	INNER JOIN job_grades g ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;

六.exists后面(相关子查询)

判断exists()中是否有值,有则返回1,没有则返回0
语法:
Exists(完整的查询语句)

SELECT EXISTS(
		SELECT employee_id FROM employees
)

九.分页查询

一.应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求

二.语法:

SELECT 查询列表
FROM 表
【join type join 表
On 连接条件
Where 筛选条件
Group by 分组后的筛选
Having 分组后的筛选
Order by 排序的字段】

Limit offset,size;//offset:起始索引(从0开始),size要查询的条目数

三.特点:

	①limit语句防在查询语句的最后
	②公式:
		要显示的页数page,每页的条目数size
		select 查询列表
		From 表
		Limit (page-1)*size,size;
		Size=10
		Page
		1	0
		2	10
		3	20

案例1:查询5条员工信息

SELECT * FROM employees e LIMIT 0,5;
SELECT * FROM employees e LIMIT 5;(如果从第0个开始,0可以省略)

案例2:查询第11条到第25条

SELECT * FROM employees e LIMIT 10,14;

案例3:查询有奖金的员工信息,只显示工资排序前10个

SELECT * FROM employees e WHERE commission_pct IS NOT NULL ORDER BY salary DESC LIMIT 10;

执行顺序:①from ->② join ->③ on -> ④where -> ⑤group by ->⑥having -> ⑦order by ->⑧ limit
①单个表
②笛卡尔乘积的大表
③筛选后的表

十.union联合查询

/*
Union 联合 合并:将多条查询语句的结果合并成一个结果
*/
#引入的案例:查询部门编号>90或邮箱包含a的员工信息

SELECT * FROM employees WHERE email LIKE '%a%' OR department_id>90;
	
SELECT * FROM employees WHERE email LIKE '%a%' 
UNION
SELECT * FROM employees WHERE department_id>90;
	

语法:
查询语句1
Union
查询语句2
……

应用场景:要查询的结果来自于多个表,且多个表之间没有直接的连接关系,但查询的信息一致

特点:
	1.要求查询多条查询语句时,查询列数必须一致
	2.要求多条查询语句的查询的每一列的类型和顺序最好一致
	3.union关键字默认是去重的,如果使用union all 可以包含重复项
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漩涡编程,一鸣惊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值