CRUD
CRUD指的是创建(Create),读取(Retrieve),更新(Update)和删除(Delete),它是数据库或者持久层在软件系统中执行的基本功能,构成了大多数应用程序和服务器中的数据管理基础
新增-Create
全列插入+多行插入
其中insert,value以及(字段值1)是必须的,其他的按照需要自行选择,全列插入是指的values后的每个小括号的值要与列一一对应,否则会报错,如果是进行多行插入,需要自行在values后面增添括号,语法如下:
-- 需要注意,VALUES后的字段值必须与表名后的字段名一一对应
INSERT INTO 表名(字段名1, 字段名2, ..., 字段名n) VALUES(字段值1, 字段值2, ..., 字段值
n);
-- 需要注意,VALUES后的字段值必须与创建表时的字段顺序保持一一对应
INSERT INTO 表名 VALUES(字段值1, 字段值2, ..., 字段值n);
-- 一次性插入多条数据
INSERT INTO 表名(字段名1, 字段名2, ..., 字段名n) VALUES(字段值1, 字段值2, ..., 字段值
n),(字段值1, 字段值2, ..., 字段值n), ... , (字段值1, 字段值2, ..., 字段值n);
INSERT INTO 表名 VALUES(字段值1, 字段值2, ..., 字段值n), (字段值1, 字段值2, ..., 字段值
n), ..., (字段值1, 字段值2, ..., 字段值n);
指的列插入:
- 一行中没有被指定插入的列,会用默认值填充,即NULL,表示缺失值。
- 显示的指定所有的属性名,就是全列插入。
- 指定列同样可以多行插入
查询-Retrieve
SELECT ALL/DISTINCT * | 字段名1 AS 别名1[,字段名1 AS 别名1, ..., 字段名n AS 别名n]
FROM 表名 WHERE 查询条件
全列查询:select * from + 表名
*:通配符:代表要查询结果包含所有的字段
这是一个非常危险的操作,如果数据量太大,会消耗大量的内存和CPU资源,可能导致数据库服务器的性能下降。
指定列查询:select 后面紧跟查询的列,之间用,(逗号)隔开
查询字段为表达式
表达式不包含字段:查询结果返回一个临时表,会在指定位置生成一列
select col1,常量,...from 表名
例如:
表达式包含一个字段:例如将id+5
表达式包含多个字段:例如虚拟的考试表以及总分
别名:
在MySQL中,别名使用包括行别名和列别名
使用别名可以带来多个重要的好处,主要包括提高查询的可读性、简化复杂查询、解决字段名冲突和提升性能等方面。
列别名的引入旨在提高查询结果的可读性,并允许在查询中使用更符合情境的标签来代表列。(也可以给表达式起别名)
表别名则主要用于简化查询中的表引用,特别是在多表查询的情况下。通过为每个表定义一个简短的别名,可以大大增强SQL语句的可读性和编写效率。
例如:求考试得分:
去重查询:distinct
判断为重复的条件:所有的查询列都相等,*表示全列去重
由于表中没有全列都相同的的数据,返回的临时表与原表一致
由于两名同学的数学成绩相同,去重查询只保留一个
排序:order by
SELECT
[DISTINCT] {* | {column1 [, column2] ...}
FROM tbl_name
[ORDER BY column1 [ASC | DESC], ...];
- ASC为升序,DESC为降序,不指定时MySQL默认的升序排序
- 使用到ORDER BY,后面跟字段名(或查询列表的表达式)和排序方式,表示按照该字段的值进行升序/降序排序;
- ORDER BY后面可以跟多个字段。在SQL中,可以使用逗号分隔多个字段来指定排序顺序。
- 当使用多个字段进行排序时,首先按照第一个字段进行排序,如果第一个字段的值相同,则按照第二个字段进行排序,以此类推。每个字段都可以指定升序(ASC)或降序(DESC)排序。(排序优先级取决于书写顺序)
- 与查看表结构的关键字重名,但查看表结构的DESC是describe的缩写,排序的DESC是descend的缩写,这是SQL设计时的反例。
例如:根据总分对exam进行降序排名:
注:NULL视为比任何值都小,降序排在最下面。
没有order by子句的查询,返回的顺序是未定义的
条件查询
基于比较运算符和逻辑运算符,可以对复杂的条件进行过滤,从而达到要求,其中,区间查询,模糊查询以及null查询都是条件查询。
前置知识:运算符:
运算符 | 说明 |
>,<,>=,<= | 大于,小于,大于等于,小于等于 |
= | 等于。NULL不安全,NULL=NULL结果为NULL |
<=> | 等于。NULL安全,NULL<=>结果为1(TRUE) |
!=,<> | 不等于 |
between a and b | 范围匹配[a,b],成立返回1(TRUE) |
in(option) | 若是option中的一个,返回1(TRUE) |
is null | 是null.成立返回1(true),不成立返回0(false) |
is not null | 不是null.成立返回0(false),不成立返回1(true) |
like | 模糊匹配,%表示任意多个字符,_表示一个字符 |
逻辑运算符
运算符 | 说明 |
AND | 连接的多个条件都是true,结果是1 |
OR | 连接的任意一个条件为true,结果为1 |
NOT | 条件为true,返回0 |
注意事项:
- where条件可以使用表达式,但是不能使用别名,与SQL语句的执行顺序有关
1)先确定表,即执行from
2)根据过滤条件筛选合适的行,即执行where
3)显示要查询的列,即执行select,由于列别名一般在select声明,因此执行where时识别不出别名 - 不支持链式比较,如a>col>b ,必须写为col>b AND col < a
- 运算符有优先级,但是一般使用时加上()自己设置优先级,保证万无一失
- NULL不参与除判断NULL之外的任何条件查询,它会被过滤掉
- 标准运算符作用与NULL时返回NULL,对其使用算数运算符也返回NULL
区间查询
SELECT
{* | {column1 [, column2] ...}
FROM tbl_name
WHERE {column1 BETWEEN a AND b | column1 >= a AND column1 <= b};
例如:查询总分在100~200的学生
模糊查询
SELECT
{* | {column1 [, column2] ...}
FROM tbl_name
WHERE column1 LIKE '[%][_...]值[_...][%]';
例如,查姓唐同学的成绩,%代表唐后面所有字符都被选中,类似还有%唐,%唐%,分别表示唐前面的字符被选中,唐左右的字符被选中
查询姓孙有两个字的名学生的成绩,两个__(连在一起了)表示孙后面的两个字符
null查询
区分NULL值和字符串’NULL‘,采用like 'NULL'实际上查的是字符串的NULL,不是NULL
分页查询 :limit
限制查询结果集的条数,通过分页查询可以有效的控制一次查询出的结果集中的记录条数,可以有效的减少数据库的压力,同时对用户也比较友好
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM tbl_name [WHERE ...] [ORDER BY ...] LIMIT n;
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM tbl_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM tbl_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
记录的序号从0开始,第一条记录是0
如果起始位置超出了结果集的范围,可以执行但是返回的是空集
例如:查询id编号为前3的同学
查询总分前五的同学:
修改 - UPDATE
UPDATE tbl_name SET column1 = expr [, column2 = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...];
注意:update如果不加where语句,将会修改表中的所有记录,十分危险!!!
例如,将唐三藏的数学改为95分
删除:DELETE
DELETE FROM tbl_name [WHERE ...] [ORDER BY ...] [LIMIT ...];
注意:delete如果不加where语句,将会删除表中的所有记录,十分危险!!!
例如:删除宋公明学生的成绩: