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. Hadoop源码阅读-HDFS-day2

    昨天看到了AbstractFileSystem,也知道应用访问文件是通过FileContext这个类,今天来看这个类的源代码,先看下这个类老长的注释说明 /** * The FileContext c ...

  2. Java SSM框架之MyBatis3(五)MyBatis之ResultMap详解

    resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中. resultMap包含的元素: <!--column不做限制,可以为任意 ...

  3. js 隐藏代码生成工具

    昨天写了篇<js 奇葩技巧之隐藏代码>,今天来写个工具方便大家生成吧.在昨天算法基础上优化了解码算法,采用立即函数运行.有两种模式可供选择: 1. eval  全局模式,比如你定义的 va ...

  4. BAT及各大互联网公司2014前端笔试面试题--JavaScript篇(昨天某个群友表示写的简单了点,然后我无情的把他的抄了一遍)

    (某个群友)http://www.cnblogs.com/coco1s/ 很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习js更是大 ...

  5. 微信公众号用户OpenID同步导出系统

    一.简介 同步公众账号用户信息,包括OpenID.昵称.头像.地区等. 二.主要功能 同步公众账号用户 OpenID,以及昵称.头像.性别.地区.关注时间等,支持认证订阅号.认证服务号. 支持超过1万 ...

  6. the error about “no such file or directory”

    CHENYILONG Blog the error about "no such file or directory" when you get the question like ...

  7. vue路由DEMO

    index.js,index.vue,course.vue,master.vue等 import Vue from 'vue' import Router from 'vue-router' impo ...

  8. js自定制周期函数

    function mySetInterval(fn, milliSec,count){ function interval(){ if(typeof count==='undefined'||coun ...

  9. svn 回退/更新/取消至某个版本命令详解【转】

    转自:http://www.cnblogs.com/mfryf/p/4654110.html 1. 取消Add/Delete 取消文件 svn revert 文件名 取消目录 svn revert - ...

  10. Oracle SQL部分练习题

    SQL练习题        注:查询列表不建议用 “*” 1.列出至少有一个雇员的所有部门: a. select * from dept where deptno in(select distinct ...