如果我们直接按照普通的查询会出现什么问题?
按照普通的查询会产生笛卡尔积也就是会将所有可能性都查询出来,这样我们得到的数据是错误的。
-- 产生笛卡尔积
SELECT * from emp,dept;
-- 消除无效数据,查询emp和dept的数据,emp_id和dept_id应该相同
SELECT * FROM emp,dept WHERE emp.dep_id=dept.id;
查询有哪些分类?
主要分为链接查询和子查询,他们之间有时可以相互转化。
连接查询分为内连接和外链接。
内连接
-- 隐式内连接
-- 消除无效数据,查询emp和dept的数据,emp_id和dept_id应该相同
SELECT * FROM emp,dept WHERE emp.dep_id=dept.id;
-- 想要查询表中部分的数据
SELECT emp.name,emp.age,dept.dep_name FROM emp,dept WHERE emp.dep_id=dept.id;
-- 可以给表起别名减少书写
SELECT t1.`name`,t1.age,t2.dep_name FROM emp as t1, dept as t2 WHERE t1.dep_id=t2.id;
-- 显示内连接
SELECT * FROM emp INNER JOIN dept ON emp.dep_id=dept.id;
-- INNER可以省略不写
SELECT * FROM emp JOIN dept ON emp.dep_id=dept.id;
外链接
一般情况下,我们会选择使用左外链接
实际上左右外链接是一样的,只需要在 xxx left join on xxx,两个变量之间互换就好。
-- 左外链接
-- 查询emp表所有的数据和对应部门的信息
SELECT * FROM emp LEFT JOIN dept ON emp.dep_id=dept.id;
-- 右外链接
-- 查询dept表所有的数据和对应的员工信息
SELECT * FROM emp RIGHT JOIN dept ON emp.dep_id=dept.id;
子查询
查询中嵌套查询
-- 子查询:查询之中嵌套查询
-- 当行单列
-- 查询比张三大的人 步骤一:查询出张三的年纪 步骤二:查询出大于张三的年纪
SELECT age FROM emp WHERE name='张三';
SELECT name,age FROM emp WHERE age>20;
-- 我们还可以放在一起写
SELECT `name`,age FROM emp WHERE age>(SELECT age FROM emp WHERE name='张三');
-- 单行多列
-- 查询研发部和销售部所有的员工信息
SELECT id FROM dept WHERE `dep_name`='研发部' or dep_name='销售部';
SELECT * FROM emp WHERE dep_id in (SELECT id FROM dept WHERE `dep_name`='研发部' or dep_name='销售部');
-- 多行多列:作为虚拟表
-- 查询年龄是20岁以后的员工信息和部门信息
-- 查询20岁以后的员工信息
SELECT * FROM emp WHERE age>20;
-- 通过隐式内连接查询所有员工对应的部门
SELECT * FROM emp,dept WHERE emp.dep_id=dept.id;
-- 我们想要在员工对应部门表做一个筛选,筛选出来员工年纪大于20岁的人
-- 子查询多行多列我们可以制作一个虚拟表和内连接表进行内连接查询。
-- 注意:在查询的时候需要给虚拟表起别名来进行id约束
SELECT * FROM (SELECT * FROM emp WHERE age>20) as t1,dept WHERE t1.dep_id=dept.id;