day03 mysql navicat
 
一.完整性约束之
    外键 foreign key
    一个表(关联表: 是从表)设置了外键字段的值, 对应的是另一个表的一条记录(被关联表: 是主表)
 
    如何建立两张关系表?
    先要创建主表: 因为别人要关联你, 你要先存在
        > create table mas(id int primary key auto_increment, name varchar(20) not null, des varchar(30) not null);
    再创建从表: 
        > create table sla(
            eid int primary key auto_increment,
            name char(10) not null, age int not null,
            mas_id int not null,
            constraint fk_mas foreign key(mas_id) references mas(id) on delete cascade on update cascade           #(constraint 约束)(reference 参考)(cascade 级联)
            #约束外键名 外键(字段) 参考哪个表(哪个字段) 同步删除 同步更新
            );
 
    如何给两张表插入数据:
    先给主表插入数据
        > insert into mas(name,des) values('信息部','信息企划查询'), ('采购部','信息采购查询'), ('技术部','信息技术查询');
    再给从表插入数据
        > insert into sla(name,age,mas_id) values('bajie',12,1),('wukong',13,3),('datang',14,2),('xixi',10,1),('haha',19,3),('lele',16,1);
   
  如何删两个表的记录, 删的时机
    主表的记录
        当主表被从表参考的字段的值, 在从表中没有引用时, 可以删, 否则报错
        当从表设置了同步删, 同步更新后, 那就什么时候删都行,随意了,注意从表中对应的外键的记录也全删了: on delete cascade on update cascade      //(cascade 级联)
            从表关联时用这个: constraint fk_mas foreign key(mas_id) references mas(id) on delete cascade on update cascade       //MUL
            加上这句: 才是建立关联表的完整的方式
    从表的记录
        什么时候删都行, 随意
    当表比较多的时候
        不适合建立太多的外键  
        
