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; |
SQL语句之 多表管理的更多相关文章
- sql语句中----删除表数据drop、truncate和delete的用法
sql语句中----删除表数据drop.truncate和delete的用法 --drop drop table tb --tb表示数据表的名字,下同 删除内容和定义,释放空间.简单来说就是把整 ...
- SQL语句查询某表的所有字段及数据类型
SQL语句查询某表的所有字段及数据类型 SELECT name AS column_name , TYPE_NAME(system_type_id) AS column_type , max_leng ...
- (转载)用SQL语句创建Access表
<来源网址:http://www.delphifans.com/infoview/Article_220.html>用SQL语句创建Access表 很久以前弄的,用了一天的时间,没有什么技 ...
- 使用sql语句获取数据库表的信息
下面的sql语句可以查看表的信息.其中modify_date和create_date可以根据表的修改时间来查看.如果不需要删除后,就能看到所有表的字段信息 ) PERCENT d.name AS 表名 ...
- [转]关于oracle sql语句查询时表名和字段名要加双引号的问题
oracle初学者一般会遇到这个问题. 用navicat可视化创建了表,可是就是不能查到! 后来发现②语句可以查询到 ①select * from user; 但是,我们如果给user加上双引 ...
- ylb:sql语句重命名表名和列名
ylbtech-SQL Server:SQL Server-sql语句重命名表名和列名 sql语句重命名表名和列名 ylb:sql语句重命名表名和列名 返回顶部 一.更改数据库名 sp_rena ...
- 关于oracle sql语句查询时 表名和字段名要加双引號的问题具体解释
作为oracle的刚開始学习的人相信大家一定会遇到这个问题.如图: 明明就是navicat可视化创建了表,但是就是不能查到!这个为什么呢? select * ...
- sql语句对数据库表进行加锁和解锁
锁是数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性. 我们知道,多个用户能够同时操纵同一个数据库中的数据,会发生数据不一致现象.即如果没有锁定且多个用户同时访问一个数据库 ...
- 基本 SQL 之数据库及表管理
上篇文章,我们基于『数据库』做了一个宏观上的介绍,你应当了解到数据库是在何种背景下,为了解决什么样的问题而诞生的,以及在具体实现下又可以划分哪些中类型. 非关系型数据库的种类很多,我们会在后续的篇章中 ...
随机推荐
- Docker:搭建私有仓库(Registry 2.4)
一.背景 首先,Docker Hub是一个很好的用于管理公共镜像的地方,我们可以在上面找到想要的镜像(Docker Hub的下载量已经达到数亿次):而且我们也可以把自己的镜像推送上去.但是,有的时候, ...
- [Java] I/O底层原理之三:NIO
本篇文章参考自并发编程网 一.NIO 的概述 NIO 由以下几个核心组成 Channels Buffers Selectors 选择器用于监听多个通道的事件(如:链接打开.数据达到),单个线程可以监听 ...
- jeesite快速开发平台---数据库各表一览
jeesite中一共有55张表,如下 其中以act_*开头的是Activity工作流的表,cms_*开头的是内容管理系统的表,oa_*开头的是办公自动化,sys_*开头的是系统表,test_*开头的是 ...
- Dubbo学习笔记6:Dubbo增强SPI与SPI中扩展点自动包装的实现原理
在Dubbo整体架构分析中介绍了Dubbo中除了Service和Config层为API外,其他各层均为SPI,为SPI意味着下面各层都是组件化可以被替换的,也就是扩展性比较强,这也是Dubbo比较好的 ...
- hdu 4857 Little Devil I
http://acm.hdu.edu.cn/showproblem.php?pid=4897 题意:给你一棵树,边的颜色要么为白色,要么为黑色,初始每条边为白色,有三种操作 1.将u-v链上面的所有边 ...
- CF876 D 树状数组
大意就是放n个硬币,每次放一个计算下这种情况下的操作次数,一个操作为从左到右扫描,如果一个硬币右边是空的,就将硬币后移,否则该次操作停止. 显然发现对于一个情况,我们只要考虑最右边的空位的左侧有几个硬 ...
- dwz中给表单项获取,设置值
$.pdialog._current.find('form input#inputId').val(54);
- python 获取二进制文件
import requests response = requests.get('https://www.baidu.com/aladdin/img/tools/ip.png')with open(' ...
- Insert Interval & Merge Intervals
Insert Intervals Given a non-overlapping interval list which is sorted by start point. Insert a new ...
- Linux中断(interrupt)子系统之四:驱动程序接口层 & 中断通用逻辑层【转】
转自:http://blog.csdn.net/droidphone/article/details/7497787 在本系列文章的第一篇:Linux中断(interrupt)子系统之一:中断系统基本 ...