一 .等值查询和非等值查询--多表联查
1. 等值查询
等值连接指的是,多表查询语句中的连接条件使用的是等号。例如:
SELECT employee_id, department_name
FROM employees, departments
WHERE employees.`department_id` = departments.`department_id`;
其中第3行代码,它就是连接条件,它使用了等号,称为等值连接。
2.非等值查询
对应地,多表查询语句中的连接条件不是使用等号的称为非等值连接
tips 其中:
•
与单表查询类似,都是SELECT语句;
•
把多个表放到FROM后,并用逗号隔开;
•
可使用AS关键字取别名,便于引用;
•
如无重名查询字段则可省略数据表的指定。
二. 连接查询(多表查询)
连接查询又称多表查询,当查询的字段涉及多个表的时候,就要用到连接查询
# INNER JOIN 后加表 on 后面加判断关系
举例: 用=笛卡尔积中实现去重 ,取出两个表中都存在的且 Ssex = '男' 的
SELECT * from student INNER JOIN class ON student.classid= class.classid
WHERE Ssex ='男';
-- 外联查询
-- 左外联
LEFT JOIN ON -- join 左边的表为主表,右边的表为从表
举例: 以 student 为主表 (在 左)class为从表的 左联查
SELECT * FROM student
LEFT JOIN class on student.classid=class.classid
-- 右外联
RIGHT JOIN ON -- join 右边的表为主表,左边的表为从表
SELECT sname,classname FROM class RIGHT JOIN
select count(字段名) from 表名 where 条件(ssex ='男');
--union
union是求两个查询的并集。 union合并的是结果集,不区分来自于哪一张表,所以可以合并多张表查询出来的数据。
语法:
select A.field1 as f1, A.field2 as f2 from <table1> A
union
(select B.field3 as f1, field4 as f2 from <table2> B)
order by
字段
desc/asc
注意:
1
列名不一致时,会以第一张表的表头为准,并对其栏目。
2
会将重复的行过滤掉。
3
如果查询的表的列数量不相等时,会报错。
4
在每个子句中的排序是没有意义的,
mysql
在进行合并的时候会忽略掉。
5
如果子句中的排序和
limit
进行结合是有意义的。
6
可以对合并后的整表进行排序
举例: 查找 一二班中 排名数最大的
SELECT * FROM student WHERE sid =(SELECT MAX(sid) from student WHERE classid=1)
UNION
SELECT * FROM student WHERE sid =(SELECT MAX(sid) from student WHERE classid=2)
tips: union 自带去重, union all不去重 union all 是求两个查询的并集,但是不会把重复的过滤掉,而是全部显示出来。
三.子查询
-- 子查询需要用()括起来 .子查询又叫内部查询
举例 :
SELECT * from student where sid = (SELECT MAX(sid) from student);
where 型子查询
举例:
SELECT * from student where sid in( SELECT MAX(sid) FROM student GROUP BY classid )
from 型子查询
举例:
select avg_table.id,
avg_table.avg_score,
chapter13_user.name,
chapter13_user.sex,
chapter13_user.class
from
(select id,
avg(score) as avg_score
from demo.chapter13_score
group by id
having avg_score > 600) as avg_table
left join
demo.chapter13_user
on demo.chapter13_user.id = avg_table.id;
exists
型子查询
:
举例
SELECT * FROM teacher WHERE EXISTS(SELECT * from student WHERE Ssex='外星人')