SQL语句之 多表管理

一个数据库内通常会有不止一张表,有时候我们要把多张表联系起来,这就需要用到多表管理的语句。

1.外键约束

一个表中的非主键字段,如果在另外一张表中是主键,那么这个字段我们叫它做外键。

例如,现在有两个表:

学生表 - 学号,姓名,性别,所在班级号

班级表 - 班级号,班级人数

在学生表中,学号是主键;在班级表中,班级号是主键,而学生表中‘所在班级号’是非主键。所以,所在班级号对学生表来说是一个外键。

语句:CONSTRAINT student_class_fk FOREIGN KEY (classid) REFERENCES class(cid)

外键的名字 副表属性 绑定   主表属性

先创建主表:

CREATE TABLE class(

cid INT PRIMARY KEY,

ccount INT

);

然后创建副表来加入外键:

CREATE TABLE student(

sid INT PRIMARY KEY,

sname VARCHAR(20),

sex VARCHAR(4),

classid INT,

CONSTRAINT student_class_fk FOREIGN KEY (classid) REFERENCES class(cid)

);

外键的作用:

  1. 往副表插入数据,数据中外键的值在主表必须存在。
  2. 删除主表的主键某个数据之前,先要把副表中依赖那个数据的外键值改变,才能顺利删除。

2.级联操作

如果想要在主表把主键的值改变,然后副表外键的值跟着改变,那么就要需要级联操作。

2.1级联更新

CONSTRAINT student_class_fk FOREIGN KEY (classid) REFERENCES class(cid) ON UPDATE CASCADE -- 级联更新(更新主表数据,副表会跟着改变)

2.2级联删除

CONSTRAINT student_class_fk FOREIGN KEY (classid) REFERENCES class(cid) ON DELETE CASCADE -- 级联删除(删除主表数据,副表会跟着删除)

3.多表查询

3.1 交叉查询

-- 2.1 交叉查询(产生笛卡尔积: 表1的总记录 * 表2的总记录) (不希望出现)

SELECT sid,cid FROM student,class;

3.2 内连接

-- 2.2 内连接查询(使用最频繁)

-- 特点: 要在满足表条件的前提的数据才显示出来(不包括null值)

-- 多表查询的思路: 1) 确定有哪些表  2)确定查询出哪些字段   3)确定表和表之间的关系(条件数据: n-1)

-- 需求: 查询1班学生的姓名和1班的人数

SELECT s.sname,c.ccount   -- 哪些字段

FROM  student s,class c        -- 哪些表

WHERE s.classid=c.cid; -- 表的条件

SELECT s.sname,c.ccount

FROM student s

INNER JOIN class c     -- inner join : 内连接查询

ON s.classid=c.cid;

3.3 左外连接

-- 2.3 左外连接

-- 需求: 查询哪个班有哪些学生

-- 左外连接查询: 用左边的表数据去匹配右边的表数据,右边表数据如果匹配成功,则显示记录,如果匹配不成功,则显示null

SELECT s.sname,c.cid

FROM  s.sname

LEFT OUTER JOIN class c

ON s.classid=c.cid;

3.4 右外连接

-- 2.4 右外连接: 和左外连接相反

-- 右外连接查询: 用右边的表数据去匹配左边的表数据,左边表数据如果匹配成功,则显示记录,如果匹配不成功,则显示null

SELECT s.sname,c.cid

FROM class c

RIGHT OUTER JOIN s.sname

ON s.classid=c.cid;

3.5 自连接

-- 2.5 自连接(当前表连接当前表)

自连接就是把同一张表虚拟出两份一模一样的表,然后起一个别名,然后连接两张表来查询。

SELECT e.ename,b.ename

FROM employee e -- 员工表

LEFT OUTER JOIN employee b  -- 上司表

ON e.boosId=b.eid;

最新文章

  1. RabbitMQ、Rdis
  2. SSIS内存不足
  3. Android Activity的onSaveInstanceState() 和 onRestoreInstanceState()方法:
  4. Struts2配置细节
  5. .net Signalr 使用笔记
  6. MySQL指令记录(Wampserve环境)
  7. jquery自动识别输入的都是数字
  8. C++中 auto自己主动变量,命名空间,using作用以及作用域
  9. Form表单的post 和get跳转区别
  10. aJax请求结果中包含form的问题
  11. C#.Net调用VB.Net中的MY
  12. linux下read命令详解
  13. DoTween动画中的几种函数。
  14. Android悬浮框,在Service中打开悬浮窗;在Service中打开Dialog;
  15. canvas 动画 时钟clock
  16. 监听textarea文本框文本输入情况
  17. vue 使用出现的问题(持续记录)
  18. 安装chrome jsonView插件
  19. C++之正则表达式20171121
  20. 11个你应该知道的django博客引擎

热门文章

  1. Python数据分析初始(一)
  2. vue npm start 自动打开网页
  3. Hadoop源码阅读-HDFS-day1
  4. 关于css中a标签的样式
  5. Codeforces 835E. The penguin's game
  6. bzoj千题计划205:bzoj3529: [Sdoi2014]数表
  7. 第一、介绍Canvas
  8. HDU 2073 无限的路 (模拟)
  9. 基于theano的多层感知机的实现
  10. linux(CentOS7)中安装erlang(20.3)以及rabbitmq(3.7.9)的步骤以及一些注意事项