增
插入语句完整表示(方括号内的内容代表可以省略)
INSERT INTO `表名` ([`字段名1`, `字段名2`,......]) VALUES (值11,值12,...), (值21,值22,...),......;
INSERT INTO `account` (`id`, `name`, `money`) VALUES (110, 'yuan', 500), (200, 'qi', 600); -- account为表名,`id`, `name`, `money`为字段名,此语句同时插入了两行数据
插入语句可以省略所有的字段名,但是后面的值的顺序要和字段名一一配对
INSERT INTO `表名` VALUES (值11,值12,...), (值21,值22,...),......;
INSERT INTO `account` VALUES (150, 'yuan', 500);
插入语句可以省略主键,但其他的字段名要写全,后面的值也可以省略主键(例子中id为主键)
INSERT INTO `account` (`name`, `money`) VALUES ('yuan', 500);
删
DELETE 命令
DELETE FROM `表名` [WHERE 条件]; -- 没有where条件时,默认全部删除
DELETE FROM `account` WHERE `id`=1;
TRUNCATE 命令
TRUNCATE `表名` -- 完全清空一个数据库
DELETE(不加where条件,全删) 和 TRUNCATE 命令比较
相同点:都能删除数据,表的结构和索引约束不会变
不同点:1、对于自增列,TRUNCATE会重新设置将计数器归0,DELETE不会改变计数器(不重启服务器);2、TRUNCATE不会影响事务
补充:当用DELETE全删数据后,并重启数据库服务net stop mysql
net start mysql
,此时
- INNODB引擎,自增列会重新从1开始。计数器归0(存在内存中,断电即失)
- MYISAM引擎,自增列继续从上一个自增量开始(存在文件中,不会失去)
改
UPDATE `表名` SET `字段名1`=值1, [`字段名2`=值2]...... [WHERE 条件];
UPDATE `account` SET `money`='500' WHERE `id` = 1;
查
查询基础语法
查询表中所有数据
SELECT * FROM `表名`;
查询指定字段
SELECT `字段名1`, `字段名2`,...... FROM `表名`;
给查询出来的列起别名,方便看
SELECT `字段1` AS `别名1`, `字段2` AS `别名2`,...... FROM `表名` AS `表的别名`;
对查询结果进行拼接,concat(a,b)
,可以不光是字符串拼接
SELECT CONCAT(字符串, `字段名`) FROM `表名`;
SELECT CONCAT('学生:', `studentname`) AS `学生` FROM `student`;
对查询结果进行去重,重复数据只显示一条,DISTINCT
SELECT DISTINCT `字段名` FROM `表名`;
对查询结果进行运算修改(对成绩进行加1修改)
SELECT `studentresult`+1 AS `加一后的成绩` FROM `result`;
可以查询:文本值、列、Null、函数、计算表达式、系统变量…
SELECT VERSION(); -- 函数,查询版本
SELECT 100+3 AS `计算结果`; -- 数学表达式
SELECT @@auto_increment_increment; -- 系统变量。查询自增的步长
WHERE条件子句
当不添加where条件时,默认选择所有的数据。where条件很灵活,相当于每一行数据都进行条件判断。满足条件的就进行操作
逻辑运算符:
运算符 | 含义 |
---|---|
AND && | 与 |
OR || | 或 |
NOT ! | 非 |
SELECT `studentno`, `studentresult` FROM `result`
WHERE `studentno`>1000 AND `studentno`<=1001; -- AND
SELECT `studentno`, `studentresult` FROM `result`
WHERE `studentno` BETWEEN 1000 AND 1001; -- BETWEEN
SELECT `studentno`, `studentresult` FROM `result`
WHERE `studentno`!=1000; -- !=
比较运算符:
运算符 | 含义 |
---|---|
IS NULL | 为空 |
IS NOT NULL | 非空 |
BETWEEN…AND… | 在某个范围内,闭区间 |
LIKE | SQL匹配,常搭配正则表达式 |
IN | 是否在某些备选值中 |
= | 等于 |
!= , <> | 不等于 |
>, <, <=, >= | 关系 |
-- like 匹配
SELECT `studentno`, `studentname` FROM `student`
WHERE `studentname` LIKE '%强'; -- %代表0到任意个字符
SELECT `studentno`, `studentname` FROM `student`
WHERE `studentname` LIKE '__强'; -- _代表1个字符
-- in 是否在备选值中
SELECT `studentno`, `studentname` FROM `student`
WHERE `studentno` IN (1001,1002,1005);
SELECT `address` FROM `student`
WHERE `address` IN ('广东', '北京');
-- null 空 not null 非空
SELECT `studentno`, `studentname` FROM `student`
WHERE `address` IS NULL OR `address`='';
SELECT `studentno`, `studentname` FROM `student`
WHERE `address` IS NOT NULL;
联表查询JOINON、自连接 、子查询
https://blog.csdn.net/qq_39037116/article/details/119616526
排序和分页
排序:升序 ASC 降序 DESC
SELECT * FROM `表`
ORDER BY `字段名` DESC/ASC;
分页:
LIMIT 0, 5 代表从第一行开始展示五个数据
LIMIT 2, 6 代表从第三行开始展示六个数据
SELECT * FROM `表`
LIMIT 起始值, 页面的大小;
分组过滤
GROUP BY 指定结果按照哪几个字段来进行分组
HAVING 过滤分组后的结果必须满足的次要条件
(WHERE也可以进行条件判断,但WHERE语句在分组语句前,且WHERE不能搭配聚合函数)
按字段名2进行分组,求取分组后字段名1的平均值,之后再过滤得到平均分 >= 80的数据
SELECT AVG(`字段名1`) AS 平均分
FROM `表名`
GROUP BY `字段名2`
HAVING 平均分 >= 80;
查询语法汇总
[ ]代表可选,{ }代表必选
SELECT [ALL | DISTINCT]
{* | 表名.* | 表名.字段1[AS 别名1][, 表名.字段2[AS 别名2]][,...]} -- 此处表名是表名1或表名2,是为了区分这两个表
FROM 表名1 [AS 表别名1]
[LEFT | RIGHT | INNER JOIN 表名2] -- 联合查询
[WHERE 条件1] -- 指定结果需满足的条件
[GROUP BY 字段名] -- 指定结果按照哪几个字段分组
[HAVING 条件2] -- 过滤分组后必须满足的次要条件
[ORDER BY 字段名 ASC/DESC] -- 指定结果按照某个字段进行排序
[LIMIT {[起始行数,] 每页最大行数}] -- 指定查询记录从哪条到哪条
参考:https://www.bilibili.com/video/BV1NJ411J79W?p=25