数据库管理工具之mysql的多表查询&子查询详解

表与表之间的关系:

1.一对多的关系

2.多对多的关系

3.一对一的关系

多表查询:

从多个表中查询查询出记录

语法:

select 字段列表 from 表名的列表

SELECT COUNT(1) FROM employees;

SELECT COUNT(1) FROM departments;

笛卡尔积错误:

SELECT * FROM employees,departments;出现很多行数据

解决笛卡尔错误:

加上多表的关联关系,就可以解决这个错误

--查询出员工编号,姓名,工资,部门名称

DESC employees;

DESC departments;

SELECT employee_id,first_name,salary,department_name

FROM employees,departments

WHERE employees.DEPARTMENT_ID=departments.department_id;

连接查询:

内关联:相当于两个表中的共公部分的数据

SELECT * FROM info1 ,info3 WHERE info1.id=info3.id;

SELECT * FROM info1 JOIN info3 ON info1.id=info3.id;

两个语法所得出的结果是一样的

外关联:

1.左关联 以左表为主,右能关联上的内容用右表中的值填充,

关联不上的内容用null 填充分

SELECT * FROM 左1 LEFT JOIN 右表1 ON 两表关联的条件;

SELECT * FROM info1 LEFT JOIN info3 ON info1.id=info3.id;

2.右关联 以右表为主, 左能关联上的内容用左表中的值填充,

关联不上的内容用null 填充分

SELECT * FROM 左1 right JOIN 右表1 ON 两表关联的条件;

SELECT * FROM info1 right JOIN info3 ON info1.id=info3.id;

3.自连接

SELECT * FROM 表1 JOIN 表1 ON 条件;

--查询员工的编号,姓名和他的领导的编号和姓名

--查询出所有c01课的分数大等C02 课程的所有学生的学号,成绩

SELECT * FROM sc sc1 JOIN sc sc2 ON sc1.sno=sc2.sno

WHERE sc1.cno='c01' AND sc2.cno='c02' AND sc1.grade>sc2.grade;

巩固练习:

1.查询出没有成绩的学生的信息

SELECT * FROM student s LEFT JOIN sc ON s.sno=sc.sno

WHERE grade IS NULL ;

2.查询出没有及格的学生学号,课程,成绩

SELECT sno,cname,grade FROM sc RIGHT JOIN course ON sc.cno=course.cno

WHERE grade<60 OR grade IS null;

3.查询学习计算机的学生信息和成绩并按成绩降序排列,取前3名。

SELECT * FROM student LEFT JOIN sc ON student.sno=sc.sno

WHERE sdept LIKE '%计算机%'

ORDER BY grade desc

LIMIT 3;

4.统计每个学生的总分,并排序,从第二名开始取3全学生的信息

SELECT SUM(grade) summ,sno

FROM sc

GROUP BY sno

ORDER BY summ

LIMIT 1,3;

子查询:

SQL语句包含select语句,或者说select 中嵌套了select

嵌套的位置:

WHERE 之后 ,from 之后,select之后

--实例:查询李勇的成绩

1.查询出李勇学号

SELECT sno FROM student WHERE sname='李勇';

2.通过学号查出成绩

SELECT sno,grade FROM sc WHERE sno=(SELECT sno FROM student WHERE sname='李勇');

巩固:

1. 查询员工的last_name, department_id, salary.其中员工的salary,department_id与有奖金的任何一个员工的salary,department_id相同即可

2. 选择工资大于所有JOB_ID = 'SA_MAN'的员工的工资的员工的last_name, job_id, salary

3. 选择所有没有管理者的员工的last_name

简单:

1.查询学号为9512101的c01成绩相同的学生信息

分解:

a.查询出学号为9512101的c01成绩

select grade from sc where sno='9512101' and cno='c01'

b.查询出与这个成绩相等的学生信息

SELECT sno FROM sc

WHERE grade=

( select grade

from sc

where sno='9512101'

and cno='c01')

AND sno<>'9512101';

c.通过学号查学生信息

SELECT * FROM student WHERE sno IN (

SELECT sno FROM sc

WHERE grade=

( select grade

from sc

where sno='9512101'

and cno='c01')

AND sno<>'9512101'

)

2.查询学习了数据结构的学生的信息

分解:

a.查询出数据结构的课程编号

b.通过课程编号查询出学号

c.通过学号查询学生信息

列子查询----子查询中返回的内容有多行

常用的运算符:IN,NOT IN ,ANY,ALL

ANY---子查询返回列中有任意一个满足

ALL ---子查询返回的列中所有的满足

实例:

--查询出比30号部门员工工资都低的员工信息

a.查询出30 号部门所有员工工资

b.查询出最小的工资

SELECT MIN(salary)

FROM employees

WHERE department_id=30

c.查询出其他员工资比30号部门最小的工资的信息才展示

SELECT * FROM employees

WHERE salary<(SELECT MIN(salary)

FROM employees

WHERE department_id=30)

AND department_id!=30;

SELECT * FROM employees

WHERE salary< ALL(SELECT salary FROM employees WHERE department_id=30)

;

--查询出比30号部门号任意一个员工工资都低的员工信息

SELECT * FROM employees

WHERE salary< any(SELECT salary FROM employees WHERE department_id=30)

department_id!=30;

三表查询

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

叫我团子吧

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

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

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

打赏作者

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

抵扣说明:

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

余额充值