mysql 数据库学习第三天

数据的约束 (对用户操作表的数据的约束)

     默认值: 当用户对使用‘默认值的字段’不插入值的时候,就使用默认值。

            注:对默认值字段可以插入null

                  默认值:字段   数据类型   default  默认值

     非空:限制字段必须赋值

           注:非空字段必须赋值,非空字段不能为null

                字段   数据类型  not  null

     唯一:对字段的值不能重复

          注:对唯一字段可以插入一个或者多个null

               字段   数据类型  unique

     主键:非空+唯一

            通常来说,主键是用来记录每张表的唯一性,一般选择没有业务作用的id字段作为主键

            id  int primary key,

    自增长:字段自动增长

           id  int  primary key auto_increment,

           注:自增字段可以不赋值,自动递增

                 delete  from 表名;  不影响自增长约束(删除表数据后,下次插入数据,自增长字段会从上次的值的基础上继续增长)

                truncate  from 表名; 影响自增长约束(删除表数据后,下次插入数据,自增长字段会从0的基础上继续增长)

   外键:约束两张表的数据

               解决数据冗余高问题: 独立出一张表

 

        例如: 员工表    部门表

 

        问题出现:在插入员工表数据的时候,员工表的部门ID字段可以随便插入!!!!!

 

              使用外键约束:约束插入员工表的部门ID字段值

 

               解决办法: 在员工表的部门ID字段添加一个外键约束

        //部门表(主表)

          create table dept(

            id int primary key,

            deptname varchar(20)

          )

           //修改员工表(副表)

        create table employee(

        id  int primary key,

        empname varchar(20),

         deptid int --把部门名称修改成部门id

         //声明一个外键约束

          constraint fk_deptid  foreign key (deptid) references dept(id)

          )

 

         注意:

 

         1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!!

 

         2)主表的参考字段通用为主键!

 

         3)添加数据: 先添加主表,再添加副表

 

         4)修改数据: 先修改副表,再修改主表

 

          5)删除数据: 先删除副表,再删除主表

级联操作

     当有外键约束时,必须修改或者删除副表中所关联的数据,才能修改或者删除主表。

     但是若直接修改或者删除主表数据,可以使用级联操作实现。

      级联修改   on update cascade

      级联删除   on delete cascade

      onstraint fk_deptid  foreign key (deptid) references dept(id) on update cascade on delete cascade

      注:级联操作必须在外键的基础上使用

连接查询(多表查询)

      连接就是指两个或2个以上的表(数据源)“连接起来成为一个数据源”。连接之后并非形成了一个新的数据表,而是一种“内存形态”。

     基本形式: from 表1 [连接方式] join 表2 [on 连接条件]

     交叉连接:将两个表不设定任何条件的连接结果。数学上成为笛卡尔积

                           from 表1 [cross] join 表2; cross可省略  可用inner代替

        内连接: 找出(过滤)在交叉连接的结果表中的表1的字段1的值等于表2的字段2的值的那些

行。

                from  1  [inner]  join  2  on  1.字段1=2.字段2

 

      左[外]连接:内连接的结果基础上,加上左边表中所有不符合连接条件的数据,相应放右边表的字段的位置就自动补为null”值。

               from  1  left  [outer]  join   2   on  连接条件;

   右[外]连接:在内连接的结果基础上,加上右边表中所有不符合连接条件的数据,相应本应放左边表的字段的位置就自动补为null”值。

               from  1  right  [outer]  join   2   on  连接条件;

    全[外]连接:其实是左右连接的“并集”(消除重复项),即内连接的结果,加上左表中不满足条件的所有行(右边对应补null),再加上,右表中不满足条件的所有行(左边对应补null)。

              from  1  full  [outer]  join  2  on  连接条件;

         注:mysql中其实不认识全[]连接语法,即mysql这个软件本身不支持全连接的语法。

  子查询  子查询就是把一个查询的结果当作另一个查询的条件。

   in  子查询     

        语法:where  操作数  in (1,值2....

  any 子查询

     语法:where 操作数  any(值1,值2,....)

联合查询 union

     联合查询就是将两个select语句的查询结果‘层叠’到一起成为一个‘大结果’。

     两个查询结果能够联合的先觉条件就是:结果字段数相等。

    select 语句1

     union [all | distinct]

     select 语句2;

 

    说明:

 

          1,两个select语句的输出段(结果字段)一样数目一样,应用中通常类型一样才有意义。

 

          2,结果集中的字段以第一个select语句的字段为准。

 

          3,第一个select语句的字段可以做别名,但如果做别名,则后续的wheregrouporder等子句应该用该别名。

 

          4,联合查询默认是会消除重复项的(DISTINCT),要想不消除,则必须明确些“ALL”。

 

          5,如果要对整个联合结果进行排序或limit,则应该对各自的select语句加括号:

 

       (select 语句1

 

             union

 

       (select 语句2

 

             order  by .....  limit ....

 

posted @   低调的小孩儿  阅读(183)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示