mysql五表查询_MySQL(五) 多表查询

5 多表操作

5.1. 外键

引用另一个表中的一列或者多列,被引用的列应该具有主键约束或者非空约束

搭建环境,在数据库test中创建主表class:

CREATE TABLEclass(

cidINT(4) NOT NULL PRIMARY KEY,

cnameVARCHAR(10)

);

5.1.1 添加外键约束

(1) 在创建表的同时为表添加外键(在从表中添加SQL语句)

格式:CONSTRAINT 自定义外键名 FOREIGN KEY (从表引用字段名)

REFERENCES 主表名 (主表被引用字段名)

CREATE TABLEstudent(

sidINT(4),

snameVARCHAR(10),

cidINT(4),CONSTRAINT FK_ID FOREIGN KEY (cid) REFERENCESclass (cid)

);

cfd64eac6c7bc991b24a74c6172a1d5b.png

(2) 为已存在的表添加外键

搭建环境,在数据库test下创建数据表pupil(先删除数据表student)

CREATE TABLEpupil(

sidINT(4),

snameVARCHAR(10),

cidINT(4)

);

格式:ALTER TABLE 从表名 ADD CONSTRAINT 自定义外键名

FOREIGN KEY (从表引用字段名)

REFERENCES 主表名 (主表被引用字段名)

ALTER TABLE pupil ADD CONSTRAINTFK_IDFOREIGN KEY(cid)REFERENCES class (cid);

ef4d80d89f72681093ba746403844260.png

5.1.2 删除外键约束

格式:ALTER TABLE 从表名

DROP FOREIGN KEY 外键名

ALTER TABLEpupilDROP FOREIGN KEY FK_ID;

5.2. 操作关联表

5.2.1 关联关系

一对多(班级与学生):将外键建在多的一方。

多对多(课程与学生):定义一张中间表(连接表),该表会存在两个外键,分别参照课程表和学生表

一对一(人与身份证):从主从关系入手,从表需要主表的存在才有意义

5.2.2 添加数据

给从表添加数据时,它引用的字段必须为主表中被引用字段的值

5.2.3 删除数据

在具有关联关系的表中删除数据时,一定要先删除从表中的数据,然后再删除主表中的数据,否则会报错

5.3. 连接查询

下面的两张表通过相同意义的字段模拟外键约束,并没有真正的外键约束,但其特点和外键是一样的,可以通过这些字段对不同的表进行连接查询

搭建查询环境,在数据库test下创建数据表department和employee

CREATE TABLEdepartment(

didINT(4) NOT NULL PRIMARY KEY,

dnameVARCHAR(20)

);

CREATE TABLEemployee(

idINT(4) NOT NULL PRIMARY KEY,

nameVARCHAR(10),

ageINT(2),

didINT(4) NOT NULL);

在两个表中插入相关数据

INSERT INTOdepartmentVALUES (1,'network'),(2,'media'),(3,'development'),(5,'personnel');

605f33c7e6b80e6d78b4f340ce592325.png

INSERT INTOemployeeVALUES (1,'Zhou',20,1),(2,'Will',22,1),(3,'Marry',20,2),(4,'Jin',20,4);

f121d19acf21f4587e47ed8e59b5d99f.png

5.3.1 交叉连接(笛卡尔积)

格式:SELECT 字段名 FROM 主表CROSS JOIN 从表;

SELECT * FROM department CROSS JOIN employee;

相当于:

SELECT * FROM department,employee;

3e3094d250649749cd4957b95fa4e0d0.png

5.3.2 内连接(自然连接)

格式:SELECT 字段名 FROM 主表

[INNER] JOIN 从表

ON 主表.关系字段=从表.关系字段

SELECTdepartment.dname,employee.nameFROM department INNER JOINemployeeON department.did=employee.did;

相当于:

SELECTdepartment.dname,employee.nameFROMdepartment,employeeWHERE department.did=employee.did;

33357bc6b6a25c22789dac626e3a7400.png

5.3.3 外连接

(1) 左连接:以左表为准,去右表找数据,找不到,用null补齐

格式:SELECT 字段名 FROM 左表

LEFT JOIN 右表

ON 左表.关系字段=右表.关系字段

SELECTdepartment.dname,employee.nameFROM department LEFT JOINemployeeON department.did=employee.did;

a05cdb7183fb5e40f8a24369f51ccde7.png

(2) 右连接:以右表为准,去左表找数据,找不到,用null补齐

格式:SELECT 字段名 FROM 左表

RIGHT JOIN 右表

ON 左表.关系字段=右表.关系字段

SELECTdepartment.dname,employee.nameFROM department RIGHT JOINemployeeON department.did=employee.did;

be6684147c29de0071310cce6e765231.png

注意:在左连接中互换左右表的位置,同样可以得到右连接的效果

(3) 全连接(FULL JOIN):MySQL不支持,可以通过左连接UNION右连接得到

5.3.4 子查询

(1) 带IN关键字的子查询

使用IN关键字进行子查询时,内层查询语句仅返回一个数据列,这个数据列中的值将供外层查询语句进行比较操作

例:查询存在20岁的员工的部门

SELECT dname FROMdepartmentWHERE did IN(SELECT did FROM employee WHERE age=20);

060c240daf70cd48dd9db6a54a172c2d.png

(2) 带EXISTS关键字的子查询

EXISTS关键字后面的参数可以是任意一个子查询,这个子查询的作用相当于测试,它不会产生任何数据,只返回TRUE或FALSE,当返回值为TRUE时,外层查询才会执行。

例:查询是否存在年龄大于21岁的员工,如果存在,则查询department表中所有的记录

SELECT dname FROMdepartmentWHERE EXISTS(SELECT did FROM employee WHERE age>21);

dedcc7c7ac4da773277805aa62ffc5e6.png

(3) 带ANY关键字的查询

ANY关键字表示满足其中任意一个条件,它允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询的任意一个比较条件,就返回一个结果作为外层查询条件

SELECT * FROMdepartmentWHERE did>ANY (SELECT did FROM employee);

bddf995c259e27b97eb8817f2a594704.png

(4) 带ALL关键字的子查询

ALL关键字表示满足所有的条件,子查询返回的结果需同时满足所有的内层查询条件

SELECT * FROMdepartmentWHERE did>ALL (SELECT did FROM employee);

0e1af5885758d29c4d0e1bac4c88f897.png

(5) 带比较运算符的子查询

SELECT * FROMdepartmentWHERE did=(SELECT did FROM employee WHERE name='Marry');

df216a893aba71c3d7b8559fb69631f9.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值