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;

SQL语句之 多表管理的更多相关文章

  1. sql语句中----删除表数据drop、truncate和delete的用法

    sql语句中----删除表数据drop.truncate和delete的用法 --drop drop table  tb   --tb表示数据表的名字,下同 删除内容和定义,释放空间.简单来说就是把整 ...

  2. SQL语句查询某表的所有字段及数据类型

    SQL语句查询某表的所有字段及数据类型 SELECT name AS column_name , TYPE_NAME(system_type_id) AS column_type , max_leng ...

  3. (转载)用SQL语句创建Access表

    <来源网址:http://www.delphifans.com/infoview/Article_220.html>用SQL语句创建Access表 很久以前弄的,用了一天的时间,没有什么技 ...

  4. 使用sql语句获取数据库表的信息

    下面的sql语句可以查看表的信息.其中modify_date和create_date可以根据表的修改时间来查看.如果不需要删除后,就能看到所有表的字段信息 ) PERCENT d.name AS 表名 ...

  5. [转]关于oracle sql语句查询时表名和字段名要加双引号的问题

    oracle初学者一般会遇到这个问题.   用navicat可视化创建了表,可是就是不能查到!   后来发现②语句可以查询到 ①select * from user; 但是,我们如果给user加上双引 ...

  6. ylb:sql语句重命名表名和列名

    ylbtech-SQL Server:SQL Server-sql语句重命名表名和列名 sql语句重命名表名和列名 ylb:sql语句重命名表名和列名 返回顶部 一.更改数据库名    sp_rena ...

  7. 关于oracle sql语句查询时 表名和字段名要加双引號的问题具体解释

      作为oracle的刚開始学习的人相信大家一定会遇到这个问题.如图:          明明就是navicat可视化创建了表,但是就是不能查到!这个为什么呢?           select * ...

  8. sql语句对数据库表进行加锁和解锁

    锁是数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性. 我们知道,多个用户能够同时操纵同一个数据库中的数据,会发生数据不一致现象.即如果没有锁定且多个用户同时访问一个数据库 ...

  9. 基本 SQL 之数据库及表管理

    上篇文章,我们基于『数据库』做了一个宏观上的介绍,你应当了解到数据库是在何种背景下,为了解决什么样的问题而诞生的,以及在具体实现下又可以划分哪些中类型. 非关系型数据库的种类很多,我们会在后续的篇章中 ...

随机推荐

  1. duilib踩坑记录

    duilib官方 https://github.com/duilib/duilib duilib他人扩展 https://github.com/qdtroy/DuiLib_Ultimate 关于两者的 ...

  2. WebService和Http的POST和GET请求区别和示例

    web service(SOAP) Webservice的一个最基本的目的就是提供在各个不同平台的不同应用系统的协同工作能力.Web service 就是一个应用程序,它向外界暴露出一个能够通过Web ...

  3. Linux命令(四)文件传输

    1. 将当前目录下的test1.txt文件,复制到 /tmp/Douzi目录下,命名为test1.py   2. 将服务器/tmp/Douzi/hello.py复制到本地上,重命名为 hello_Do ...

  4. [转载]AngularJS之Factory vs Service vs Provider

    http://www.oschina.net/translate/angularjs-factory-vs-service-vs-provider http://tylermcginnis.com/a ...

  5. python中的__iter__ __reversed__ __next__

    __reversed__ 返回集合的倒叙迭代器,如果没有实现这个方法,reversed()会去使用__getitem__和__len__来实现 介绍__next__和 __iter__方法需要了解下可 ...

  6. [转]perf + 火焰图分析程序性能

    1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...

  7. Java初转型-SSM配置文件

    文章来源:http://www.cnblogs.com/wxisme/p/4924561.html web.xml的配置                                        ...

  8. 使用badblocks命令检测、修复硬盘坏道(待验证)

    今天我的新硬盘到了.暂时没想好怎么用它.可以把它装入光驱位硬盘架给G430用,也可以把它当成移动硬盘来用. 想起以前记录过一个badblocks的用法,用来检查坏道,这里再贴一遍备用. ####### ...

  9. Python_oldboy_自动化运维之路_面向对象2(十)

    本节内容: 面向对象程序设计的由来 什么是面向对象的程序设计及为什么要有它 类和对象 继承与派生 多的态与多态性 封装 静态方法和类方法 面向对象的软件开发 反射 类的特殊成员方法 异常处理 1.面向 ...

  10. Java基础84 javaBean规范

    1.javaBean的概述 1.javaBeam(咖啡豆)是一种开发规范,也可以说是一种技术.  2.JavaBean就是一个普通java类,只要符合以下规定才能称作为javaBean:        ...