MySQL入门 DQL语言之七:sql92语法值连接查询(多表查询)

MySQL入门 DQL语言之六:sql92语法值连接查询(多表查询)

#6:连接查询
/*
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询

笛卡尔集乘积现象:表1 有n行,表2有m行,结果等于n*m行

发生原因:
    ①没有有效的连接条件
    ②省略连接条件
    ③所有表中的所有行相互连接
如何避免:添加有效的连接条件

分类:
    按年代分类:
    sql92标准:仅仅支持内连接
    sql99标准【推荐】:支持内连接+外链接(左外和右外)+交叉链接
    
    按功能分类:
        内连接:
            等值连接
            非等值连接
            自连接
        外链接:
            左外连接
            右外链接
            全连接
        交叉链接
*/

SELECT * FROM beauty;
SELECT * FROM boys;
#这样会产生笛卡尔集,即是两个表的总行数相乘
SELECT NAME,boyName FROM boys,beauty;
#添加有效连接条件
SELECT NAME,boyName FROM boys,beauty
WHERE beauty.`boyfriend_id` =  boys.`id`;

#一: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、为表起别名
/*
①提高语句的简洁度
②区分多个重名的字段

注意:如果为表起了别名,则查询字段就不能用原来的表名去限定
*/
#查询员工名、工种号、工种名

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

#3、两个表顺序是否可以调换
#查询员工名、工种号、工种名

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

#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:查询城市民中第二个字符为0的部门名和城市名
SELECT department_name,city
FROM departments d,locations l
WHERE l.`location_id` = d.`location_id`
AND city LIKE '_o%'

#5、可以加分组
#案例1:查询每个城市的部门个数

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

#案例2:查询出有奖金的每个部门的部门的领导编号和该部门的最低工资
SELECT department_name,d.manager_id,MIN(salary)
FROM employees e,departments d
WHERE e.`department_id` = d.`department_id`
AND commission_pct IS NOT NULL 
GROUP BY department_name,d.`manager_id`;
#6、可以加排序
#案例:每个工种的工种名和员工个数并且按员工个数降序

SELECT j.`job_title`,COUNT(*)
FROM jobs j,employees e
WHERE j.`job_id` = e.`job_id`
GROUP BY j.`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`;

#二、非等值连接
#案例1:查询出员工的工资和工资级别

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

#二、自连接
#案例1:查询员工名和上级的名称

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`;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值