MySQL

 

MySQL-多表

1、SQL约束与策略

    对表中的数据进行进一步的限制,从而保证数据的正确性、完整性。

    约束:

        主键约束(primary key)、非空约束(not null)、唯一约束(unique)、外键约束(foreign key)、默认值(default)。

  1.1、主键约束

    1.1.1、添加主键约束

      primary key

      主键特点:唯一且不为空。

      作用:唯一的标识每一条记录。

      一个表只能有一个主键。

  

      方式一:

 

      方式二:

 

      方式三(了解):

 

      联合主键(了解):联合主键也是一个主键,只不过将多个列联合在一起了。如:

  

      1.1.2、删除主键约束(了解)

    alter table 表名 drop primary key.

    1.2、非空约束(not null)

      不能为空值

    1.3、唯一约束(unique)

       特点;唯一但是值可以为空,可以多个值为空

      

        主键约束和唯一约束的区别:

        1、主键约束唯一且不为空,唯一约束运行空值。

        2、一个表中最多只有一个主键,但是可以有多个唯一约束。

     1.4、默认值(unique)

            

     1.5、外键约束(foreign key)

      poreign key表示外键约束,用于多表查询

      1.6、自动增长-策略(auto-increment)

    我们通常希望在每次插入新纪录时,数据库自动生成字段的值。

    我们可以使用auto-increment(自动增长列)关键字,自动增长列类型必须是整数,自动增长列必须为键(可以是唯一约束,可以是主键约束)

 

Delete和truncate的区别(自动增长策略):

  delete删除数据后在插入数据会在原有自动增长的数据上去增加,

  使用truncate删除后就相当于一张新表,自动增长从0开始。

2、多表操作

  2.1、多表简述

  实际开发中,一个项目通常需要很多张表才能完成。

  例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多长表。且表的数据之间存在一定的关系。

    好处:为了数据的使用和维护更为方便,我们将单表数据划分为多表。

      

 

 

 

   2.2外键

    外键作用;进行多表数据关联。

    多表关系中,是存在主表、从表的:

      多的一方为从表,少的一方为主表。

    1、主表:数据来源表、主键ID所在表

       例如:分类表---是分类名称数据的来源表,主键cid所在表

    2、从表:数据引用表、外键所在表

       例如:商品表--引用了分类表数据,外键所在表

    外键特点:

    1、从表的外键指向主表的主键

    2、从表的外键的数据类型和长度,必须和主表 的主键的类型和长度一致。

    2.3、外键约束

create database day02_2;
use day02_2;
#创建分类表:
CREATE TABLE category(
    cid varchar(32) PRIMARY KEY,#主键ID
    cname VARCHAR(20)#分类名称
);
INSERT INTO category VALUES('c001','电脑办公');
INSERT INTO category VALUES('c002','服装');
#创建商品表:
CREATE TABLE product(
    pid INT PRIMARY KEY,#主键ID
    pname VARCHAR(20),#商品名称
    price DOUBLE,#商品价格
    category_cid VARCHAR(32)#外键
);

#导入数据
INSERT INTO product(pid,pname,price,category_cid) VALUES(1,'联想电脑',5000,'c001');
INSERT INTO product(pid,pname,price,category_cid) VALUES(2,'海尔电脑',3000,'c001');
INSERT INTO product(pid,pname,price,category_cid) VALUES(3,'雷神电脑',5000,'c001');

INSERT INTO product(pid,pname,price,category_cid) VALUES(4,'JACK JONES',800,'c002');
INSERT INTO product(pid,pname,price,category_cid) VALUES(5,'真维斯',200,'c002');
INSERT INTO product(pid,pname,price,category_cid) VALUES(6,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_cid) VALUES(7,'劲霸',2000,'c002'); 

 

 

从表只能引入主表中存在的数据,要不就先添加主表中的数据再去引入

主表只能删除从表不存在的数据,要不就先删从表数据在删主表数据

 声明外键约束:(是为从表添加)

格式:

  alter tabe 从表 add foreign key (从表外键字段名) references 主表(主表的主键);

 

 删除外键约束:(了解,开发慎用)

  alter table 从表 drop foreign key 外键名称

2.4、多表关系

   多表关系简述

  2.4.1、一对多(最常用)

    班级和学生、分类和商品、省份和城市

    2.4.3、多对多(常用)

    老师和学生、学生和课程、演员和角色

  2.4.4、一对一(比较少)

    在开发中应用不多,因为一对一可以合成一张表。

    建表方式:

      外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一unique

3、多表关系实战

3.1、实战1:省和市

方案1:多张表,一对多

 

代码准备:(请在准备代码中填入外键)

 

CREATE TABLE province(
    id INT PRIMARY KEY,
    NAME VARCHAR(20),
    description VARCHAR(20)
);
CREATE TABLE city(
    id INT PRIMARY KEY,
    NAME VARCHAR(20),
    description VARCHAR(20)
);

ALTER TABLE city ADD FOREIGN KEY(pid) REFERENCES province(id)

3.2、实战2:演员和角色

  多对多关系

代码准备:(请在准备代码中填入中间表及外键)

create table actor(
    aid int primary key,
    name varchar(30)
);
create table role(
    rid int primary key,
    name varchar(30)
);

4、多表查询

4.1、什么是多表查询

同时查询多长表获取到需要的数据

 

4.2多表查询的分类

4.3、笛卡尔积现象

多张表进行一一结合。

4.3.1、什么是笛卡尔积现象

需求:查询每个部门下有 哪些人

左表中的数据一一和右表中的数据结合了

 

4.3.2如何清除笛卡尔积

4.4内连接

用左边的记录去匹配右边的记录,如果符合条件的则显示

显示内连接:select * from A inner join B on 条件

隐式内连接: select * from A,B where 条件

多表查询的规律:

  1、确定查询的数据涉及到那些表

  2、查询的条件是什么

  3、要查询哪些字段

4.5 外连接

左外连接:(以左表为基准,去匹配右表中的记录,如果匹配的到,显示对应的信息,如果匹配不到,左边的信息显示右边表显示为null)。

select * from A left join B on 条件

右外连接:(以右表为基准,和左外链接原理相同)

select * from A right join B on条件

4.6 子查询

概述:将上一条SELECT语句结果作为另一条SELECT语法一部分

子查询的三种情况:

1、子查询的结果是一个值的时候

 

需求:1、查询工资最高的员工是谁?

   2、查询工资小于平均工资的员工有哪些

 

2、子查询结果是单列多行的时候

需求:1、查询工资大于5000的员工,来自于那些部门的名字

   2、查询开发部与财务部所有员工的信息

3、子查询的结果是多行多列

需求:1、查询出2011年以后入职的员工信息,包括部门名称

结论:

  子查询结果只要是单列,肯定在where后面作为条件

    select 查询字段 from 表 where字段=(子查询);

  子查询结果只要是多列,肯定在from后面作为表

    select 查询字段 from (子查询)表别名 where 条件

 

posted @ 2019-08-17 10:52  anlinn  阅读(118)  评论(0编辑  收藏  举报