• MySQL 03


    单表操作

    group by

    • 分组: 将记录按照某个相同的字段进行归类

    • 聚合函数

      • count()
      • sum()
      • max()
      • min()
      • avg()
    • select 聚合函数 [as 列名] from 表名 group by 列名;

    mysql> select * from employee;
    +----+---------+--------+-----+--------+-----------+
    | id | name    | gender | age | salary | depart_id |
    +----+---------+--------+-----+--------+-----------+
    |  1 | alpha   | male   |  35 |  12000 |         1 |
    |  2 | bravo   | male   |  28 |  10000 |         1 |
    |  3 | charlie | female |  22 |   7000 |         1 |
    |  4 | delta   | female |  37 |  14000 |         1 |
    |  5 | echo    | male   |  24 |   8000 |         2 |
    |  6 | foxtrot | female |  42 |  20000 |         2 |
    |  7 | golf    | female |  29 |  11000 |         2 |
    |  8 | hotel   | male   |  31 |  13000 |         2 |
    |  9 | india   | male   |  40 |  18000 |         3 |
    | 10 | juliet  | male   |  21 |   6000 |         3 |
    +----+---------+--------+-----+--------+-----------+
    10 rows in set (0.00 sec)
    
    mysql> select gender, count(id) as total from employee group by gender;
    +--------+-------+
    | gender | total |
    +--------+-------+
    | female |     4 |
    | male   |     6 |
    +--------+-------+
    2 rows in set (0.00 sec)
    
    mysql> select depart_id, max(salary) from employee group by depart_id;
    +-----------+-------------+
    | depart_id | max(salary) |
    +-----------+-------------+
    |         1 |       14000 |
    |         2 |       20000 |
    |         3 |       18000 |
    +-----------+-------------+
    3 rows in set (0.00 sec)
    
    mysql> select depart_id, avg(salary) from employee group by depart_id;
    +-----------+-------------+
    | depart_id | avg(salary) |
    +-----------+-------------+
    |         1 |       10750 |
    |         2 |       13000 |
    |         3 |       12000 |
    +-----------+-------------+
    3 rows in set (0.00 sec)
    

    having

    • having是对group by后的数据进行二次筛选
    • select 聚合函数 [as 列名] from 表名 group by 列名 having 条件;
    mysql> select depart_id, avg(salary) from employee group by depart_id;
    +-----------+-------------+
    | depart_id | avg(salary) |
    +-----------+-------------+
    |         1 |       10750 |
    |         2 |       13000 |
    |         3 |       12000 |
    +-----------+-------------+
    3 rows in set (0.00 sec)
    
    mysql> select depart_id, avg(salary) from employee group by depart_id having depart_id=1;
    +-----------+-------------+
    | depart_id | avg(salary) |
    +-----------+-------------+
    |         1 |       10750 |
    +-----------+-------------+
    1 row in set (0.00 sec)
    

    order by

    • order by 列名 asc 升序
    • order by 列名 desc 降序
    
    mysql> select * from employee order by age asc;
    +----+---------+--------+-----+--------+-----------+
    | id | name    | gender | age | salary | depart_id |
    +----+---------+--------+-----+--------+-----------+
    | 10 | juliet  | male   |  21 |   6000 |         3 |
    |  3 | charlie | female |  22 |   7000 |         1 |
    |  5 | echo    | male   |  24 |   8000 |         2 |
    |  2 | bravo   | male   |  28 |  10000 |         1 |
    |  7 | golf    | female |  29 |  11000 |         2 |
    |  8 | hotel   | male   |  31 |  13000 |         2 |
    |  1 | alpha   | male   |  35 |  12000 |         1 |
    |  4 | delta   | female |  37 |  14000 |         1 |
    |  9 | india   | male   |  40 |  18000 |         3 |
    |  6 | foxtrot | female |  42 |  20000 |         2 |
    +----+---------+--------+-----+--------+-----------+
    10 rows in set (0.00 sec)
    
    mysql> select * from employee order by salary desc;
    +----+---------+--------+-----+--------+-----------+
    | id | name    | gender | age | salary | depart_id |
    +----+---------+--------+-----+--------+-----------+
    |  6 | foxtrot | female |  42 |  20000 |         2 |
    |  9 | india   | male   |  40 |  18000 |         3 |
    |  4 | delta   | female |  37 |  14000 |         1 |
    |  8 | hotel   | male   |  31 |  13000 |         2 |
    |  1 | alpha   | male   |  35 |  12000 |         1 |
    |  7 | golf    | female |  29 |  11000 |         2 |
    |  2 | bravo   | male   |  28 |  10000 |         1 |
    |  5 | echo    | male   |  24 |   8000 |         2 |
    |  3 | charlie | female |  22 |   7000 |         1 |
    | 10 | juliet  | male   |  21 |   6000 |         3 |
    +----+---------+--------+-----+--------+-----------+
    10 rows in set (0.00 sec)
    

    limit

    • 限制查询记录的个数

    • limit offset, size

      • offset 表示起始行数, 第一行对应的offset是0
      • size 表示查询记录的个数
    
    mysql> select * from employee;
    +----+---------+--------+-----+--------+-----------+
    | id | name    | gender | age | salary | depart_id |
    +----+---------+--------+-----+--------+-----------+
    |  1 | alpha   | male   |  35 |  12000 |         1 |
    |  2 | bravo   | male   |  28 |  10000 |         1 |
    |  3 | charlie | female |  22 |   7000 |         1 |
    |  4 | delta   | female |  37 |  14000 |         1 |
    |  5 | echo    | male   |  24 |   8000 |         2 |
    |  6 | foxtrot | female |  42 |  20000 |         2 |
    |  7 | golf    | female |  29 |  11000 |         2 |
    |  8 | hotel   | male   |  31 |  13000 |         2 |
    |  9 | india   | male   |  40 |  18000 |         3 |
    | 10 | juliet  | male   |  21 |   6000 |         3 |
    +----+---------+--------+-----+--------+-----------+
    10 rows in set (0.00 sec)
    
    mysql> select * from employee limit 2, 3;
    +----+---------+--------+-----+--------+-----------+
    | id | name    | gender | age | salary | depart_id |
    +----+---------+--------+-----+--------+-----------+
    |  3 | charlie | female |  22 |   7000 |         1 |
    |  4 | delta   | female |  37 |  14000 |         1 |
    |  5 | echo    | male   |  24 |   8000 |         2 |
    +----+---------+--------+-----+--------+-----------+
    3 rows in set (0.00 sec)
    

    使用顺序

    • where > group by > having > order by > limit

    多表操作

    外键

    • 外键是表中的一个字段, 这个字段与另外一个表中的字段相匹配
    • 作用
      • 减少占用的空间
      • 方便后期修改

    一对多

    • constraint 外键名 foreign key (被约束的字段) references 表名(字段名)
    mysql> select * from employee;
    +----+---------+--------+-----+--------+-----------+
    | id | name    | gender | age | salary | depart_id |
    +----+---------+--------+-----+--------+-----------+
    |  1 | alpha   | male   |  35 |  12000 |         1 |
    |  2 | bravo   | male   |  28 |  10000 |         1 |
    |  3 | charlie | female |  22 |   7000 |         1 |
    |  4 | delta   | female |  37 |  14000 |         1 |
    |  5 | echo    | male   |  24 |   8000 |         2 |
    |  6 | foxtrot | female |  42 |  20000 |         2 |
    |  7 | golf    | female |  29 |  11000 |         2 |
    |  8 | hotel   | male   |  31 |  13000 |         2 |
    |  9 | india   | male   |  40 |  18000 |         3 |
    | 10 | juliet  | male   |  21 |   6000 |         3 |
    +----+---------+--------+-----+--------+-----------+
    10 rows in set (0.00 sec)
    
    mysql> select * from department;
    +----+------+
    | id | dept |
    +----+------+
    |  1 | RD   |
    |  2 | IT   |
    |  3 | HR   |
    +----+------+
    3 rows in set (0.00 sec)
    
    # 添加外键
    mysql> alter table employee add constraint fk_employee_dept foreign key (depart_id) references department(id);
    Query OK, 10 rows affected (0.04 sec)
    Records: 10  Duplicates: 0  Warnings: 0
    
    
    # 查看两表描述, depaet_id 和 id 的 key列变成了MUL 
    mysql> desc employee;
    +-----------+-----------------------+------+-----+---------+----------------+
    | Field     | Type                  | Null | Key | Default | Extra          |
    +-----------+-----------------------+------+-----+---------+----------------+
    | id        | int(10) unsigned      | NO   | PRI | NULL    | auto_increment |
    | name      | char(10)              | NO   |     |         |                |
    | gender    | enum('female','male') | NO   |     | male    |                |
    | age       | int(11)               | NO   |     | 0       |                |
    | salary    | float                 | NO   |     | 0       |                |
    | depart_id | int(10) unsigned      | NO   | MUL | 1       |                |
    +-----------+-----------------------+------+-----+---------+----------------+
    6 rows in set (0.00 sec)
    
    mysql> desc department;
    +-------+------------------+------+-----+---------+----------------+
    | Field | Type             | Null | Key | Default | Extra          |
    +-------+------------------+------+-----+---------+----------------+
    | id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | dept  | char(10)         | NO   |     |         |                |
    +-------+------------------+------+-----+---------+----------------+
    2 rows in set (0.00 sec)
    

    多对多

    
    mysql> select * from boy;
    +----+----------+
    | id | boy_name |
    +----+----------+
    |  1 | Jack Ma  |
    |  2 | Pony Ma  |
    |  3 | Robin Li |
    +----+----------+
    3 rows in set (0.00 sec)
    
    mysql> select * from girl;
    +----+------------+
    | id | girl_name  |
    +----+------------+
    |  1 | Mingzhu Do |
    |  2 | Jean Liu   |
    |  3 | Cathy Meng |
    +----+------------+
    3 rows in set (0.00 sec)
    
    
    mysql> create table boy2girl (
        ->id int unsigned auto_increment primary key,
        ->boy_id int(10) unsigned not null default 1,
        ->girl_id int(10) unsigned not null default 1,
        ->constraint fk_boy2girl_boy foreign key (boy_id) references boy(id),
        ->constraint fk_boy2girl_girl foreign key (girl_id) references girl(id)
        ->);
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> desc  boy2girl;
    +---------+------------------+------+-----+---------+----------------+
    | Field   | Type             | Null | Key | Default | Extra          |
    +---------+------------------+------+-----+---------+----------------+
    | id      | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | boy_id  | int(10) unsigned | NO   | MUL | 1       |                |
    | girl_id | int(10) unsigned | NO   | MUL | 1       |                |
    +---------+------------------+------+-----+---------+----------------+
    3 rows in set (0.00 sec)
    
    mysql> insert into boy2girl (boy_id, girl_id) values (1,1),(1,2),(1, 3),(2, 2), (2,3),(3,3);
    Query OK, 6 rows affected (0.00 sec)
    Records: 6  Duplicates: 0  Warnings: 0
    
    # 分别对两个字段进行了限制
    mysql> select * from boy2girl;
    +----+--------+---------+
    | id | boy_id | girl_id |
    +----+--------+---------+
    |  1 |      1 |       1 |
    |  2 |      1 |       2 |
    |  3 |      1 |       3 |
    |  4 |      2 |       2 |
    |  5 |      2 |       3 |
    |  6 |      3 |       3 |
    +----+--------+---------+
    6 rows in set (0.00 sec)
    

    一对一

    mysql> select * from employee1;
    +----+---------+
    | id | name    |
    +----+---------+
    |  1 | alpha   |
    |  2 | bravo   |
    |  3 | charlie |
    +----+---------+
    3 rows in set (0.00 sec)
    
    mysql> create table salary (
        -> id int unsigned auto_increment primary key,
        -> salary float not null default 0,
        -> employee_id int(10) unsigned not null default 1,
        -> constraint fk_employee_salary foreign key (employee_id) references employee1(id)
        -> );
    Query OK, 0 rows affected (0.02 sec)
    
    
    mysql> select * from salary;
    +----+--------+-------------+
    | id | salary | employee_id |
    +----+--------+-------------+
    |  1 |  10000 |           1 |
    |  2 |  12000 |           2 |
    |  3 |  14000 |           3 |
    +----+--------+-------------+
    3 rows in set (0.00 sec)
    

    多表联查

    • left join on 左外连接, 优先显示左边表的全部记录
    • right join on 右外连接, 优先显示右边表的全部记录
    • inner join on 全外连接, 显示左右两表的全部记录
    
    mysql> select * from boy2girl left join boy on boy_id = boy.id left join girl on girl_id = girl.id;
    +----+--------+---------+------+----------+------+------------+
    | id | boy_id | girl_id | id   | boy_name | id   | girl_name  |
    +----+--------+---------+------+----------+------+------------+
    |  1 |      1 |       1 |    1 | Jack Ma  |    1 | Mingzhu Do |
    |  2 |      1 |       2 |    1 | Jack Ma  |    2 | Jean Liu   |
    |  3 |      1 |       3 |    1 | Jack Ma  |    3 | Cathy Meng |
    |  4 |      2 |       2 |    2 | Pony Ma  |    2 | Jean Liu   |
    |  5 |      2 |       3 |    2 | Pony Ma  |    3 | Cathy Meng |
    |  6 |      3 |       3 |    3 | Robin Li |    3 | Cathy Meng |
    +----+--------+---------+------+----------+------+------------+
    6 rows in set (0.00 sec)
    
    mysql> select boy_name,girl_name from boy2girl left join boy on boy_id = boy.id left join girl on girl_id = girl.id;
    +----------+------------+
    | boy_name | girl_name  |
    +----------+------------+
    | Jack Ma  | Mingzhu Do |
    | Jack Ma  | Jean Liu   |
    | Jack Ma  | Cathy Meng |
    | Pony Ma  | Jean Liu   |
    | Pony Ma  | Cathy Meng |
    | Robin Li | Cathy Meng |
    +----------+------------+
    6 rows in set (0.00 sec)
    
    
    
  • 相关阅读:
    ci高级使用方法篇之连接多个数据库
    JavaSE入门学习17:Java面向对象之package(包)
    找出字符串中第一个出现次数最多的字符
    red5源代码编译并打包公布
    J.U.C--locks--AQS分析
    Spring Web MVC 原理学习(下)
    深入理解 Linux 内存管理
    Java面试问题总结
    盗版者的失落
    eclipse配置lombok插件
  • 原文地址:https://www.cnblogs.com/bigb/p/11767883.html
Copyright © 2020-2023  润新知