一:前置条件:数据库
#创建部门表
CREATE TABLE dept(
did INT(11) PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(20), des VARCHAR(30)
);
INSERT INTO dept(dname,des)VALUES("研发部门","撸代码"),("行政部门","养花") ,
("人事部","压工资")
#创建一张员工表
CREATE TABLE emp(
eid INT(11) PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20),
esal DOUBLE, edesc VARCHAR(20) ,
did int (20));
INSERT INTO emp(ename,esal,edesc,did)VALUES
("马化腾",2000,"哈哈",1) ,
("马云",3000,"呵呵",1),
("宿华",4000,"kk",2),
("刘强东",5000,"ndn",2),
("聪哥",6000,"网红是一家",3),
("吴亦凡",9000,"十八岁少女",3)
二非等值查询:
1.语法:
select * from 表1,表2
2.案例:
#查询员工的信息 以及部门的信息
SELECT d.,e. FROM dept d,emp e
结果:
总结:如上所示,一共出现了18条数据,这些数据是
dept:表三条数据
emp:表六条数据,
也就是每张表的每行互乘,即笛卡尔乘积 3*6 =18
缺陷:这么连接会产生大量的错误:,如图
三.连接查询
1.显示内连接
概念:使用mysql中inner join关键字来进行连接查询 就是显示内连接
#查询所有员工以及对应的部门的信息
SELECT d.,e. FROM dept d INNER JOIN emp e ON d.did=e.did
.
.
2.隐式内连接
概念:不使用inner join关键字来进行连接查询 就是隐式内连接,用where条件取代
SELECT d.,e. FROM dept d,emp e WHERE d.did=e.did
显示连接和隐式连接查询结果如图:
四:左外连接
1.语法:select * from 左表 left join 右表 on 匹配条件
2.匹配的规则:以左表为基准 右表一一进行匹配 如果可以匹配 则两表正常显示 如果不可以匹配,左表依然显示 右表设置为null
#不管部门下是否有员工 都需要查询出部门的信息
SELECT d.,e. FROM dept d LEFT JOIN emp e ON d.did=e.did
五:右外连接
1.语法:select * from 左表 right join 右表 on 匹配条件
2.匹配规则:以右为基准 左表一一进行匹配 如果可以匹配 则两表正常显示 如果不可以匹配 右表依然显示 左表设置为null
3.查询所有的员工的信息 不管是否有对应的部门
SELECT d.,e. FROM dept d RIGHT JOIN emp e ON d.did=e.did
六. 子查询
1.概念:一个查询语句嵌套另一个完成的查询语句
2.两种体现:A.一个子查询的结果当做另一查询语句条件使用 B.一个查询语句的结果当前另一个查询语 句的列来使用
第一种体现:
A.查询研发部门下所有的员工
B.分析: a.查询所有的员工 b.查询出部门是研发部门 c.关联条件 did
SELECT * FROM emp e WHERE e.did IN(SELECT d.did FROM dept d WHERE d.dname=“研发部门” )
第二种体现
A.查询出所有员工的信息 以及部门的名称
B.分析: 查询所有员工的信息 b.查询出部门的名称 c.关联条件 did
C.SELECT e.*,(SELECT d.dname FROM dept d WHERE d.did=e.did) AS dname FROM emp e