目录
增删查改就是标题后简称的CURD操作:CRUD:Create(创建)、Retrieve(读取)、Update(更新)、Delete(删除):
一、Create(创建):
首先准备一个学生表,表结构如下:
create table stu(
-> id int primary key,
-> name varchar(20),
-> age int,
-> gender char(2) default '男');
1、单行、多行数据全列插入:
全列插入时,语法如下:
单行数据插入:
insert into 表名 values(列字段1, 列字段2, ...);
多行数据插入:
insert into 表名 values(列字段1, 列字段2, ...), (列字段1, 列字段2, ...), ...;
例如下图:往stu表中全列插入一行数据、全列插入两行数据:
2、指定列数据插入:
insert into 表名(指定列1, 指定列2, ...) values(指定列1, 指定列2, ...);
例如往stu表中插入一名学生,指定id和name列:
3、插入否则更新:
针对由于主键或者唯一键对应的值已经存在而导致插入失败情况可以考虑使用:
insert into ... on duplicate key update 想更改的字段(逗号隔开);
例如:上表中已存在id为1的主键,也就是zhangsan,此时再插入id为1的数据肯定会主键冲突,那么如果不需要zhangsan这一条数据,直接更改为sunqi,age改为24的话就可以使用这条指令,示例:
4、替换:
与insert的语法一样:
replace into 表名(可选字段) values(列字段1, 列字段2, ...);
使用场景:
在主键或者唯一键 没有冲突时,则直接插入。主键或者唯一键 如果冲突时,则删除后再插入。
例如:
二、Retrieve(读取):
先来一张成绩表作为案例:
表结构:
CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT '同学姓名',
chinese float DEFAULT 0.0 COMMENT '语文成绩',
math float DEFAULT 0.0 COMMENT '数学成绩',
english float DEFAULT 0.0 COMMENT '英语成绩'
);
插入数据:
INSERT INTO exam_result (name, chinese, math, english) VALUES
('张三', 67, 98, 56),
('李四', 87, 78, 77),
('王五', 88, 98, 90),
('赵六', 82, 84, 67),
('孙七', 55, 85, 45),
('周八', 70, 73, 78),
('吴九', 75, 65, 30);
1、全列查询:
select *from 表名;
一般情况下不建议使用*进行全列查询,因为正常情况下一个数据库的数据是非常庞大的,全列查询时,查询全部数据的话传输的数据量会非常大,很容易卡死。像是我们这种学习用的到还没影响那么大。示例:
2、指定列查询:
select 字段1, 字段2, ... from 表名;
指定列的顺序并不需要按定义表的顺序来。指定列查询示例(查询每个人的数学成绩):
3、合并列查询:
有的时候,我们查询的字段可能是一个表达式例如查询所有人的总分:
我们也可以在字段的后面跟上 as 关键字进行重命名(as可以省略,但一般为了可读性不会选择省略):
补充:对字段的查询结果去重:
select distinct 查询字段 from 表名;
示例:
4、where条件:
总览:
比较运算符 | 说明: |
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,NULL 安全,例如 NULL NULL 的结果是 TRUE(1) |
!=, <> | 不等于 |
BETWEEN a0 AND a1 | 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN (option, ...) | 如果是 option 中的任意一个,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
逻辑运算符 | 说明: |
AND | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |
OR | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT | 条件为 TRUE(1),结果为 FALSE(0) |
示例1、查询数学成绩小于80分的同学及其数学成绩:
示例2、查询英语成绩在60 ~ 80分区间的同学及其英语成绩:
示例3、查询语文成绩是88分或87分或86分的同学及其语文成绩:
示例四、模糊匹配与严格匹配:
%是模糊匹配,会匹配任意个字符,_是严格匹配,有多少_就会匹配对应个数的字符
数学成绩大于80且不姓张的同学及其数学成绩:
5、对查询结果排序
select 查询字段 from 表名 order by 排序字段 asc(升序)/desc(降序)
示例1、查询同学及其数学成绩,升序显示:
示例2、查询同学及其总分,降序显示:
6、筛选分页结果:
语法:
-- 起始下标为 0
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
这就是应对前面所说的面对一张未知大小的表时不要上来就直接全列查询,以免数据库卡死崩溃,
一般用第2条比较常用一点,示例:查询表中的前三条数据:
三、Update(更新):
语法:
UPDATE table_name SET column = expr [, column = expr ...] [WHERE ...] [ORDER BY ...] [LIMIT ...]
进行数据更新时要注意,如果后面不指定更新哪一条数据的话会直接进行全表更新!!!示例:
全表更新示例:
还可以结合其他关键字来组成复合语句进行更新,例如按英语成绩升序排序,将英语成绩最低的三名同学的英语成绩加上100分:
四、Delete(删除):
语法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
1、指定删除:
示例:指定删除李四同学的考试成绩:
2、整表删除:
整表删除实际上就是删除表中所有的数据,语法:
delete from 表名;
在这里使用delete删除整表数据的话,要注意一个点,就是如果表中字段带有auto_increment也就是自增长的话,这个计数是不会被清零的,跟插入失败一样,也就是在下次插入数据的时候会自动在这个表结构维护的计数上加一,例如下:
如果想要清空表的同时清空auto_increment的计数,那么就使用截断表,语法如下:
TRUNCATE [TABLE] table_name
但是注意,这个操作慎重使用,truncate只能对整表进行操作,是无法像delete一样只针对某一条数据进行删除,而且truncate实际上是直接删除数据,而不像delete一样要经过事务,所以要比delete快,但是也就意味着无法进行数据回滚!
五、聚合函数与分组查询:
1、聚合函数:
函数: | 说明: |
COUNT | 返回查询到的数据的 数量 |
SUM | 返回查询到的数据的 总和 |
AVG | 返回查询到的数据的 平均值 |
MAX | 返回查询到的数据的 最大值 |
MIN | 返回查询到的数据的 最小值 |
就拿之前的成绩表作为示例演示:
示例一、统计班里人数总和:
示例二、统计所有人的语文成绩全部加起来的值:
示例三、统计班级的平均总分:
示例四、返回英语的最高分:
示例五、返回英语分数大于60的最低分:
2、分组查询:
分组查询通过GROUP BY语句实现的,它允许你根据一个或多个列的值对查询结果集进行分组。这种分组功能在数据分析和报告中非常有用,尤其是当你需要对大量数据进行汇总时。分组查询通常与聚合函数结合使用,以对每个分组执行计算。语法如下:
select column1, column2, .. from table group by column;
这里准备一张员工表emp来做样例:
示例一、显示每个部门的平均工资和最高工资:
示例二、显示每个部门的每种岗位的平均工资和最低工资:
示例三、显示工资低于2000的部门和他的平均工资
having使用:having 与 group by搭配使用,对分组进行筛选,作用类似where。
至于为什么在分组查询里也能使用as给组起别名并用别名进行筛选,是因为as的执行顺序在group by前面,属于from这里:
from > on> join > where > group by > with > having > select > distinct > order by > limit
六、基本函数使用:
1、日期函数:
函数名称 | 说明: |
current_date( ) | 当前日期 |
current_time( ) | 当前时间 |
current_timestamp( ) | 当前时间戳 |
date(datetime) | 返回datetime参数的日期部分 |
date add(date, interval d_value_type) | 在date中添加日期或时间 interval后的数值单位可以是:year minute second day |
date_sub(date, interval d_value_type) | 在date中减去日期或时间 interval后的数值单位可以是:year minute second day |
datediff(date1, date2) | 两个日期的差,单位是天 |
now( ) | 当前日期时间 |
使用示例:
例如创建一个留言板:
2、字符串函数:
函数名称 | 说明: |
charset(str) | 返回字符串字符集 |
concat(string, […]) | 连接字符串 |
instr(string,substring) | 返回substring在string中出现的位置,没有返回0 |
ucase(string) | 将string转换成大写 |
lcase(string) | 将string转换成小写 |
left(string,length) | 从string中的左边起取length个字符 |
length(string) | 返回string的长度 |
replace(str,search_str,replace_str) | 在str中用replace_str替换search_str |
strcmp(string1,string2) | 逐字符比较两字符串大小 |
substring(str,position,[length] ) | 从str的postion开始,取length个字符(不填length则默认截取position位置往下的全部) |
ltrim(string) rtrim(string) trim(string) | 去除前空格或后空格 |
使用示例:
新建一个简单的成绩表拿来做示例,信息如下:
示例一、获取score表中的name字段数据的字符集:
示例二、获取score表中的name字段数据占用字符的字节数:
注意,这里length返回的是字节数,而不是字符数,如果是中文字符,则会按照编码格式返回字节数,如下我插入一条中文字符的张三,返回的字节数是6:
示例三、按照以下格式输出score表中的信息:"xxx的语文成绩是xxx分,数学成绩是xxx分"
示例四、将score表中的name字段的数据中的a字符替换为b字符:
示例五、以首字母大小的方式显示name字符的数据:
其余函数示例:
3、数学函数:
函数名称 | 说明: |
abs(number) | 返回number绝对值 |
bin(decimal_number) | 十进制转换二进制 |
hex(decimal_Number) | 转换成十六进制 |
conv(number,from base,to base) | 进制转换 |
ceiling(number) | 向上取整 |
floor (number) | 向下去整 |
format(number,n) | 格式化,保留n位小数位数 |
rand() | 返回随机浮点数,范围[0.0,1.0) |
mod (number,denominator) | 取模,求余 |
使用示例:
4、其他基本函数:
1、查询当前用户:
select user();
2、md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串。例如:
3、显示正在使用的数据库:
select database();
4、password(str)函数,对str进行加密,加密后不会以明文显示。示例:
5、ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值。示例: