一、数据操作
1、增
#新增
insert into 表名(字段列表) values(值列表);
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
#蠕虫复制 (优点:快速复制数据,测试服务器压力)
insert into 表名1_插入 select (字段列表) from 表名2_复制;
#当主键与表中数据重复时执行更新
insert into 表名(字段列表) values(值列表) on duplicate key update 字段1=值1,字段n=值n;
2、删除
#删除
delete from 表名[删除条件];
delete from 表名 [where条件] [order by 字段名 asc|desc] [limit];
#例如:
delete from user where age<1;--删除age小于1数据
3、修改
#修改
update 表名 set 字段1=新值1,字段n=新值n [修改条件];
update 表名 set 字段1=值1,字段n=值n [where条件] [order by 字段名 asc|desc] [limit];
#例如:
update user set age=100 where id=1;
4、单表查询
#查询
select [select选项] *|字段列表 [as 字段别名] from 表名 [where子句][group by子句][having子句][order by子句][limit子句];
select选项: 系统在查询到相关数据之后,如何显示.
select选项的两个值:all: 默认值,保留所有的查询结果、distinct: 去重,去掉重复的查询结果.
having子句是配合group by 使用的相当于where
*as
#关键字 as:可以为每个列使用别名. 适用于简化列标识,避免多个列标识符重复. 也可省略as.
#例如:
select (Math+English+Chinese) as sum from score;
#省略as
select (Math+English+Chinese)/3 avg from score;
*虚拟表的名称:dual :
Mysql中执行select语句在适当的时候会自动创建一个虚拟表,官方声明纯粹是为了满足select ... from...这一习惯问题,mysql会忽略对该表的引用。
#例如
select now() from dual;
#可省略
select now();
*where
where子句 (条件查询)
从from获得的数据源中进行查询
整型: 1表示真(返回查询记录);0表示假(不返回记录)
表达式由运算符和运算数组成.
运算数: 变量(字段)、值、函数返回值
*运算符
算术运算符
MySQL 支持的算术运算符包括:
运算符 作用
+ 加法
- 减法
* 乘法
/ 或 DIV 除法
% 或 MOD 取余
在除法运算和模运算中,如果除数为0,将是非法除数,返回结果为NULL。
比较运算符
SELECT 语句中的条件语句经常要使用比较运算符。通过这些比较运算符,可以判断表中的哪些记录是符合条件的。比较结果为真,则返回 1,为假则返回 0,比较结果不确定则返回 NULL。
符号 描述 备注
= 等于
<>, != 不等于
> 大于
< 小于
<= 小于等于
>= 大于等于
BETWEEN 在两值之间 >=min&&<=max
NOT BETWEEN 不在两值之间
IN 在集合中
NOT IN 不在集合中
<=> 严格比较两个NULL值是否相等 两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0
LIKE 模糊匹配 通配符; _ :代表任意的单个字符; % :代表任意的字符
REGEXP 或 RLIKE 正则式匹配
IS NULL 为空
IS NOT NULL 不为空
逻辑运算符
逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回 1。如果表达式是假,结果返回 0。
运算符号 作用
NOT 或 ! 逻辑非
AND 逻辑与
OR 逻辑或
XOR 逻辑异或
位运算符
位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。
运算符号 作用
& 按位与
| 按位或
^ 按位异或
! 取反
<< 左移
>> 右移
运算符优先级
最低优先级为: :=。
最高优先级为: !、BINARY、 COLLATE。
*group by
group by 字段/别名 [排序方式] 分组后排序: asc 升序(默认),desc 降序
统计函数需配合group by使用:
count 返回不同的非NULL统计值 count(*)、count(字段)
sum 求和; max 求最大值; min 求最小值; avg 求平均值
#例如:
select count(*) as total from student;
#查询各个班级总成绩,分组班级降序.
select class, sum(score) as sum from student group by class desc;
#查询各个班级最高成绩,分数要大于80,分组班级升序.
select id,class, max(score) as max from student where score>80 group by class;
*having 子句 (条件查询)
类似where功能、用法相同,执行时机不同.
本质区别:where子句是把磁盘上的数据筛选到内存上,而having子句是把内存中的数据再次进行筛选.
where不可以使用统计函数. 一般需用统计函数配合group by才会用到having
#例如(查询各个班级最低成绩,分组班级,最低分数大于80)
#错误
select class, min(score) as min from student where min(score)>80 group by class;
#正确
select class, min(score) as min from student group by class having min(score)>80;
*order by子句 (排序)
order by 字段1[asc|desc],字段n[asc|desc]
排序: asc 升序(默认),desc 降序
#例如(查询score大于80,排序score升序和name降序)
select * from student where score >80 order by score,name desc;
*limit 子句(限制查询结果数量)
limit offset,length 语法解析: offset是指偏移量,默认为0; length是指需要显示的记录数.
分页示例说明: $page = 3;
//第三页 $pageSize = 10;
//页面显示10条记录 $offset = ($page - 1) * $pageSize;
//偏移量为20 limit $offset,$pageSize
//实现分页 偏移20,显示10
#例如(查询score大于80,排序score升序和name降序,偏移量为1,显示3条记录)
select * from student where score >60 order by score,name desc limit 1,3;
5、多表查询
*级联查询(联合查询 关键字:union)
联合查询:就是将多个查询结果进行纵向上的拼接. (select语句2的查询结果放在select语句1查询结果的后面)
#级联查询
select语句1
union [all | distinct]
select 语句2
union [all | distinct]
select 语句n
*连接查询
+交叉连接
#交叉连接 cross join(一张表的一条记录去连接另一张表中的所有记录,并且保存所有的记录包含两个表的所有的字段.结果上看,就是对两张表做笛卡尔积,有n1*n2条记录.)
select *|字段列表 from 表名1 cross join 表名2;
+内连接(如果数据不存在,不会出现在连接结果中)
数据在左表中存在,同时在右表中又有对应的匹配的结果才会被保存. 如果没有匹配上,数据没有意义不会保存. 通常就是两张表中存在相同的某个字段.(项目中通常是关联主键ID) using() 用法连接两表公共字段. 例如:using(ID)
#例如
select student.*, teacher.class as t_class, teacher.name as t_name from student join teacher on student.class = teacher.class;
查询结果
+外连接 outer join(如果数据不存在,也会出现在连接结果中.)
#左外连接 left join(如果数据不存在,左表记录会出现,而右表为null填充)
select *|字段列表 from 左表 left [outer] join 右表 on 左表.字段 = 右表.字段 [五子句];
#右外连接 right join(如果数据不存在,右表记录会出现,而左表为null填充)
select *|字段列表 from 右表 right [outer] join 左表 on 右表.字段 = 左表.字段 [五子句];
#例如
select student.*, teacher.class as t_class, teacher.name as t_name from student left join teacher on student.class = teacher.class;
查询结果
+自然连接 natural join(自动判断连接条件完成连接.)
#自然内连接 natural inner join(自然内连接其实就是内连接,这里的匹配条件是由系统自动指定.)
select *|字段列表 from 左表 natural [inner] join 右表;
#自然外连接 natural outer join(自然外连接分为自然左外连接和自然右外连接.匹配条件也是由系统自动指定.)
#自然左外连接 natural left join
select *|字段列表 from 左表 natural left [outer] join 右表;
#自然右外连接 natural right join
select *|字段列表 from 右表 natural right [outer] join 左表;
*子查询
子查询(内查询)在主查询(外查询)之前一次执行完成,子查询的结果被主查询使用. 使用子查询需用括号包裹.
#单一值: 返回单行单列的子查询,也叫标量子查询.
select max(score) as max from student;
#一列: 返回单列的子查询,也叫列子查询.
select name from student;
#一行: 返回一行的子查询,也加行子查询.
select *|字段列表 from 表名 where(字段1,字段n)=(行子查询结果)
#多行多列: 返回多行多列的子查询,也叫表子查询.
例如:(查询B班和C班,排序score字段升序)
select * from student where class in ('B','C') order by score;
#exists(主要作用就是判断后面的select语句有没有查询到数据.结果为true有返回数据,否则就是false.)
select exists (select * from student where name ='uzi');
---------------------