文章目录
MySQL数据库DQL语言连接查询sql92标准案例sql99标准案例sql92和sql99对比
子查询分页查询联合查询
欢迎斧正!!!
MySQL数据库
全部SQL源文件链接:https://pan.baidu.com/s/1wc51qkVetSRybFzcIYGBIg 提取码:3wpt
DQL语言
连接查询
含义:又称多表查询,当查询的数据来自多个表时,就会用到连接查询
笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件
分类
按年代分类:
sql92标准:仅仅支持内连接
sql99标准【推荐】:支持内连接
+外连接(左外和右外)
+交叉连接
按功能分类:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接
右外连接
全外连接
交叉连接
sql92标准案例
SELECT NAME
,boyName
FROM boys
,beauty
WHERE beauty
.boyfriend_id
= boys
.id
;
SELECT last_name
,department_name
FROM employees
,departments
WHERE employees
.`department_id
`=departments
.`department_id
`;
SELECT e
.last_name
,e
.job_id
,j
.job_title
FROM employees e
,jobs j
WHERE e
.`job_id
`=j
.`job_id
`;
SELECT e
.last_name
,e
.job_id
,j
.job_title
FROM jobs j
,employees e
WHERE e
.`job_id
`=j
.`job_id
`;
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;
SELECT department_name
,city
FROM departments d
,locations l
WHERE d
.`location_id
` = l
.`location_id
`
AND city
LIKE '_o%';
SELECT COUNT(*) 个数
,city
FROM departments d
,locations l
WHERE d
.`location_id
`=l
.`location_id
`
GROUP BY city
;
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
`;
SELECT job_title
,COUNT(*)
FROM employees e
,jobs j
WHERE e
.`job_id
`=j
.`job_id
`
GROUP BY job_title
ORDER BY COUNT(*) DESC;
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
`
AND city
LIKE 's%'
ORDER BY department_name
DESC;
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';
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 last_name
,department_name
FROM departments d
INNER JOIN employees e
ON e
.`department_id
` = d
.`department_id
`;
SELECT last_name
,job_title
FROM employees e
INNER JOIN jobs j
ON e
.`job_id
`= j
.`job_id
`
WHERE e
.`last_name
` LIKE '%e%';
SELECT city
,COUNT(*) 部门个数
FROM departments d
INNER JOIN locations l
ON d
.`location_id
`=l
.`location_id
`
GROUP BY city
HAVING COUNT(*)>3;
SELECT COUNT(*),department_name
FROM employees e
INNER JOIN departments d
ON e
.`department_id
`=d
.`department_id
`
GROUP BY department_name
;
SELECT COUNT(*) 个数
,department_name
FROM employees e
INNER JOIN departments d
ON e
.`department_id
`=d
.`department_id
`
GROUP BY department_name
HAVING COUNT(*)>3
ORDER BY COUNT(*) DESC;
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;
SELECT salary
,grade_level
FROM employees e
JOIN job_grades g
ON e
.`salary
` BETWEEN g
.`lowest_sal
` AND g
.`highest_sal
`;
SELECT COUNT(*),grade_level
FROM employees e
JOIN job_grades g
ON e
.`salary
` BETWEEN g
.`lowest_sal
` AND g
.`highest_sal
`
GROUP BY grade_level
HAVING COUNT(*)>20
ORDER BY grade_level
DESC;
SELECT e
.last_name
,m
.last_name
FROM employees e
JOIN employees m
ON e
.`manager_id
`= m
.`employee_id
`;
SELECT e
.last_name
,m
.last_name
FROM employees e
JOIN employees m
ON e
.`manager_id
`= m
.`employee_id
`
WHERE e
.`last_name
` LIKE '%k%';
SELECT * FROM beauty
;
SELECT * FROM boys
;
SELECT b
.*,bo
.* FROM boys bo
LEFT OUTER JOIN beauty b
ON b
.`boyfriend_id
` = bo
.`id
`
WHERE b
.`id
` IS NULL;
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;
SELECT d
.*,e
.employee_id
FROM employees e
RIGHT OUTER JOIN departments d
ON d
.`department_id
` = e
.`department_id
`
WHERE e
.`employee_id
` IS NULL;
USE girls
;
SELECT b
.*,bo
.* FROM beauty b
FULL OUTER JOIN boys bo
ON b
.`boyfriend_id
` = bo
.id
;
SELECT b
.*,bo
.* FROM beauty b
CROSS JOIN boys bo
;
sql92和sql99对比
功能:sql99支持的较多可读性:sql99实现连接条件和筛选条件的分离,可读性较高
子查询
含义:出现在其他语句中的select语句,称为子查询或内查询外部的查询语句,称为主查询或外查询。分类
案例
SELECT salary
FROM employees
WHERE last_name
= 'Abel';
SELECT *
FROM employees
WHERE salary
>(
SELECT salary
FROM employees
WHERE last_name
= 'Abel'
);
SELECT job_id
FROM employees
WHERE employee_id
= 141;
SELECT salary
FROM employees
WHERE employee_id
= 143;
SELECT last_name
,job_id
,salary
FROM employees
WHERE job_id
= (
SELECT job_id
FROM employees
WHERE employee_id
= 141
) AND salary
>(
SELECT salary
FROM employees
WHERE employee_id
= 143
);
SELECT MIN(salary
) FROM employees
;
SELECT last_name
,job_id
,salary
FROM employees
WHERE salary
=(
SELECT MIN(salary
)
FROM employees
);
SELECT MIN(salary
)
FROM employees
WHERE department_id
= 50;
SELECT MIN(salary
),department_id
FROM employees
GROUP BY department_id
;
SELECT MIN(salary
),department_id
FROM employees
GROUP BY department_id
HAVING MIN(salary
)>(
SELECT MIN(salary
)
FROM employees
WHERE department_id
= 50
);
SELECT MIN(salary
),department_id
FROM employees
GROUP BY department_id
HAVING MIN(salary
)>(
SELECT salary
FROM employees
WHERE department_id
= 250
);
SELECT DISTINCT department_id
FROM departments
WHERE location_id
IN(1400,1700);
SELECT last_name
FROM employees
WHERE department_id
<>ALL(
SELECT DISTINCT department_id
FROM departments
WHERE location_id
IN(1400,1700)
);
SELECT DISTINCT salary
FROM employees
WHERE job_id
= 'IT_PROG';
SELECT last_name
,employee_id
,job_id
,salary
FROM employees
WHERE salary
<ANY(
SELECT DISTINCT salary
FROM employees
WHERE job_id
= 'IT_PROG'
) AND job_id
<>'IT_PROG';
SELECT last_name
,employee_id
,job_id
,salary
FROM employees
WHERE salary
<(
SELECT MAX(salary
)
FROM employees
WHERE job_id
= 'IT_PROG'
) AND job_id
<>'IT_PROG';
SELECT last_name
,employee_id
,job_id
,salary
FROM employees
WHERE salary
<ALL(
SELECT DISTINCT salary
FROM employees
WHERE job_id
= 'IT_PROG'
) AND job_id
<>'IT_PROG';
SELECT last_name
,employee_id
,job_id
,salary
FROM employees
WHERE salary
<(
SELECT MIN( salary
)
FROM employees
WHERE job_id
= 'IT_PROG'
) AND job_id
<>'IT_PROG';
SELECT * FROM employees
WHERE (employee_id
,salary
)=(
SELECT MIN(employee_id
),MAX(salary
)
FROM employees
);
SELECT MIN(employee_id
) FROM employees
;
SELECT MAX(salary
) FROM employees
;
SELECT * FROM employees
WHERE employee_id
=(
SELECT MIN(employee_id
)
FROM employees
)AND salary
=(
SELECT MAX(salary
)
FROM employees
);
SELECT d
.*,(
SELECT COUNT(*)
FROM employees e
WHERE e
.department_id
= d
.`department_id
`
) 个数
FROM departments d
;
SELECT (
SELECT department_name
,e
.department_id
FROM departments d
INNER JOIN employees e
ON d
.department_id
=e
.department_id
WHERE e
.employee_id
=102
) 部门名
;
SELECT AVG(salary
),department_id
FROM employees
GROUP BY department_id
;
SELECT * FROM job_grades
;
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
;
SELECT EXISTS(SELECT employee_id
FROM employees
WHERE salary
=300000);
SELECT department_name
FROM departments d
WHERE d
.`department_id
` IN(
SELECT department_id
FROM employees
);
SELECT department_name
FROM departments d
WHERE EXISTS(
SELECT *
FROM employees e
WHERE d
.`department_id
`=e
.`department_id
`
);
SELECT bo
.*
FROM boys bo
WHERE bo
.id
NOT IN(
SELECT boyfriend_id
FROM beauty
);
SELECT bo
.*
FROM boys bo
WHERE NOT EXISTS(
SELECT boyfriend_id
FROM beauty b
WHERE bo
.`id
`=b
.`boyfriend_id
`
);
分页查询
应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求。语法
select 查询列表
from 表
【
join type join 表
2
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
案例
SELECT * FROM employees
LIMIT 0,5;
SELECT * FROM employees
LIMIT 5;
SELECT * FROM employees
LIMIT 10,15;
SELECT * FROM employees
WHERE commission_pct
IS NOT NULL
ORDER BY salary
DESC LIMIT 10 ;
联合查询
含义:union (联合、合并):将多条查询语句的结果合并成一个结果。语法
查询语句
1
union 【
all】
查询语句
2
union 【
all】
...
意义
1、将一条比较复杂的查询语句拆分成多条语句2、适用于查询多个表的时候,查询的列基本是一致。
特点
1、要求多条查询语句的查询列数是一致的!2、要求多条查询语句的查询的每一列的类型和顺序最好一致3、union关键字默认去重,如果使用union all 可以包含重复项
案例
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;
SELECT id
,cname
,csex
FROM t_ca
WHERE csex
='男'
UNION
SELECT t_id
,tName
,tGender
FROM t_ua
WHERE tGender
='male';
此处需要的数据库源文件
SET NAMES utf8mb4
;
SET FOREIGN_KEY_CHECKS
= 0;
DROP TABLE IF EXISTS `t_ca
`;
CREATE TABLE `t_ca
` (
`id
` int(20) NOT NULL,
`cname
` varchar(255) CHARACTER SET utf8
COLLATE utf8_general_ci
NULL DEFAULT NULL,
`csex
` varchar(255) CHARACTER SET utf8
COLLATE utf8_general_ci
NULL DEFAULT NULL,
PRIMARY KEY (`id
`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8
COLLATE = utf8_general_ci ROW_FORMAT
= Compact
;
INSERT INTO `t_ca
` VALUES (1, '韩梅梅', '女');
INSERT INTO `t_ca
` VALUES (2, '李雷', '男');
INSERT INTO `t_ca
` VALUES (3, '李明', '男');
SET FOREIGN_KEY_CHECKS
= 1;
SET NAMES utf8mb4
;
SET FOREIGN_KEY_CHECKS
= 0;
DROP TABLE IF EXISTS `t_ua
`;
CREATE TABLE `t_ua
` (
`t_id
` int(11) NOT NULL,
`tName
` varchar(255) CHARACTER SET utf8
COLLATE utf8_general_ci
NULL DEFAULT NULL,
`tGender
` varchar(255) CHARACTER SET utf8
COLLATE utf8_general_ci
NULL DEFAULT NULL,
PRIMARY KEY (`t_id
`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8
COLLATE = utf8_general_ci ROW_FORMAT
= Compact
;
INSERT INTO `t_ua
` VALUES (1, 'john', 'male');
INSERT INTO `t_ua
` VALUES (2, 'lucy', 'female');
INSERT INTO `t_ua
` VALUES (3, 'lily', 'female');
INSERT INTO `t_ua
` VALUES (4, 'jack', 'male');
INSERT INTO `t_ua
` VALUES (5, 'rose', 'female');
SET FOREIGN_KEY_CHECKS
= 1;
欢迎斧正!!!