zoukankan      html  css  js  c++  java
  • 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)

    );

     

    外键的作用:

    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;

  • 相关阅读:
    linux定时器【转】
    Linux Timer定时器【转】
    Linux使用一个定时器实现设置任意数量定时器功能【转】
    Ubuntu 12.04将默认集成Landscape管理套件【转】
    【Linux系统编程应用】Linux音频编程基础(一)【转】
    CRT/LCD/VGA Information and Timing【转】
    记录自己对EventLoop和性能问题处理的一点心得【转】
    Linux下select&poll&epoll的实现原理(一)【转】
    MQTT--入门【转】
    RESTful 个人理解总结【转】
  • 原文地址:https://www.cnblogs.com/vmax-tam/p/4149947.html
Copyright © 2011-2022 走看看