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
案例
查询前五条员工信息
SELECT * FROM employees LIMIT 0, 5;
# 或者
SELECT * FROM employees LIMIT 5;查询第11条~第25条员工信息
SELECT * FROM employees LIMIT 10, 15;
有奖金的员工信息,并且工资较高的前10名显示出来
SELECT
*
FROM
employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC
LIMIT 10;
联合查询
合并、联合,将多次查询结果合并成一个结果
语法
查询语句1
union [all]
查询语句2
union [all]
...
意义
将一条比较复杂的查询语句拆分成多条语句
适用于查询多个表的时候,查询的列基本是一致
特点
要求多条查询语句的查询列数是一致的!
要求多条查询语句的查询的每一列的类型和顺序最好一致
UNION关键字默认去重,如果使用UNION ALL可以包含重复项
案例
查询部门编号>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(值,...);
特点:
要求值的类型和字段的类型要一致或兼容
字段的个数和顺序不一定与原始表中的字段个数和顺序一致
但必须保证值和字段一一对应
假如表中有可以为null的字段,注意可以通过以下两种方式插入null值
① 字段和值都省略
② 字段写上,值使用null
字段和值的个数必须一致
字段名可以省略,默认所有列
方式二
语法
insert into 表名 set 字段=值,字段=值,...;
两种方式的区别:
方式一支持一次插入多行,语法如下:
insert into 表名[(字段名,..)] values(值,..),(值,...),...;
方式一支持子查询,语法如下:
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 筛选条件];
将3号员工的last_name修改为“drelxer”
UPDATE my_employees SET last_name='drelxer' WHERE id = 3;
将所有工资少于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 筛选条件]
将userid 为Bbiri的user表和my_employees表的记录全部删除
DELETE u,e
FROM
users u
JOIN my_employees e
ON u.`userid` = e.`Userid`
WHERE
u.`userid` = 'Bbiri';删除所有数据
DELETE FROM my_employees;
DELETE FROM users;
TRUNCATE
清空表
语法
truncate table 表名;
DELETE和TRUNCATE的区别
TRUNCATE删除后,如果再插入,标识列从1开始。DELETE删除后,如果再插入,标识列从断点开始
DELETE可以添加筛选条件,TRUNCATE不可以添加筛选条件
TRUNCATE效率较高
TRUNCATE没有返回值,DELETE可以返回受影响的行数
TRUNCATE不可以回滚,DELETE可以回滚
以上是关于MySQL的分页查询和联合查询以及DML的主要内容,如果未能解决你的问题,请参考以下文章