MySQL的分页查询和联合查询以及DML

Posted 程序员汪汪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL的分页查询和联合查询以及DML相关的知识,希望对你有一定的参考价值。

分页查询

应用场景

当要显示的数据,一页显示不全,需要分页提交sql请求

语法

 select 查询列表
     from
    [join type] join 表2
     on 连接条件
     where 筛选条件
     group by 分组字段
     having 分组后的筛选
     order by 排序的字段
     limit [offset,]size;

offset 要显示条目的起始索引(起始索引从0开始) size 要显示的条目个数

分页公式

(page - 1) * size, size

案例

  1. 查询前五条员工信息

     SELECT * FROM employees LIMIT 0, 5;
     # 或者
     SELECT * FROM employees LIMIT 5
  2. 查询第11条~第25条员工信息

     SELECT * FROM employees LIMIT 10, 15;
  3. 有奖金的员工信息,并且工资较高的前10名显示出来

     SELECT 
        *
     FROM
        employees
     WHERE commission_pct IS NOT NULL
     ORDER BY salary DESC
     LIMIT 10;

联合查询

合并、联合,将多次查询结果合并成一个结果

语法

 查询语句1
 union [all]
 查询语句2
 union [all]
 ...

意义

  1. 将一条比较复杂的查询语句拆分成多条语句

  2. 适用于查询多个表的时候,查询的列基本是一致

特点

  1. 要求多条查询语句的查询列数是一致的!

  2. 要求多条查询语句的查询的每一列的类型和顺序最好一致

  3. UNION关键字默认去重,如果使用UNION ALL可以包含重复项

案例

  1. 查询部门编号>90或邮箱包含a的员工信息

     SELECT * FROM employees WHERE email LIKE '%a%' OR department_id>90;
     SELECT * FROM employees  WHERE email LIKE '%a%'
     UNION
     SELECT * FROM employees  WHERE department_id>90;

DML(数据操纵语言)

DML(Data Manipulation Language - 数据操纵语言) 可以在下列条件下执行:

  • 向表中插入数据

  • 修改现存数据

  • 删除现存数据

事务是由完成若干项工作的DML语句组成的

运行以下脚本创建表my_employees

 USE myemployees;
 CREATE TABLE my_employees(
    Id INT(10),
    First_name VARCHAR(10),
    Last_name VARCHAR(10),
    Userid VARCHAR(10),
    Salary DOUBLE(10,2)
 );
 
 CREATE TABLE users(
    id INT,
    userid VARCHAR(10),
    department_id INT
 );

显示表my_employees的结构

 DESC my_employees;

INSERT

方式一

语法

 insert into 表名(字段名,...) values(值,...);

特点:

  1. 要求值的类型和字段的类型要一致或兼容

  2. 字段的个数和顺序不一定与原始表中的字段个数和顺序一致

    但必须保证值和字段一一对应

  3. 假如表中有可以为null的字段,注意可以通过以下两种方式插入null值

    ① 字段和值都省略

    ② 字段写上,值使用null

  4. 字段和值的个数必须一致

  5. 字段名可以省略,默认所有列

方式二

语法

 insert into 表名 set 字段=值,字段=值,...;

两种方式的区别:

  1. 方式一支持一次插入多行,语法如下:

     insert into 表名[(字段名,..)] values(值,..),(值,...),...;
  2. 方式一支持子查询,语法如下:

     insert into 表名
     查询语句;

向表中插入数据

向my_employees表中插入下列数据

ID FIRST_NAME LAST_NAME USERID SALARY
1 patel Ralph Rpatel 895
2 Dancs Betty Bdancs 860
3 Biri Ben Bbiri 1100
4 Newman Chad Cnewman 750
5 Ropeburn Audrey Aropebur 155
 INSERT INTO my_employees
 VALUES
    ( 1, 'patel', 'Ralph', 'Rpatel', 895 ),
    ( 2, 'Dancs', 'Betty', 'Bdancs', 860 ),
    ( 3, 'Biri', 'Ben', 'Bbiri', 1100 ),
    ( 4, 'Newman', 'Chad', 'Cnewman', 750 ),
    ( 5, 'Ropeburn', 'Audrey', 'Aropebur', 1550 );

或者

 # 先删除表数据
 DELETE FROM my_employees;
 # 再插入
 INSERT INTO my_employees
 SELECT 1,'patel','Ralph','Rpatel',895 UNION
 SELECT 2,'Dancs','Betty','Bdancs',860 UNION
 SELECT 3,'Biri','Ben','Bbiri',1100 UNION
 SELECT 4,'Newman','Chad','Cnewman',750 UNION
 SELECT 5,'Ropeburn','Audrey','Aropebur',1550;

向users表中插入数据

 INSERT INTO users
 VALUES
    ( 1, 'Rpatel', 10 ),
    ( 2, 'Bdancs', 10 ),
    ( 3, 'Bbiri', 20 );

UPDATE

修改单表的记录

语法:

 update 表名 set 字段=值,字段=值 [where 筛选条件];
  1. 将3号员工的last_name修改为“drelxer”

     UPDATE my_employees SET last_name='drelxer' WHERE id = 3;
  2. 将所有工资少于900的员工的工资修改为1000

     UPDATE my_employees SET salary=1000 WHERE salary<900;

修改多表的记录

语法:

 update 表1 别名 
 left|right|inner join 表2 别名
 on 连接条件  
 set 字段=值,字段=值
 [where 筛选条件];

DELETE

删除单表的记录

语法:

 delete from 表名 [where 筛选条件][limit 条目数]

级联删除

语法:

 delete 别名1,别名2 from 表1 别名 
 inner|left|right join 表2 别名
 on 连接条件
  [where 筛选条件]
  1. 将userid 为Bbiri的user表和my_employees表的记录全部删除

     DELETE u,e 
     FROM
        users u
         JOIN my_employees e
     ON u.`userid` = e.`Userid`
     WHERE
        u.`userid` = 'Bbiri';
  2. 删除所有数据

     DELETE FROM my_employees;
     DELETE FROM users;

TRUNCATE

清空表

语法

 truncate table 表名;

DELETE和TRUNCATE的区别

  1. TRUNCATE删除后,如果再插入,标识列从1开始。DELETE删除后,如果再插入,标识列从断点开始

  2. DELETE可以添加筛选条件,TRUNCATE不可以添加筛选条件

  3. TRUNCATE效率较高

  4. TRUNCATE没有返回值,DELETE可以返回受影响的行数

  5. TRUNCATE不可以回滚,DELETE可以回滚


以上是关于MySQL的分页查询和联合查询以及DML的主要内容,如果未能解决你的问题,请参考以下文章

分页查询+联合查询(MySQL)

分页查询+联合查询(MySQL)

分库分表后的分页查询

mysql的分页使用子查询?

oracle 的分页查询与mysql 的分页查询

java查询的分页思路!!