表与表之间的关系:
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;
三表查询