二.外键的变种 三种关系
    如何找出两张表之间的关系
    假设有两张表: 左表和右表,分析步骤:
        步骤一: 站在左表的角度, 如果左表的多条记录对应右表的一条,那么左表上有 foreign key
        步骤二: 站在右表的角度, 如果右表的多条记录对应左表的一条,那么右表上有 foreign key
   
  多对一:
        如果步骤一和步骤二: 只有一个成立,那么是 多对一的关系(一对多一样,因为可以理解成左右互换时的状态)
    书和出版社的关系:
        一个出版社可以出版多本书
        但是多个出版社不能出同一种书(除非是盗版)
        如何建表:
            先建立出版社
            再建立书: 给书设置外键
    
    多对多:
        如果步骤一和步骤二: 同时成立,需要定义一个这两张表的关系表来专门存放二者的关系
    作者和书的关系
        一个作者可以写多本书
        多个作者可以共同写一本书
        如何建表:
            创建两张关系表: 为两个普通表
            额外建立第三张表: 设置两个外键分别对应两个关系表
        代码:
            建立三张表
            > create table author(id int primary key auto_increment, name varchar(20));
            > create table book(id int primary key auto_increment, name varchar(20));
            > create table author_book(
                id int primary key auto_increment,
                book_id int not null,
                author_id int not null,
                constraint fk_book foreign key(book_id) references book(id) on delete cascade on update cascade,
                constraint fk_author foreign key(author_id) references author(id) on delete cascade on update cascade
                );
            插入数据
            > insert into author(name) values('八戒'),('悟空'),('大唐'),('溜溜');
            > insert into book(name) values('一本书'),('两本书'),('三本书'),('四本书'),('五本书'),('六本书');
            > insert into author_book(author_id,book_id) values(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(2,6),(3,4),(3,6),(4,1),(4,3);
   
  一对一:
        如果步骤一和步骤二: 都不成立,这种简单: 就是在左表foreign key基础上,再将外键字段设置唯一"unique"即可
    用户和博客的关系
        一个用户名只能注册同一个网站上的一个博客
    如何建表:
        先建立一张表
        建立另一张表: 设置外键, 并且设置 unique
  
三.单表查询
    1.单表查询的语法
        select 字段1,字段2... from 表名
            where 条件                                //(condition 条件)
            group by field
            having 筛选
            order by field
            limit 显示限制条数
    
    2.关键字的执行优先级
            from          //找到表  
            where         //条件查询
            group by      //如果不分组, 则整体看做一组  
            having        //将分组结果: 二次过滤
            select        //执行select,查询显示出来
            distinct      //去重: (distinct 不同的)
            order by      //按条件排序,然后可选升序或降序(默认升序)
            limit         //限制结果的显示条数
select group_concat(name),salary from employee where salary > 1000 group by salary having count(1) < 10 order by salary desc limit 3;
+--------------------+------------+
| group_concat(name) | salary     |
+--------------------+------------+
| wukong             | 1000000.31 |
| tianchi            |   30000.00 |
| 程咬金             |   20000.00 |
+--------------------+------------+
            sql语句的执行过程:
                找到表 -> 拿着where指定的约束条件,去表中取出一条条记录 -> 将取出的一条条记录进行group by分组, 如果没有group by,则整体作为一组
                 -> 将分组的结果进行having过滤 -> 执行select -> 去重 -> 将结果按条件排序order by -> limit限制结果的显示条数
    
    3.准备公司员工表
    company.employee(公司.雇员)    
        员工id          id                          int                  
        姓名            name                        varchar                                                             
        性别            sex                         enum                                                                  
        年龄            age                         int
        入职日期        hire_date                   date
        岗位            post                        varchar
        职位描述        post_comment             varchar
        薪水            salary                    double
        办公室          office                      int
        部门编号        depart_id                   int
 
    创建表
    create table employee(
        id int primary key auto_increment,
        name varchar(20) not null,
        sex enum('male','female') not null default 'male',     #大部分是男的
        age int(3) unsigned not null default 28,
        hire_date date not null,
        post varchar(50),
        post_comment varchar(100),
        salary  double(15,2),
        office int,                                            #一个部门一个屋    
        depart_id int
        );   
 
    插入记录   
    insert into employee(name ,sex,age,hire_date,post,salary,office,depart_id) values
        ('bajie','male',18,'20170301','visitor',7300.33,401,1),         #以下是教学部
        ('wukong','male',78,'20150302','teacher',1000000.31,401,1),
        ('datang','male',81,'20130305','teacher',8300,401,1),
        ('shaseng','male',73,'20140701','teacher',3500,401,1),
        ('bailong','male',28,'20121101','teacher',2100,401,1),
        ('xizi','female',18,'20110211','teacher',9000,401,1),
        ('tianchi','male',18,'19000301','teacher',30000,401,1),
        ('xingjun','male',48,'20101111','teacher',10000,401,1),
        ('嘻嘻','female',48,'20150311','sale',3000.13,402,2),            #以下是销售部门
        ('呵呵','female',38,'20101101','sale',2000.35,402,2),
        ('嘚嘚','female',18,'20110312','sale',1000.37,402,2),
        ('嘞嘞','female',18,'20160513','sale',3000.29,402,2),
        ('呢呢','female',28,'20170127','sale',4000.33,402,2),
        ('程咬氢','male',28,'20160311','operation',10000.13,403,3),     #以下是运营部门
        ('程咬金','male',18,'19970312','operation',20000,403,3),
        ('程咬银','female',18,'20130311','operation',19000,403,3),
        ('程咬铜','male',18,'20150411','operation',18000,403,3),
        ('程咬铁','female',18,'20140512','operation',17000,403,3)
        ;
 
    查看表
    > select * from employee;
+----+-----------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
| id | name      | sex    | age | hire_date  | post      | post_comment | salary     | office | depart_id |
+----+-----------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
|  1 | bajie     | male   |  18 | 2017-03-01 | visitor   | NULL         |    7300.33 |    401 |         1 |
|  2 | wukong    | male   |  78 | 2015-03-02 | teacher   | NULL         | 1000000.31 |    401 |         1 |
|  3 | datang    | male   |  81 | 2013-03-05 | teacher   | NULL         |    8300.00 |    401 |         1 |
|  4 | shaseng   | male   |  73 | 2014-07-01 | teacher   | NULL         |    3500.00 |    401 |         1 |
|  5 | bailong   | male   |  28 | 2012-11-01 | teacher   | NULL         |    2100.00 |    401 |         1 |
|  6 | xizi      | female |  18 | 2011-02-11 | teacher   | NULL         |    9000.00 |    401 |         1 |
|  7 | tianchi   | male   |  18 | 1900-03-01 | teacher   | NULL         |   30000.00 |    401 |         1 |
|  8 | xingjun   | male   |  48 | 2010-11-11 | teacher   | NULL         |   10000.00 |    401 |         1 |
|  9 | 嘻嘻      | female |  48 | 2015-03-11 | sale      | NULL         |    3000.13 |    402 |         2 |
| 10 | 呵呵      | female |  38 | 2010-11-01 | sale      | NULL         |    2000.35 |    402 |         2 |
| 11 | 嘚嘚      | female |  18 | 2011-03-12 | sale      | NULL         |    1000.37 |    402 |         2 |
| 12 | 嘞嘞      | female |  18 | 2016-05-13 | sale      | NULL         |    3000.29 |    402 |         2 |
| 13 | 呢呢      | female |  28 | 2017-01-27 | sale      | NULL         |    4000.33 |    402 |         2 |
| 14 | 程咬氢    | male   |  28 | 2016-03-11 | operation | NULL         |   10000.13 |    403 |         3 |
| 15 | 程咬金    | male   |  18 | 1997-03-12 | operation | NULL         |   20000.00 |    403 |         3 |
| 16 | 程咬银    | female |  18 | 2013-03-11 | operation | NULL         |   19000.00 |    403 |         3 |
| 17 | 程咬铜    | male   |  18 | 2015-04-11 | operation | NULL         |   18000.00 |    403 |         3 |
| 18 | 程咬铁    | female |  18 | 2014-05-12 | operation | NULL         |   17000.00 |    403 |         3 |
+----+-----------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
 
    4.where约束
    where字句中可以使用
        比较运算符: >    <    >=    <=    =    !=    <>
        between 80 and 100: 值在80到100之间
        in(10,20,30): 值是10或20或30
        like '_bajie%': _代表一个字符, %号代表任意多个
        逻辑运算符: not and or
    代码:
        > select * from employee where age in (18,28,38);
        > select * from employee where name like 'x%';    #隐含条件: x前面没有通配符就是以 x 开头, 若后面也没有就是以什么结尾
   
    5.group by
    注意:
        当有where时, 分组要放在where的后面.
    分组指的是:
        分组是按字段进行分组的
    分组的作用
        取每个部门的员工数    #'每'这个字后面的字段,就是我们分组的依据
        取男女的数量
        取最高,最低工资    
    > select * from employee group by post;        #确实是按字段进行分组了, 但是得到的是每个分组里只有第一条数据展示了, 因为你使用了 * 查询, 其实这样是没有意义的(自己体会下)
    > set global sql_mode='only_full_group_by';    #重启会话后生效: 如果要想分组查询, 这个必须设置, 正常应写到配置文件中(这样你在用 * 就直接报错)
    > select @@global.sql_mode;                    #与select @@sql_mode; 一样
    > select post from employee group by post;     #根据哪个字段分组的, 只能查哪个字段, 其他字段不行: 而且查出来的只有分组的名字,若想查其他字段信息要通过'聚合函数'查询
                                                   #查其他字段的值: 聚合函数:group_concat(sex),用 ,号分隔连接展示
    > select count(id),post from employee group by post;
    > select sum(salary),post from employee group by post;                  #聚合函数: group_concat() count() sum() max() min() avg()
    > select count(1),sex from employee group by sex;                       # 1 是什么, 为了优化性能, 隐含字段, 每条记录这个字段的值都是1
    > select count(1) as '人数',sex as '性别' from employee group by sex;   # 给查询的字段,显示的时候,起一个别名
 
五.可视化工具navicat的使用
    下载地址:
            官网下载:https://www.navicat.com/en/products/navicat-for-mysql
            网盘下载:https://pan.baidu.com/s/1bpo5mqj
 
 
 
内容总结
    1.外键的变种 表和表之间的关系
        一对多或多对一
        多对多: 使用第三张表建立关系
        一对一
    2.数据驱动视图:     Data Controller View:    mysql python服务器 网页展示    (data model)
    3.设计模式:26种
        MVC
        MTV
        MVVM
    4.单表查询
        关键字的优先级
            where 
            group by
            having
            select
            destict
            order by
            limit
        where
            <    >    <=    =>    =    !=    <>
            between .. and ..
            in(1,2,3) 
            not and or
        group by
            sql_mode = only_full_group_by
            只能获取分组的字段, 其他用聚合函数: count(1) sum() avg() max() min() group_concat()函数
 
 
 
 
 
 

day03 mysql外键 表的三种关系 单表查询 navicat的更多相关文章

  1. Mysql外键的变种 三种关系

    一.介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 二.重点理解如果找出两张表之间的关系 分析步骤: #1.先站在左表的角度去找 是否左表的多条记录可以 ...

  2. Mysql -- 外键的变种 三种关系

    一.介绍 因为有foreign  key的约束,  使得两张表形成了三种关系 多对一      多对多   一对一 二.如果找出两张表之间的关系 #.先站在左表的角度去找 是否左表的多条记录可以对应右 ...

  3. python 全栈开发,Day62(外键的变种(三种关系),数据的增删改,单表查询,多表查询)

    一.外键的变种(三种关系) 本节重点: 如何找出两张表之间的关系 表的三种关系 一.介绍 因为有foreign key的约束,使得两张表形成了三种了关系: 多对一 多对多 一对一 二.重点理解如果找出 ...

  4. MySQL学习7 - 外键的变种 三种关系

    一 介绍 二 如何找两张表之间的关系 三 表的三种关系 1.书和出版社 2.作者和书籍的关系 3.用户和博客 本节的重点 如何找出两张表之间的关系 表的三种关系 一 介绍 因为有foreign key ...

  5. mysql更新(五) 完整性约束 外键的变种 三种关系 数据的增删改

    11-数据的增删改   本节重点: 插入数据 INSERT 更新数据 UPDATE 删除数据 DELETE 再来回顾一下之前我们练过的一些操作,相信大家都对插入数据.更新数据.删除数据有了全面的认识. ...

  6. mysq表的三种关系,数据的增删改以及单表多表查询

    一丶三种关系 分析步骤: #.先站在左表的角度去找 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id) #.再站在右表的角度去找 ...

  7. 完整性约束&外键变种三种关系&数据的增删改

    完整性约束 本节重点: not null 与 default unique primary auto_increment foreign key 一.介绍 约束条件与数据类型的宽度一样,都是可选参数 ...

  8. Day055--MySQL--外键的变种,表与表的关系,单表查询,多表查询, 内连接,左右连接,全外连接

    表和表的关系 ---- 外键的变种 * 一对多或多对一 多对多 一对一 参考 https://www.cnblogs.com/majj/p/9169416.html 如何找出两张表之间的关系 分析步骤 ...

  9. mysql外键使用和事物使用

    mysql外键功能主要是为了保证关联表数据的一致性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有 客户号,客户名称 b表中存 ...

随机推荐

  1. spring 中各个配置文件的说明

    (1)pom.xml pom.xml文件是在整个项目下面,该xml的主要作用是:导入框架的jar包及其所依赖的jar包,导入的jar包是写在<dependencies></depen ...

  2. Spring学习笔记(5)——IoC再度学习

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  3. Git中crlf自动转换的坑

    新上手一个项目,克隆了代码下来搭环境,一路坑.其中一个sh脚本执行不了,报IOException,java日志除了"找不到文件或文件夹"之外看不出任何信息,手动运行脚本才发现是脚本 ...

  4. python 正则匹配

    正则表达式模式 模式字符串使用特殊的语法来表示一个正则表达式: 字母和数字表示他们自身.一个正则表达式模式中的字母和数字匹配同样的字符串. 多数字母和数字前加一个反斜杠时会拥有不同的含义. 标点符号只 ...

  5. 再也不用字符串拼接dom元素了

    <script type="text/html" id="tmp"> <div class="cla"> <u ...

  6. 正规式α向有限自动机M的转换

    [注:这一节是在学习东南大学廖力老师的公开课时,所记录的一些知识点截屏,谢谢廖力老师的辛劳付出] 引入3条正规式分裂规则来分裂α,所得到的是NFA  M(因为包含ε弧,之后进行确定化就是所需要求得DF ...

  7. html中设置一个div可编辑文本

    <div contenteditable="true"></div> <!-- outline: none;设置获取焦点没有高亮边框 -->

  8. 深入理解Magento – 第二章 – Magento请求分发与控制器

    深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第二章 – Magento请求分发与控制器 Model-View-Controller (MVC) ,模型-视图- ...

  9. mysql|tomcat|nginx|redis在docker中的部署

    MySQL部署 拉取MySQL镜像 docker pull mysql 查看镜像 创建MySQL容器 docker run -di --name pinyougou_mysql -p 33306:33 ...

  10. flutter 卡在Running Gradle task 'assembleDebug'...

    Android项目运行时出错 卡在Initializing gradle… 运行时会卡在Initializing gradle..., 此时因为Android项目会用到Gradle, 如果没有FQ,下 ...