mysql的多表查询
发布日期:2022-02-01 14:28:18 浏览次数:33 分类:技术文章

本文共 3459 字,大约阅读时间需要 11 分钟。

1.1多表的关系

多个表之间是有关系的,那么关系靠谁来维护?

多表约束:外键约束。

1.1.1 一对多关系

客户和订单,分类和商品,部门和员工.

一对多建表原则:在多的一方创建一个字段,字段作为外键指向一方的主键

1.1.2 多对多关系

学生和课程:一个学生可以选择多门课程,一门课程也可以被多个学生选择。

多对多关系建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键.

1.1.3一对一关系

一个丈夫对应一个妻子

一个员工对应一个简历
在实际的开发中应用不多.因为一对一可以创建成一张表.
两种建表原则:
唯一外键对应:在多的一方创建一个外键指向一的一方的主键,将外键设置为unique和非空.
主键对应:让一对一的双方的主键进行建立关系.

1.2 多表查询

1 合并结果集;UNION 、 UNION ALL

2 连接查询
2.1内连接 [INNER] JOIN ON
2.2外连接 OUTER JOIN ON

  • 左外连接 LEFT [OUTER] JOIN
  • 右外连接 RIGHT [OUTER] JOIN

3 子查询

1.2.1 合并结果集

作用:合并结果集就是把两个select语句的查询结果合并到一起

合并结果集有两种方式:

l UNION:去除重复记录,例如:SELECT* FROM t1 UNION SELECT * FROM t2;

l UNION ALL:不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。

注意:合并结果集前提是两个表的列数一行要相同,列类型可以不同。

在这里插入图片描述

不去重复查询

在这里插入图片描述1.2.2 连接查询
连接查询就是求出多个表的乘积,例如t1连接t2,那么查询出的结果就是t1*t2
在这里插入图片描述连接查询会产生笛卡尔积,假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。可以扩展到多个集合的情况。

那么多表查询产生这样的结果并不是我们想要的,那么怎么去除重复的,不想要的记录呢,当然是通过条件过滤。通常要查询的多个表之间都存在关联关系,那么就通过关联关系去除笛卡尔积

示例: 现在有两张表

student表:主键为id,外键为cid(课程号)
在这里插入图片描述
course表:主键cid
在这里插入图片描述
执行连接查询:
SELECT * FROM student,course;
执行结果:
在这里插入图片描述
可以看到有很多重复的无用信息这是我们可以根据主外键的联系去除重复数据
连接查询(使用主外键关系做为条件来去除无用信息)
SELECT * FROM student,course WHERE student.id=course.id;
结果为:
在这里插入图片描述

上面虽然有过滤无用的信息,但是列全部都显示出啦,接下来查询指定列的数据

course表中只指定了score
SELECT student.id,student.name,student.sex,course.score
FROM student,course
WHERE student.cid=course.cid;
在这里插入图片描述

1.2.2.1 内连接

内连接(上面的连接查询语句其实就是内连接语句 只不过不标准 戏称为方言 接下来看标准的sql内连接语句) ON 后面跟主外键关系 这里用ON代替where
student s和course c分别是起的别名
SELECT * FROM student s INNER JOIN course c
ON s.cid=c.cid;
查询结果:
在这里插入图片描述

同样 用内连接语句来查询指定的列

SELECT s.id,s.name,s.sex,c.score FROM student s INNER JOIN course c
ON s.cid=c.cid;
在这里插入图片描述

1.2.2.2 外连接

外连接(包括左外连接和右外连接,外连接的特点:查询出的结果存在不满足条件的可能。)
a.左外连接:以左表为主表,右表是从表
SELECT * FROM student s LEFT OUTER JOIN course c ON s.cid=c.cid;
在这里插入图片描述
可以看出 ,尽管course表中有一个score为空 但是 以左表为主表还是查出来null了

b.右外连接:以右表为主表,左表是从表

SELECT * FROM student s RIGHT OUTER JOIN course c ON s.cid=c.cid;
在这里插入图片描述

可以看出虽然cid为5的没有学生,由于是右表为主表,左边表即使没有数据也会查出来。

1.3 子查询

一个select语句中包含另一个完整的select语句。
子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。里面的查询叫做子查询,外层的查询叫父查询,一般情况都是先执行子查询,再执行父查询。
i 子查询出现的位置:
​ a. where后,作为被查询的条件的一部分;
​ b. from后,作临时表;

ii 当子查询出现在where后作为条件时,还可以使用如下关键字:

​ a. any
​ b. all

iii 子查询结果集的常见形式:

​ a. 单行单列(用于条件)
​ b. 多行单列(用于条件)
​ c. 多行多列(用于表)

示例:

1. 工资高于JONES的员工。

分析:

查询条件:工资>JONES工资,其中JONES工资需要一条子查询。

第一步:查询JONES的工资

SELECT sal FROM emp WHERE ename='JONES';

第二步:查询高于JONES工资的员工

SELECT * FROM emp WHERE sal > (第一步结果);

结果:

SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename='JONES');

2. 查询与SCOTT同一个部门的员工。

l 子查询作为条件

l 子查询形式为单行单列

分析:

查询条件:部门=SCOTT的部门编号,其中SCOTT 的部门编号需要一条子查询。

第一步:查询SCOTT的部门编号

SELECT deptno FROM emp WHERE ename='SCOTT';

第二步:查询部门编号等于SCOTT的部门编号的员工

SELECT * FROM emp WHERE deptno = (SELECT deptno FROM emp WHERE ename='SCOTT');

3. 工资高于30号部门所有人的员工信息

分析:

SELECT * FROMemp WHERE sal>(SELECT MAX(sal)FROM emp WHERE deptno=30);

查询条件:工资高于30部门所有人工资,其中30部门所有人工资是子查询。高于所有需要使用all关键字。

第一步:查询30部门所有人工资

SELECT sal FROM emp WHERE deptno=30;

第二步:查询高于30部门所有人工资的员工信息

SELECT * FROM emp WHERE sal > ALL (第一步)

结果:

SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30)

l 子查询作为条件

l 子查询形式为多行单列(当子查询结果集形式为多行单列时可以使用ALL或ANY关键字)

4.from后面子查询

SELECT ename,job,hiredate FROM (SELECT ename,job,hiredate FROM emp WHERE hiredate>'1987-1-1') AS temp;
1.3 创建用户和授权

要使用命令行登录。

创建用户

CREATE USER `zhangsan` IDENTIFIED BY '123';CREATE USER `zhangsan`@`localhost` IDENTIFIED BY '123';

授权

GRANT ALL ON school.* TO `zhangsan`;

撤销权限

REVOKE ALL ON school.* FROM `zhangsan`;

删除用户

DROP USER `zhangsan`;

转载地址:https://blog.csdn.net/shunshizhen120412/article/details/100167049 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:IDEA创建配置Tomcat和创建web项目及其打war包
下一篇:过滤器的基本配置以及几个典型案例(实现自动登录,屏蔽脏词,禁止浏览器缓存动态页面,带缓存过滤器)

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年03月29日 05时15分02秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章