约束
  *约束是添加在列上的,用来约束列的!
  1. 主键约束(唯一标识)
      特点:非空,唯一,被引用
      创建表时指定主键的两种方式,分别为:
        CREATE TABLE stu(
          sid          CHAR(6) PRIMARY KEY,
          sname      VARCHAR(20),
          age           INT,
          gender       VARCHAR(10)
        );
        CREATE TABLE stu(
          sid          CHAR(6),
          sname      VARCHAR(20),
          age           INT,
          gender     VARCHAR(10),
          PRIMARY KEY(sid)
        );
      修改表时指定主键:ALTER TABLE stu ADD PRIMARY KEY(sid);
      删除主键:ALTER TABLE stu DROP PRIMARY KEY;
  2. 主键自增长
      因为主键列的特性是:必须唯一、不能为空,所以我们通常会指定主键类为整型,然后设置其自动增长,这样可以保证在插入数据时主键列的唯一和非空特性。
      创建表时指定主键自增长:
        CREATE TABLE stu(
              sid INT PRIMARY KEY AUTO_INCREMENT,
              sname    VARCHAR(20),
              age        INT,
              gender    VARCHAR(10)
        );
        修改表时设置主键自增长:ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;
        修改表时删除主键自增长:ALTER TABLE stu CHANGE sid sid INT;
  3. 非空约束
      因为某些列不能设置为NULL值,所以可以对列添加非空约束。
      例如:
        CREATE TABLE stu(
              sid INT PRIMARY KEY AUTO_INCREMENT,
              sname    VARCHAR(20) NOT NULL,
              age        INT,
              gender    VARCHAR(10)
        );
      对sname列设置了非空约束
  4. 唯一约束
      因为某些列不能设置重复的值,所以可以对列添加唯一约束。
      例如:
        CREATE TABLE stu(
              sid INT PRIMARY KEY AUTO_INCREMENT,
              sname    VARCHAR(20)  UNIQUE,
              age        INT,
              gender    VARCHAR(10)
        );
      对sname列设置了唯一约束,注意:(1)唯一性约束的列不可以出现重复值,但可以出现多个null值。原因:唯一键约束是通过参考索引实施的,如果插入的值均为NULL,则根据索引的原理,全NULL值不被记录在索引上,所以插入全NULL值时,可以有重复的,而其他的则不能插入重复值。(2)唯一约束和非空约束可以同时使用,如:sname    VARCHAR(20) NOT NULL UNIQUE

  5. 概念模型

    对象模型(对应实体类):可以双向关联,而且引用的是对象,而不是一个主键!
    关系模型(对应数据库中的表):只能多方引用一方,而且引用的只是主键,而不是一整行记录。

    当我们要完成一个软件系统时,需要把系统中的实体抽取出来,形成概念模型,例如部门、员工都是系统中的实体。概念模型中的实体最终会成为类、数据库中表。
    实体之间还存在着关系,关系有三种:
      1对多:例如每个员工都从属一个部门,而一个部门可以有多个员工,其中员工是多方,而部门是一方。
      1对1:例如老公和老婆就是一对一的关系,一个老公只能有一个老婆,而一个老婆只能有一个老公。
      多对多:老师与学生的关系就是多对多,一个老师可以有多个学生,一个学生可以有多个老师。

      例子:  class Employee {//多方关联一方
            ...
            private Department department;
           }

           class Department {//一方关联多方
            ...
            private List<Employee> employees;
           }

           class Husband {
            ...
            private Wife wife;
           }
           class Wife {
            ...
            private Husband
           }

           class Student {
            ...
            private List<Teacher> teachers
           }
           class Teacher {
            ...
            private List<Student> students;
           }

  6. 外键约束
    外键必须是另一表的主键的值(外键要引用主键!),外键可以重复,外键可以为空,一张表中可以有多个外键!

    概念模型在数据库中成为表,数据库表中的多对一关系,只需要在多方使用一个独立的列来引用1方的主键即可
      /*员工表*/
      create talbe emp (
        empno int primary key,/*员工编号*/
        ...
        deptno int/*所属部门的编号*/
      );
      /*部门表*/
      create table dept (
        deptno int primary key,/*部门编号*/
        ...
      );
    emp表中的deptno列的值表示当前员工所从属的部门编号。也就是说emp.deptno必须在dept表中是真实存在!但是我们必须要去对它进行约束,不然可能会出现员工所属的部门编号是不存在的情况。这种约束就是外键约束。我们需要给emp.deptno添加外键约束,约束它的值必须在dept.deptno中存在。外键必须是另一个表的主键!

    语法:CONSTRAINT 约束名称 FOREIGN KEY(外键列名) REFERENCES 关联表(关联表的主键)
    创建表时指定外键约束
      create talbe emp (
        empno int primary key,
        ...
        deptno int,
        CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno)
      );

    修改表时添加外键约束
      ALERT TABLE emp ADD CONSTRAINT fk_emp_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno);

    修改表时删除外键约束
      ALTER TABLE emp DROP FOREIGN KEY fk_emp_deptno;/*约束名称*/
  7. 数据库一对一关系
    在表中建立一对一关系比较特殊,需要让其中一张表的主键,即是主键又是外键。
      create table husband(
        hid int PRIMARY KEY,
        ...
      );
      create table wife(
        wid int PRIMARY KEY,
        ...
        ADD CONSTRAINT fk_wife_wid FOREIGN KEY(wid) REFERENCES husband(hid)
      );
    其中wife表的wid即是主键,又是相对husband表的外键!husband.hid是主键,不能重复!wife.wid是主键,不能重复,又是外键,必须来自husband.hid。所以如果在wife表中有一条记录的wid为1,那么wife表中的其他记录的wid就不能再是1了,因为它是主键。同时在husband.hid中必须存在1这个值,因为wid是外键。这就完成了一对一关系。

  8. 数据库多对多关系
    在表中建立多对多关系需要使用中间表,即需要三张表,在中间表中使用两个外键,分别引用其他两个表的主键。
      create table student(
        sid int PRIMARY KEY,
        ...
      );
      create table teacher(
        tid int PRIMARY KEY,
        ...
      );

      create table stu_tea(
        sid int,
        tid int,
        ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY(sid) REFERENCES student(sid),
        ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY(tid) REFERENCES teacher(tid)
      );
    这时在stu_tea这个中间表中的每条记录都是来说明student和teacher表的关系

