zoukankan      html  css  js  c++  java
  • Mysql增删改查(DML、DQL)

    toc

    • Mysql 管理软件中, 可以通过 SQL 语句中的 DML 语言来实现数据的操作:
      • INSERT 数据插入
      • UPDATE 数据更新
      • DELETE 数据删除
    • 同时可以通过 SQL 语句中的 DQL 语言来实现数据的查询:
      • SELECT 数据查询

    准备操作环境数据表

    mysql> create database test;
    mysql> use test;
    mysql> create table t1(id int,
            name varchar(10),
            sex enum('man','gril'),
            age int
        );
    ## 查看表结构
    mysql> desc t1;
    +-------+--------------------+------+-----+---------+-------+
    | Field | Type               | Null | Key | Default | Extra |
    +-------+--------------------+------+-----+---------+-------+
    | id    | int(11)            | YES  |     | NULL    |       |
    | name  | varchar(10)        | YES  |     | NULL    |       |
    | sex   | enum('man','gril') | YES  |     | NULL    |       |
    | age   | int(11)            | YES  |     | NULL    |       |
    +-------+--------------------+------+-----+---------+-------+

    数据插入或更改的内容必须在字段对应的数据类型范围内

    INSERT 数据插入

    语法: INSERT INTO 表名 ( 字段1, 字段2......) VALUES ( 值1, 值2.....);;

    ## 插入一条数据,INSERT INTO 表名 ( 字段1, 字段2......) VALUES ( 值1, 值2.....);
    mysql> insert into t1(id,name,sex,age) values (1,"zhangsan","man",18);
    ## 完整插入可以省略字段,INSERT INTO 表名 VALUES ( 值1, 值2....);
    mysql> insert into t1 values(2,"lisi","man",10);
    ## INTO 也可以省略掉, INSERT 表名 VALUES ( 值1, 值2....);
    mysql> insert t1 values(2,"wangwu","gril",22);
    ## 指定字段插入 , INSERT INTO 表名 ( 字段2, 字段3…) VALUES ( 值2, 值3…);
    mysql> insert into t1(name,sex,age) values ("zhaoliu","man",20);
    ## 插入多条记录 , INSERT INTO 表名 VALUES ( 值1, 值2....),( 值1, 值2....);
    mysql> insert into t1 values
            (3,"xiaoming","man",16),
            (4,"xiaohong","gril",19),
            (5,"dasha","man",25);
    ## 查询 t1 表的所有数据
    mysql> select * from t1;
    +------+----------+------+------+
    | id   | name     | sex  | age  |
    +------+----------+------+------+
    |    1 | zhangsan | man  |   18 |
    |    2 | lisi     | man  |   10 |
    |    2 | wangwu   | gril |   22 |
    | NULL | zhaoliu  | man  |   20 |
    |    3 | xiaoming | man  |   16 |
    |    4 | xiaohong | gril |   19 |
    |    5 | dasha    | man  |   25 |
    +------+----------+------+------+

    UPDATE 数据更新

    语法: UPDATE 表名 SET 字段=值 WHERE 条件;
    添加对应的 WHERE 条件,精准修改,不添加默认修改全部的

    ## 将 t1 表中,名字叫 zhangsan 的改成 ersha
    mysql> update t1 set name="ersha" where name="zhangsan";
    ## 将 t1 表中,性别为 gril 的年龄改为 18
    mysql> update t1 set age=18 where sex="gril";
    ## 查询 t1 表的所有数据
    mysql> select * from t1;
    +------+----------+------+------+
    | id   | name     | sex  | age  |
    +------+----------+------+------+
    |    1 | ersha    | man  |   18 |
    |    2 | lisi     | man  |   10 |
    |    2 | wangwu   | gril |   18 |
    | NULL | zhaoliu  | man  |   20 |
    |    3 | xiaoming | man  |   16 |
    |    4 | xiaohong | gril |   18 |
    |    5 | dasha    | man  |   25 |
    +------+----------+------+------+

    DELETE 数据删除

    语法: DELETE FROM 表名 WHERE 条件;
    添加对应的 WHERE 条件,精准修改,不添加默认删除全部的

    ## 将 t1 表中,删除名字叫 dasha 的数据
    mysql> delete from t1 where name="dasha";
    ## 将 t1 表中,删除 sex 为 gril 的数据
    mysql> delete from t1 where sex="gril";
    ## 查询 t1 表的所有数据
    mysql> select * from t1;
    +------+----------+------+------+
    | id   | name     | sex  | age  |
    +------+----------+------+------+
    |    1 | ersha    | man  |   18 |
    |    2 | lisi     | man  |   10 |
    | NULL | zhaoliu  | man  |   20 |
    |    3 | xiaoming | man  |   16 |
    +------+----------+------+------+
    ## 清空表数据(游戏里删档就是用的这个)
    mysql> truncate t1;

    SELECT 数据查询

    语法: SELECT 字段1,字段2,..... FROM 表名.....;

    单表查询

    在学习查询前, 需要定义好对应数据进行查询

    编号 id int
    姓名 name varchar(30)
    性别 sex enum('man','gril')
    日期 time date
    职位 post varchar(50)
    职责 job varchar(100)
    薪水 salary double(15,2)
    部门编号 dep_id int

    ## 创建表
    mysql> create table t2(
            id int primary key AUTO_INCREMENT not null,
            name varchar(30) not null,
            sex enum('man','gril') default 'man' not null,
            time date not null,
            post varchar(50) not null,
            job varchar(100),
            salary double(15,2) not null,
            dep_id int 
        );
    ## 插入数据
    mysql> insert into t2(name,sex,time,post,job,salary,dep_id) values
            ('jack','man','20180202','it','teach',5000,100),
            ('tom','man','20180203','it','teach',5500,100),
            ('robin','man','20180202','it','teach',8000,100),
            ('alice','gril','20180202','it','teach',7200,100),
            ('lisi','man','20180202','hr','hrcc',600,101),
            ('harry','man','20180202','hr', NULL,6000,101),
            ('trf','gril','20180206','sale','salecc',20000,102),
            ('test','gril','20180205','sale','salecc',2200,102),
            ('dog','man','20180205','sale', NULL,2200,102),
            ('alex','man','20180205','sale','',2200,102);
    ## 查看表结构
    mysql> desc t2;
    +--------+--------------------+------+-----+---------+----------------+
    | Field  | Type               | Null | Key | Default | Extra          |
    +--------+--------------------+------+-----+---------+----------------+
    | id     | int(11)            | NO   | PRI | NULL    | auto_increment |
    | name   | varchar(30)        | NO   |     | NULL    |                |
    | sex    | enum('man','gril') | NO   |     | man     |                |
    | time   | date               | NO   |     | NULL    |                |
    | post   | varchar(50)        | NO   |     | NULL    |                |
    | job    | varchar(100)       | YES  |     | NULL    |                |
    | salary | double(15,2)       | NO   |     | NULL    |                |
    | dep_id | int(11)            | YES  |     | NULL    |                |
    +--------+--------------------+------+-----+---------+----------------+

    简单数据查询

    ## 查询所有数据
    mysql> select * from t2;
    +----+-------+------+------------+------+--------+----------+--------+
    | id | name  | sex  | time       | post | job    | salary   | dep_id |
    +----+-------+------+------------+------+--------+----------+--------+
    |  1 | jack  | man  | 2018-02-02 | it   | teach  |  5000.00 |    100 |
    |  2 | tom   | man  | 2018-02-03 | it   | teach  |  5500.00 |    100 |
    |  3 | robin | man  | 2018-02-02 | it   | teach  |  8000.00 |    100 |
    |  4 | alice | gril | 2018-02-02 | it   | teach  |  7200.00 |    100 |
    |  5 | lisi  | man  | 2018-02-02 | hr   | hrcc   |   600.00 |    101 |
    |  6 | harry | man  | 2018-02-02 | hr   | NULL   |  6000.00 |    101 |
    |  7 | trf   | gril | 2018-02-06 | sale | salecc | 20000.00 |    102 |
    |  8 | test  | gril | 2018-02-05 | sale | salecc |  2200.00 |    102 |
    |  9 | dog   | man  | 2018-02-05 | sale | NULL   |  2200.00 |    102 |
    | 10 | alex  | man  | 2018-02-05 | sale |        |  2200.00 |    102 |
    +----+-------+------+------------+------+--------+----------+--------+
    ##  指定字段查询
    mysql> select name,salary,dep_id from t2;
    +-------+----------+--------+
    | name  | salary   | dep_id |
    +-------+----------+--------+
    | jack  |  5000.00 |    100 |
    | tom   |  5500.00 |    100 |
    | robin |  8000.00 |    100 |
    | alice |  7200.00 |    100 |
    | lisi  |   600.00 |    101 |
    | harry |  6000.00 |    101 |
    | trf   | 20000.00 |    102 |
    | test  |  2200.00 |    102 |
    | dog   |  2200.00 |    102 |
    | alex  |  2200.00 |    102 |
    +-------+----------+--------+
    ## 去重查询字段 distinct
    mysql> select post from t2;
    +------+
    | post |
    +------+
    | it   |
    | it   |
    | it   |
    | it   |
    | hr   |
    | hr   |
    | sale |
    | sale |
    | sale |
    | sale |
    +------+
    
    mysql> select distinct post from t2;
    +------+
    | post |
    +------+
    | it   |
    | hr   |
    | sale |
    +------+
    ## 通过运算查询 , 计算每个人的年薪
    mysql> select name,salary,salary*12 from t2;
    +-------+----------+-----------+
    | name  | salary   | salary*12 |
    +-------+----------+-----------+
    | jack  |  5000.00 |  60000.00 |
    | tom   |  5500.00 |  66000.00 |
    | robin |  8000.00 |  96000.00 |
    | alice |  7200.00 |  86400.00 |
    | lisi  |   600.00 |   7200.00 |
    | harry |  6000.00 |  72000.00 |
    | trf   | 20000.00 | 240000.00 |
    | test  |  2200.00 |  26400.00 |
    | dog   |  2200.00 |  26400.00 |
    | alex  |  2200.00 |  26400.00 |
    +-------+----------+-----------+
    ## 计算年薪并定义输出字段信息别名 , AS 可去掉
    select name,salary,salary*12 as Annual_salary from t2;
    +-------+----------+---------------+
    | name  | salary   | Annual_salary |
    +-------+----------+---------------+
    | jack  |  5000.00 |      60000.00 |
    | tom   |  5500.00 |      66000.00 |
    | robin |  8000.00 |      96000.00 |
    | alice |  7200.00 |      86400.00 |
    | lisi  |   600.00 |       7200.00 |
    | harry |  6000.00 |      72000.00 |
    | trf   | 20000.00 |     240000.00 |
    | test  |  2200.00 |      26400.00 |
    | dog   |  2200.00 |      26400.00 |
    | alex  |  2200.00 |      26400.00 |
    +-------+----------+---------------+

    条件查询

    • 单条件查询 SELECT 字段1,字段2,..... FROM 表名 WHERE 字段=值;
    • 多条件查询 SELECT 字段1,字段2,..... FROM 表名 WHERE 字段1=值1 (and|or) 字段2=值2;
      • 关键字 BETWEEN AND
      • 关键字 IS NULL
      • 关键字 IN 集合查询
      • 关键字 LIKE 模糊查询
    ## 单条件查询
    mysql> select name,post from t2 where post='hr';
    +-------+------+
    | name  | post |
    +-------+------+
    | lisi  | hr   |
    | harry | hr   |
    +-------+------+
    ## 多条件查询
    mysql> select name,post,salary from t2 where post='hr' and salary >5000;
    +-------+------+---------+
    | name  | post | salary  |
    +-------+------+---------+
    | harry | hr   | 6000.00 |
    +-------+------+---------+
    ## 查找薪资范围在8000-20000,使用BETWEEN区间
    mysql> select name,salary from t2 where salary between 8000 and 20000;
    +-------+----------+
    | name  | salary   |
    +-------+----------+
    | robin |  8000.00 |
    | trf   | 20000.00 |
    +-------+----------+
    ## 查找部门为Null或者没有职责的员工
    mysql> select name,job from t2 where job is null or job='';
    +-------+------+
    | name  | job  |
    +-------+------+
    | harry | NULL |
    | dog   | NULL |
    | alex  |      |
    +-------+------+
    ## 查找有职责的员工
    mysql> select name,job from t2 where job is not null and not job='';
    +-------+--------+
    | name  | job    |
    +-------+--------+
    | jack  | teach  |
    | tom   | teach  |
    | robin | teach  |
    | alice | teach  |
    | lisi  | hrcc   |
    | trf   | salecc |
    | test  | salecc |
    +-------+--------+
    ## 模糊查询like, 通配符%(零到多个字符)
    mysql> select * from t2 where name like 'al%';
    +----+-------+------+------------+------+-------+---------+--------+
    | id | name  | sex  | time       | post | job   | salary  | dep_id |
    +----+-------+------+------------+------+-------+---------+--------+
    |  4 | alice | gril | 2018-02-02 | it   | teach | 7200.00 |    100 |
    | 10 | alex  | man  | 2018-02-05 | sale |       | 2200.00 |    102 |
    +----+-------+------+------------+------+-------+---------+--------+
    ## 通配符_(一个字符)
    mysql> select * from t2 where name like 'al__';
    +----+------+-----+------------+------+------+---------+--------+
    | id | name | sex | time       | post | job  | salary  | dep_id |
    +----+------+-----+------------+------+------+---------+--------+
    | 10 | alex | man | 2018-02-05 | sale |      | 2200.00 |    102 |
    +----+------+-----+------------+------+------+---------+--------+

    查询排序

    低到高排序 ASC (默认)
    高到低排序 DESC

    ##  按单列排序 , 按薪水从低往高排序 , 默认 ASC
    mysql> select * from t2 order by salary asc;
    +----+-------+------+------------+------+--------+----------+--------+
    | id | name  | sex  | time       | post | job    | salary   | dep_id |
    +----+-------+------+------------+------+--------+----------+--------+
    |  5 | lisi  | man  | 2018-02-02 | hr   | hrcc   |   600.00 |    101 |
    |  8 | test  | gril | 2018-02-05 | sale | salecc |  2200.00 |    102 |
    |  9 | dog   | man  | 2018-02-05 | sale | NULL   |  2200.00 |    102 |
    | 10 | alex  | man  | 2018-02-05 | sale |        |  2200.00 |    102 |
    |  1 | jack  | man  | 2018-02-02 | it   | teach  |  5000.00 |    100 |
    |  2 | tom   | man  | 2018-02-03 | it   | teach  |  5500.00 |    100 |
    |  6 | harry | man  | 2018-02-02 | hr   | NULL   |  6000.00 |    101 |
    |  4 | alice | gril | 2018-02-02 | it   | teach  |  7200.00 |    100 |
    |  3 | robin | man  | 2018-02-02 | it   | teach  |  8000.00 |    100 |
    |  7 | trf   | gril | 2018-02-06 | sale | salecc | 20000.00 |    102 |
    +----+-------+------+------------+------+--------+----------+--------+
    ## 按单列排序 , 薪水从高往低排序 , DESC 倒序
    mysql> select * from t2 order by salary desc;
    +----+-------+------+------------+------+--------+----------+--------+
    | id | name  | sex  | time       | post | job    | salary   | dep_id |
    +----+-------+------+------------+------+--------+----------+--------+
    |  7 | trf   | gril | 2018-02-06 | sale | salecc | 20000.00 |    102 |
    |  3 | robin | man  | 2018-02-02 | it   | teach  |  8000.00 |    100 |
    |  4 | alice | gril | 2018-02-02 | it   | teach  |  7200.00 |    100 |
    |  6 | harry | man  | 2018-02-02 | hr   | NULL   |  6000.00 |    101 |
    |  2 | tom   | man  | 2018-02-03 | it   | teach  |  5500.00 |    100 |
    |  1 | jack  | man  | 2018-02-02 | it   | teach  |  5000.00 |    100 |
    |  8 | test  | gril | 2018-02-05 | sale | salecc |  2200.00 |    102 |
    |  9 | dog   | man  | 2018-02-05 | sale | NULL   |  2200.00 |    102 |
    | 10 | alex  | man  | 2018-02-05 | sale |        |  2200.00 |    102 |
    |  5 | lisi  | man  | 2018-02-02 | hr   | hrcc   |   600.00 |    101 |
    +----+-------+------+------------+------+--------+----------+--------+
    ## 多列排序 , 先按入职时间,再按薪水排序
    mysql> select * from t2 order by time asc, salary asc;
    +----+-------+------+------------+------+--------+----------+--------+
    | id | name  | sex  | time       | post | job    | salary   | dep_id |
    +----+-------+------+------------+------+--------+----------+--------+
    |  5 | lisi  | man  | 2018-02-02 | hr   | hrcc   |   600.00 |    101 |
    |  1 | jack  | man  | 2018-02-02 | it   | teach  |  5000.00 |    100 |
    |  6 | harry | man  | 2018-02-02 | hr   | NULL   |  6000.00 |    101 |
    |  4 | alice | gril | 2018-02-02 | it   | teach  |  7200.00 |    100 |
    |  3 | robin | man  | 2018-02-02 | it   | teach  |  8000.00 |    100 |
    |  2 | tom   | man  | 2018-02-03 | it   | teach  |  5500.00 |    100 |
    |  8 | test  | gril | 2018-02-05 | sale | salecc |  2200.00 |    102 |
    |  9 | dog   | man  | 2018-02-05 | sale | NULL   |  2200.00 |    102 |
    | 10 | alex  | man  | 2018-02-05 | sale |        |  2200.00 |    102 |
    |  7 | trf   | gril | 2018-02-06 | sale | salecc | 20000.00 |    102 |
    +----+-------+------+------------+------+--------+----------+--------+
    ## 多列排序 , 先按职位, 再按薪水排序
    mysql> select * from t2 order by post, salary;
    +----+-------+------+------------+------+--------+----------+--------+
    | id | name  | sex  | time       | post | job    | salary   | dep_id |
    +----+-------+------+------------+------+--------+----------+--------+
    |  5 | lisi  | man  | 2018-02-02 | hr   | hrcc   |   600.00 |    101 |
    |  6 | harry | man  | 2018-02-02 | hr   | NULL   |  6000.00 |    101 |
    |  1 | jack  | man  | 2018-02-02 | it   | teach  |  5000.00 |    100 |
    |  2 | tom   | man  | 2018-02-03 | it   | teach  |  5500.00 |    100 |
    |  4 | alice | gril | 2018-02-02 | it   | teach  |  7200.00 |    100 |
    |  3 | robin | man  | 2018-02-02 | it   | teach  |  8000.00 |    100 |
    |  8 | test  | gril | 2018-02-05 | sale | salecc |  2200.00 |    102 |
    |  9 | dog   | man  | 2018-02-05 | sale | NULL   |  2200.00 |    102 |
    | 10 | alex  | man  | 2018-02-05 | sale |        |  2200.00 |    102 |
    |  7 | trf   | gril | 2018-02-06 | sale | salecc | 20000.00 |    102 |
    +----+-------+------+------------+------+--------+----------+--------+

    限制查询的记录数

    ##  查询薪资最高前 5 名同事
    mysql> select * from t2 order by salary desc limit 5;
    +----+-------+------+------------+------+--------+----------+--------+
    | id | name  | sex  | time       | post | job    | salary   | dep_id |
    +----+-------+------+------------+------+--------+----------+--------+
    |  7 | trf   | gril | 2018-02-06 | sale | salecc | 20000.00 |    102 |
    |  3 | robin | man  | 2018-02-02 | it   | teach  |  8000.00 |    100 |
    |  4 | alice | gril | 2018-02-02 | it   | teach  |  7200.00 |    100 |
    |  6 | harry | man  | 2018-02-02 | hr   | NULL   |  6000.00 |    101 |
    |  2 | tom   | man  | 2018-02-03 | it   | teach  |  5500.00 |    100 |
    +----+-------+------+------------+------+--------+----------+--------+
    ##  从第 4 条开始 , 并显示 5 条数据
    mysql> select * from t2 order by salary desc limit 3,5;
    +----+-------+------+------------+------+--------+---------+--------+
    | id | name  | sex  | time       | post | job    | salary  | dep_id |
    +----+-------+------+------------+------+--------+---------+--------+
    |  6 | harry | man  | 2018-02-02 | hr   | NULL   | 6000.00 |    101 |
    |  2 | tom   | man  | 2018-02-03 | it   | teach  | 5500.00 |    100 |
    |  1 | jack  | man  | 2018-02-02 | it   | teach  | 5000.00 |    100 |
    | 10 | alex  | man  | 2018-02-05 | sale |        | 2200.00 |    102 |
    |  8 | test  | gril | 2018-02-05 | sale | salecc | 2200.00 |    102 |
    +----+-------+------+------------+------+--------+---------+--------+

    使用聚合函数查询

    COUNT 个数
    SUM 求和
    AVG 求平均值
    MAX 最大值
    MIN 最小值

    ## 统计当前表总共多少条数据
    mysql> select count(*) from t2;
    +----------+
    | count(*) |
    +----------+
    |       10 |
    +----------+
    ## 统计dep_id为101有多少条数据
    mysql> select count(*) from t2 where dep_id=101;
    +----------+
    | count(*) |
    +----------+
    |        2 |
    +----------+
    ## 薪水最高
    mysql> select max(salary) from t2;
    +-------------+
    | max(salary) |
    +-------------+
    |    20000.00 |
    +-------------+
    ## 薪水最低
    mysql> select min(salary) from t2;
    +-------------+
    | min(salary) |
    +-------------+
    |      600.00 |
    +-------------+
    ## 平均薪水
    mysql> select avg(salary) from t2;
    +-------------+
    | avg(salary) |
    +-------------+
    | 5890.000000 |
    +-------------+
    ## 总共发放多少薪水
    mysql> select sum(salary) from t2;
    +-------------+
    | sum(salary) |
    +-------------+
    |    58900.00 |
    +-------------+
    ## hr部门发放多少薪水
    mysql> select sum(salary) from t2 where post='hr';
    +-------------+
    | sum(salary) |
    +-------------+
    |     6600.00 |
    +-------------+
    ## 哪个部门哪个人薪水最高
    mysql> select * from t2 where salary=(select max(salary) from t2);
    +----+------+------+------------+------+--------+----------+--------+
    | id | name | sex  | time       | post | job    | salary   | dep_id |
    +----+------+------+------------+------+--------+----------+--------+
    |  7 | trf  | gril | 2018-02-06 | sale | salecc | 20000.00 |    102 |
    +----+------+------+------------+------+--------+----------+--------+

    分组查询

    ## ROUP BY 和 GROUP_CONCAT()函数一起使用
    mysql> select post,group_concat(name) from t2 group by post;
    +------+----------------------+
    | post | group_concat(name)   |
    +------+----------------------+
    | hr   | lisi,harry           |
    | it   | jack,tom,robin,alice |
    | sale | trf,test,dog,alex    |
    +------+----------------------+
    ## GROUP BY 和集合函数一起使用
    mysql> select post,sum(salary) from t2 group by post;
    +------+-------------+
    | post | sum(salary) |
    +------+-------------+
    | it   |    25700.00 |
    | hr   |     6600.00 |
    | sale |    26600.00 |
    +------+-------------+

    使用正则表达式查询

    ## 查询名字以 ali 开头
    mysql> select * from t2 where name regexp '^ali';
    +----+-------+------+------------+------+-------+---------+--------+
    | id | name  | sex  | time       | post | job   | salary  | dep_id |
    +----+-------+------+------------+------+-------+---------+--------+
    |  4 | alice | gril | 2018-02-02 | it   | teach | 7200.00 |    100 |
    +----+-------+------+------------+------+-------+---------+--------+
    ## 查询名字以 bin 结尾
    mysql> select * from t2 where name regexp 'bin$';
    +----+-------+-----+------------+------+-------+---------+--------+
    | id | name  | sex | time       | post | job   | salary  | dep_id |
    +----+-------+-----+------------+------+-------+---------+--------+
    |  3 | robin | man | 2018-02-02 | it   | teach | 8000.00 |    100 |
    +----+-------+-----+------------+------+-------+---------+--------+

    多表查询

    多表连接查询
    复合条件连接查询
    子查询

    准备3张数据表

    ## 准备表 1
    mysql> create table t3(
            id int auto_increment primary key not null,
            name varchar(50),
            age int,
            dep_id int
        );
    ## 为表 1 插入数据
    mysql> insert into t3(name,age,dep_id) values
            ('lisi',18,200),
            ('tom',26,201),
            ('jack',30,201),
            ('alice',24,202),
            ('robin',40,'200'),
            ('natasha',28,204);
    ## 查看表 1 数据
    mysql> select * from t3;
    +----+---------+------+--------+
    | id | name    | age  | dep_id |
    +----+---------+------+--------+
    |  1 | lisi    |   18 |    200 |
    |  2 | tom     |   26 |    201 |
    |  3 | jack    |   30 |    201 |
    |  4 | alice   |   24 |    202 |
    |  5 | robin   |   40 |    200 |
    |  6 | natasha |   28 |    204 |
    +----+---------+------+--------+
    ## 准备表 2
    mysql> create table t4(
            dep_id int,
            dept_name varchar(100)
        );
    ## 为表 2 插入数据
    mysql> insert into t4 values
            (200,'hr'),
            (201,'it'),
            (202,'xs'),
            (203,'cw');
    ## 查看表 2 数据
    mysql> select * from t4;
    +--------+-----------+
    | dep_id | dept_name |
    +--------+-----------+
    |    200 | hr        |
    |    201 | it        |
    |    202 | xs        |
    |    203 | cw        |
    +--------+-----------+
    ## 准备表 3
    mysql> create table t5(
            id int primary key not null,
            salary double(15,2) not null
        );
    ## 为表 3 插入数据
    mysql> insert into t5 values 
            (1,6000),
            (2,5500),
            (3,5000),
            (4,7200),
            (5,8000);
    ## 查看表 3 数据
    mysql> select * from t5;
    +----+---------+
    | id | salary  |
    +----+---------+
    |  1 | 6000.00 |
    |  2 | 5500.00 |
    |  3 | 5000.00 |
    |  4 | 7200.00 |
    |  5 | 8000.00 |
    +----+---------+

    交叉连接, 不使用任何匹配条件

    mysql> select t3.name,t3.age,t3.dep_id,t4.dept_name from t3,t4;
    +---------+------+--------+-----------+
    | name    | age  | dep_id | dept_name |
    +---------+------+--------+-----------+
    | lisi    |   18 |    200 | hr        |
    | lisi    |   18 |    200 | it        |
    | lisi    |   18 |    200 | xs        |
    | lisi    |   18 |    200 | cw        |
    | tom     |   26 |    201 | hr        |
    | tom     |   26 |    201 | it        |
    | tom     |   26 |    201 | xs        |
    | tom     |   26 |    201 | cw        |
    | jack    |   30 |    201 | hr        |
    | jack    |   30 |    201 | it        |
    | jack    |   30 |    201 | xs        |
    | jack    |   30 |    201 | cw        |
    | alice   |   24 |    202 | hr        |
    | alice   |   24 |    202 | it        |
    | alice   |   24 |    202 | xs        |
    | alice   |   24 |    202 | cw        |
    | robin   |   40 |    200 | hr        |
    | robin   |   40 |    200 | it        |
    | robin   |   40 |    200 | xs        |
    | robin   |   40 |    200 | cw        |
    | natasha |   28 |    204 | hr        |
    | natasha |   28 |    204 | it        |
    | natasha |   28 |    204 | xs        |
    | natasha |   28 |    204 | cw        |
    +---------+------+--------+-----------+

    内连接, 只连接匹配的行

    ## 只找出有部门的员工 , ( 部门表中没有 natasha 所在的部门 )
    mysql> select t3.id,t3.name,t3.age,t4.dep_id,t4.dept_name from t3,t4 where t3.dep_id=t4.dep_id;
    +----+-------+------+--------+-----------+
    | id | name  | age  | dep_id | dept_name |
    +----+-------+------+--------+-----------+
    |  1 | lisi  |   18 |    200 | hr        |
    |  2 | tom   |   26 |    201 | it        |
    |  3 | jack  |   30 |    201 | it        |
    |  4 | alice |   24 |    202 | xs        |
    |  5 | robin |   40 |    200 | hr        |
    +----+-------+------+--------+-----------+
    ## 第二种方式
    mysql> select t3.id,t3.name,t3.age,t4.dep_id,t4.dept_name from t3 inner join t4 on t3.dep_id=t4.dep_id;
    +----+-------+------+--------+-----------+
    | id | name  | age  | dep_id | dept_name |
    +----+-------+------+--------+-----------+
    |  1 | lisi  |   18 |    200 | hr        |
    |  2 | tom   |   26 |    201 | it        |
    |  3 | jack  |   30 |    201 | it        |
    |  4 | alice |   24 |    202 | xs        |
    |  5 | robin |   40 |    200 | hr        |
    +----+-------+------+--------+-----------+

    外连接

    ## 左连接
    mysql> select id,name,t4.dept_name from t3 left join t4 on t3.dep_id = t4.dep_id;
    +----+---------+-----------+
    | id | name    | dept_name |
    +----+---------+-----------+
    |  1 | lisi    | hr        |
    |  5 | robin   | hr        |
    |  2 | tom     | it        |
    |  3 | jack    | it        |
    |  4 | alice   | xs        |
    |  6 | natasha | NULL      |
    +----+---------+-----------+
    ## 右连接
    mysql> select id,name,t4.dept_name from t3 right join t4 on t3.dep_id = t4.dep_id;
    +------+-------+-----------+
    | id   | name  | dept_name |
    +------+-------+-----------+
    |    1 | lisi  | hr        |
    |    2 | tom   | it        |
    |    3 | jack  | it        |
    |    4 | alice | xs        |
    |    5 | robin | hr        |
    | NULL | NULL  | cw        |
    +------+-------+-----------+

    符合条件连接查询

    ## 以内连接的方式查询 t3 和 t4 表 , 找出公司所有部门中年年龄大于 25 岁的员工
    mysql> select t3.id,t3.name,t3.age,t4.dept_name from t3,t4 where t3.dep_id = t4.dep_id and age >25;
    +----+-------+------+-----------+
    | id | name  | age  | dept_name |
    +----+-------+------+-----------+
    |  5 | robin |   40 | hr        |
    |  2 | tom   |   26 | it        |
    |  3 | jack  |   30 | it        |
    +----+-------+------+-----------+
    ## 以内连接的方式查询 t3 和 t4 表,并且以 age 字段降序显示
    mysql> select t3.id,t3.name,t3.age,t4.dept_name from t3,t4 where t3.dep_id = t4.dep_id order by age desc;
    +----+-------+------+-----------+
    | id | name  | age  | dept_name |
    +----+-------+------+-----------+
    |  5 | robin |   40 | hr        |
    |  3 | jack  |   30 | it        |
    |  2 | tom   |   26 | it        |
    |  4 | alice |   24 | xs        |
    |  1 | lisi  |   18 | hr        |
    +----+-------+------+-----------+

    三表连接

    三表连接不是极限,只要把表之间的关系表达清楚,是可以无限表连接的

    ## 三表查询所有名字、部门、薪水数据
    mysql> select t3.name,t4.dept_name,t5.salary from t3,t4,t5 where t3.id=t5.id and t3.dep_id=t4.dep_id;
    +-------+-----------+---------+
    | name  | dept_name | salary  |
    +-------+-----------+---------+
    | lisi  | hr        | 6000.00 |
    | tom   | it        | 5500.00 |
    | jack  | it        | 5000.00 |
    | alice | xs        | 7200.00 |
    | robin | hr        | 8000.00 |
    +-------+-----------+---------+
    ## 第二种方式
    mysql> select t3.name,t4.dept_name,t5.salary from t4 inner join t3 on t3.dep_id=t4.dep_id inner join t5 on t3.id=t5.id;
    +-------+-----------+---------+
    | name  | dept_name | salary  |
    +-------+-----------+---------+
    | lisi  | hr        | 6000.00 |
    | tom   | it        | 5500.00 |
    | jack  | it        | 5000.00 |
    | alice | xs        | 7200.00 |
    | robin | hr        | 8000.00 |
    +-------+-----------+---------+

    子查询

    子查询是将一个查询语句嵌套在另一个查询语句中。
    内层查询语句的查询结果,可以为外层查询语句提供查询条件。
    子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS 等关键字 还可以包含比较运算符:= 、 !=、> 、<等

    ## 带 IN 关键字的子查询 查询 t3 表,但 dept_id 必须在 t4 表中出现过
    mysql> select * from t3 where dep_id in (select dep_id from t4);
    +----+-------+------+--------+
    | id | name  | age  | dep_id |
    +----+-------+------+--------+
    |  1 | lisi  |   18 |    200 |
    |  2 | tom   |   26 |    201 |
    |  3 | jack  |   30 |    201 |
    |  4 | alice |   24 |    202 |
    |  5 | robin |   40 |    200 |
    +----+-------+------+--------+
    # 代表运算符子查询 , 查询年年龄大于等于 25 岁员工所在部门(查询老龄化的部门)
    mysql> select dep_id,dept_name from t4 where dep_id in (select distinct dep_id from t3 where age >=25);
    +--------+-----------+
    | dep_id | dept_name |
    +--------+-----------+
    |    201 | it        |
    |    200 | hr        |
    +--------+-----------+
    # 子查询 EXISTS 关键字表示存在。在使用 EXISTS 关键字时,内层查询语句不返回查询的记录,而是返回一个真假值。
    #Ture 或 False ,当返回 Ture 时,外层查询语句将进行查询;当返回值为 False 时,外层查询语句不进行查询,实际生产当中不常用,反而是 SQL 注入中常用
    ## t4 表中存在 dep_id=203 , Ture
    mysql> select * from t3 where exists (select * from t4 where dep_id=203);
    +----+---------+------+--------+
    | id | name    | age  | dep_id |
    +----+---------+------+--------+
    |  1 | lisi    |   18 |    200 |
    |  2 | tom     |   26 |    201 |
    |  3 | jack    |   30 |    201 |
    |  4 | alice   |   24 |    202 |
    |  5 | robin   |   40 |    200 |
    |  6 | natasha |   28 |    204 |
    +----+---------+------+--------+
    ## t4 表中不存在 dep_id=300 , False
    mysql> select * from t3 where exists (select * from t4 where dep_id=300);

    联合查询(常用于 SQL 注入)

    语法:SQL1 UNION SQL2(去重)
    SQL1 UNION ALL SQL2(不去重)
    表字段最后显示必须相同

    mysql> select * from t4 union select * from t5;
    +--------+-----------+
    | dep_id | dept_name |
    +--------+-----------+
    |    200 | hr        |
    |    201 | it        |
    |    202 | xs        |
    |    203 | cw        |
    |      1 | 6000      |
    |      2 | 5500      |
    |      3 | 5000      |
    |      4 | 7200      |
    |      5 | 8000      |
    |      6 | 4000      |
    +--------+-----------+
  • 相关阅读:
    Windows照片查看器全屏浏览查看
    Windows调出软键盘
    IE叉事件
    对gridview的小改动
    gridview小把戏
    安全认证(转)
    用数组的方式实现DataTable中的distinct(转)
    TreeView的简单应用
    禁止按钮重复提交
    配置Microsoft Visual SourceSafe 2005的Internet访问(转)
  • 原文地址:https://www.cnblogs.com/songguoyou/p/11883740.html
Copyright © 2011-2022 走看看