sql多表管理语句代码示例

发布时间:2020-07-12编辑:脚本学堂
有关sql语句实现多表管理的方法,sql数据库外键作用、sql语句中级联更新与级联删除操作的例子,sql多表关联语句,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)
);

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

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;