连接查询
  1. 分类
    内连接
    外连接
      左外连接
      右外连接
      全外连接(MySQL不支持)
    自然连接(属于一种简化方式,百度百科:自然连接:是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。)

  2. 内连接
    方言:SELECT * FROM 表1 别名1, 表2 别名2 WHERE 别名1.xx=别名2.xx
    标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
    自然:SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2
  3. 外连接
    左外:SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
      左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能出来。左表中不满足条件的记录,右表部分都为NULL
    左外自然:SELECT * FROM 表1 别名1 NATURAL LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
    右外:SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
      右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能出来。右表不满足条件的记录,其左表部分都为NULL
    右外自然:SELECT * FROM 表1 别名1 NATURAL RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
    全链接:可以使用UNION来完成全链接

子查询
    查询中有查询(查看select关键字的个数!)
    1. 出现的位置:
      where后作为条件存在
      from后作为表存在(多行多列)

    2. 条件
      单行单列:SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名2 WHERE 条件)
      多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [IN, ALL, ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件)
      单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1, 列2 FROM 表2 别名2 WHERE 条件)
      多行多列:SELECT * FROM 表1 别名1 , (SELECT ....) 别名2 WHERE 条件

 

SQL详解(下)的更多相关文章

  1. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...

  2. Oracle中动态SQL详解(EXECUTE IMMEDIATE)

    Oracle中动态SQL详解(EXECUTE IMMEDIATE) 2017年05月02日 18:35:48 悠悠倾我心 阅读数:744 标签: oracle动态sqloracle 更多 个人分类:  ...

  3. AgileEAS.NET SOA中间件平台/敏捷软件开发平台 and SQL详解

    AgileEAS.NET SOA中间件平台/敏捷软件开发平台 http://www.smarteas.net/ SQL详解: http://www.w3school.com.cn/sql/func_d ...

  4. [js高手之路]深入浅出webpack教程系列3-配置文件webpack.config.js详解(下)

    本文继续接着上文,继续写下webpack.config.js的其他配置用法. 一.把两个文件打包成一个,entry怎么配置? 在上文中的webpack.dev.config.js中,用数组配置entr ...

  5. SSL/TLS协议详解(下)——TLS握手协议

    本文转载自SSL/TLS协议详解(下)--TLS握手协议 导语 在博客系列的第2部分中,对证书颁发机构进行了深入的讨论.在这篇文章中,将会探索整个SSL/TLS握手过程,在此之前,先简述下最后这块内容 ...

  6. IE8"开发人员工具"使用详解下(浏览器模式、文本模式、JavaScript调试、探查器)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/04/03/kaifarenyuangongju2.html 在上一篇文章IE8“开发人员工具” ...

  7. .Net Attribute详解(下) - 使用Attribute武装枚举类型

    接上文.Net Attribute详解(上)-Attribute本质以及一个简单示例,这篇文章介绍一个非常实用的例子,相信你一定能够用到你正在开发的项目中.枚举类型被常常用到项目中,如果要使用枚举To ...

  8. CSS2.1SPEC:视觉格式化模型之width属性详解(下)

    本文承接CSS2.1SPEC:视觉格式化模型之width属性详解(上),继续分析CSS视觉格式化模型中width以及相关值的计算问题: 注:与上节不同,本节的demo中由于出现了float,absol ...

  9. Linux常用命令详解下

    Linux常用命令详解 目录 一.Linux常用命令 1.1.查看及切换目录(pwd.cd.ls.du) 1.2.创建目录和文件(mkdir.touch.ln) 1.3.复制.删除.移动目录和文件(c ...

  10. Android Touch事件传递机制详解 下

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yu ...

随机推荐

  1. 从json传递数据显示表格实例

    @interface ViewController ()<UITableViewDataSource,UITableViewDelegate> { UITableView* table; ...

  2. 重写Equals为什么要同时重写GetHashCode

    .NET程序员都知道,如果我们重写一个类的Equals方法而没有重写GetHashCode,则VS会提示警告 :“***”重写 Object.Equals(object o)但不重写 Object.G ...

  3. 【编程题目】在 O(1)时间内删除链表结点

    60.在 O(1)时间内删除链表结点(链表.算法).题目:给定链表的头指针和一个结点指针,在 O(1)时间删除该结点.链表结点的定义如下:struct ListNode{int m_nKey;List ...

  4. August 29th 2016 Week 36th Monday

    Every has the capital to dream. 每个人都有做梦的本钱. Your vision, our mission. That is an advertisment of UMo ...

  5. ios layer 动画-(transform.rotation篇)

    x轴旋转: CABasicAnimation *theAnimation; theAnimation=[CABasicAnimation animationWithKeyPath:@"tra ...

  6. idea 用maven骨架生成项目速度慢的问题

    使用mvn archetype:generate命令时,加上-DarchetypeCatalog=local archetypeCatalog=local

  7. XSLT教程

    XSL 指扩展样式表语言(EXtensible Stylesheet Language), 它是一个 XML 文档的样式表语言. XSLT 指 XSL 转换.即使用 XSLT 将 XML 文档转换为其 ...

  8. 恶趣味小游戏 I'm hungry

    之前学算法的时候无聊做了个游戏放松放松,现在传到了github以免电脑坏了就永远丢失了... github地址:https://github.com/BenDanChen/IamHungry I am ...

  9. 1 Ionic和Hybird应用介绍

    1.Ionic是什么,它和Angular.Cordova有什么关系? Ionic通过整合各种技术和功能使构建Hybird应用更加快速.容易和美观.Ionic生态系统基于Angular和Cordova, ...

  10. python中统计列表各个元素的个数