一、数据库数据管理
1.DML(数据操作语言)
通过DML语句管理数据库数据,包括
- INSERT(添加数据语句)
- UPDATE(更新数据语句)
- DELETE(删除数据语句)
1.1 INSERT(添加数据)
#语法:INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3')
INSERT INTO grade(gradename) VALUES ('大一');
#注意:(字段1,字段2,字段3,...)该部分可以省略,但values后面的值一定要与表结构,数据列,顺序相对应,且数量一致
1.2 UPDATE(修改数据)
#语法:UPDATE 表名 SET column_name=value [,column_name2=value2,...] [WHERE condition];
#注意:column_name 为要改的数据列
value为修改后的数据
condition为筛选 条件,如果不指定的话,则修改该表的所有列是数据
where条件子句可以理解为,有条件的从表中筛选数据
1.3 DELETE(删除数据)
#语法: DELETE FROM 表名 [WHERE condition];
#注意:condition 为筛选条件,如不指定则删除该表的所有列数据
2.DQL(数据查询语言)
解释:在数据库管理中使用频率最高的语句,也是数据库语言中最核心,最重要的语句
例如:SELECT语句
2.1 select 语法
SELECT [ALL | DISTINCT]#distinct去除重复项,默认为all
[left | right | inner join table_name2] #连接查询
[WHERE ...] #指定结果满足的条件
[GROUP BY ...] #指定结果按照哪几个字段来分组
[HAVING] #过滤分组的记录必须满足的次要条件
[ORDER BY ...] #指定查询记录按一个或多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}];# 指定查询的记录从哪条至哪条
查询表中所有的数据列结果,采用“*”符号;如
select*from student
但是效率低,不推荐
#查询所有的学生信息
select * from student
#查询指定列(学号,姓名)
select studentno,studentname from student;
2.2 as 子句作用:
可给数据列取一个新名字
可给表取一个新名字
可把经计算或总结的结果用另一个新名称来代替
#这里是为列取别名(当然as关键字可以省略)
select studentno as 学号,studentname as 姓名 from student;
#使用as也可以为表取名
select studentno as 学号,studnetname as 姓名 from student as s;
#使用as,为查询结果取一个新名字
#cancat()函数拼接字符串
select concat('姓名:',studentname) as 新姓名 from student;
2.3 distinctg关键字的使用
作用:去掉select查询返回的记录结果中重复的记录(返回所有列的值都相同),只返回一条
#查看哪些同学参加了考试(学号)---去除重复项
select * from result;#查看考试成绩
select studentno from result;#查看哪些同学参加了考试
select distinct studentno from result;
#distinct去除重复项,默认是all
select version();#查询版本号
select 100*3-1 as 计算结果;#计算表达式
#学员考试成绩集体提分一分查看
select studentno,studentresult+1 as '提分后' from result;
避免sql返回结果中包含’.’ ‘,’ ‘*’ 和括号等干扰开发程序语言
2.4 where条件语句
用于检索数据表中符合条件的记录
例如
#满足条件的查询(where)
select studentno,studentresult from result;
#查询考试成绩在95~100之间的
select studentno,studentresult
from result
where studentresult>=95 and studentresult<=100;
#其中and也可以写成&&
select studentno,studentresult
from result
where studentresult>=95 && studentresult<=100;
#还可以这样表示
select studentno,studentresult
from result
where studentresult between 95 and 100;
#除了1000号同学,要其他同学的成绩
select studentno,studentresult
from result
where studentno!=1000;
#使用 not
select studentno,studentresult
from result
where not studentno=1000;
2.5 模糊查询
比较操作符
| 操作符名称 | 语法 | 描述 |
|---|---|---|
| is null | a is null | 若操作符为null,则结果为真 |
| is not null | a is not null | 若操作符不为null,则结果为真 |
| between | a between b and c | 若a在b与c之间,则结果为真 |
| like | a like b | m模式匹配,若a匹配b,则结果为真 |
| in | a in (a1,a2,a3…) | 若a等于a1,a2,a3中的某一个,则结果为真 |
*相同数据类型的数据之间才能进行比较
#模糊查询 like , in , null , between and
# LIKE
#like结合使用的通配符 : % (代表0到任意个字符) ; _ 代表一个字符
#查询姓李的同学的学号及姓名
SELECT studentno,studentname FROM student
WHERE studentname LIKE '李%';
#查询姓李的同学,后面只有一个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '李_';
#查询姓李的同学,后面只有两个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '李__';
#查询姓名中含有 文 字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '%文%';
#查询姓名中含有特殊字符的需要使用转义符号 '\'
#自定义转义符关键字: ESCAPE ':'
#=============================================
# IN
#查询学号为1000,1001,1002的学生姓名
SELECT studentno,studentname FROM student
WHERE studentno IN (1000,1001,1002);
#查询地址在北京,南京,河南洛阳的学生
SELECT studentno,studentname,address FROM student
WHERE address IN ('北京','南京','河南洛阳');
#=============================================
# NULL 空
#查询出生日期没有填写的同学
#不能直接写=NULL , 这是代表错误的 , 用 is null
SELECT studentname FROM student
WHERE BornDate IS NULL;
#查询出生日期填写的同学
SELECT studentname FROM student
WHERE BornDate IS NOT NULL;
#查询没有写家庭住址的同学(空字符串不等于null)
SELECT studentname FROM student
WHERE Address='' OR Address IS NULL;
2.6 连接查询
三种连接查询对比
| 名称 | 描述 |
|---|---|
| INNER JOIN | 查询两个表中的结果集中的交集,如果表中有至少一个匹配,则返回行 |
| LEFT JOIN | 以左表为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以null填充,即使右表中没有匹配,也从左表中返回所有的行 |
| RIGHT JOIN | 以右表为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以null填充,即使左表中没有匹配,也从右表中返回所有的行 |

#查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
SELECT * FROM student;
SELECT * FROM result;
/*思路:
(1):分析需求,确定查询的列来源于两个类,student result,连接查询
(2):确定使用哪种连接查询?(内连接)
*/
#内连接
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
# 右连接(也可实现)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
RIGHT JOIN result r
ON r.studentno = s.studentno
# 等值连接
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s , result r
WHERE r.studentno = s.studentno
# 左连接 (查询了所有同学,不考试的也会查出来)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
#查一下缺考的同学(左连接应用场景)
SELECT s.studentno,studentname,subjectno,StudentResult
FROM student s
LEFT JOIN result r
ON r.studentno = s.studentno
WHERE StudentResult IS NULL
#思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON sub.subjectno = r.subjectno
2.7 排序(ORDER BY)
解释:order by语句用于根据指定的列对结果集进行排序,默认按照asc升序对记录进行排序,desc进行降序排序
#查询:学习数据库结构的同学的所有考试结果(学号,学生姓名,科目名称,成绩)
#按成绩降序排序
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC , studentno
2.8 分页
用法: LIMIT 0,5
例如:
# 每页显示5条数据
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC , studentno
LIMIT 0,5
2.9 子查询
嵌套查询可以由多个子查询组成,求解的过程是最里面的优先查询,依次向外。
#查询课程为 高等数学-2 且分数不小于80分的学生的学号和姓名
#方法一:使用连接查询
SELECT s.studentno,studentname
FROM student s
INNER JOIN result r
ON s.`StudentNo` = r.`StudentNo`
INNER JOIN `subject` sub
ON sub.`SubjectNo` = r.`SubjectNo`
WHERE subjectname = '高等数学-2' AND StudentResult>=80
#方法二:使用连接查询+子查询
#分数不小于80分的学生的学号和姓名
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80
#在上面SQL基础上,添加需求:课程为 高等数学-2
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80 AND subjectno=(
SELECT subjectno FROM `subject`
WHERE subjectname = '高等数学-2'
)
#方法三:使用子查询
#分步写简单sql语句,然后将其嵌套起来
SELECT studentno,studentname FROM student WHERE studentno IN(
SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-2'
)
)
二、MySQL常用函数
# 数学函数 (这里只列出一些常用的)
SELECT ABS(-8); /*绝对值*/
SELECT CEILING(9.4); /*向上取整*/
SELECT FLOOR(9.4); /*向下取整*/
SELECT RAND(); /*随机数,返回一个0-1之间的随机数*/
SELECT SIGN(0); /*符号函数: 负数返回-1,正数返回1,0返回0*/
#字符串函数
SELECT CHAR_LENGTH('狂神说坚持就能成功'); /*返回字符串包含的字符数*/
SELECT CONCAT('我','爱','程序'); /*合并字符串,参数可以有多个*/
SELECT INSERT('我爱编程helloworld',1,2,'超级热爱'); /*替换字符串,从某个位置开始替换某个长度*/
SELECT LOWER('KuangShen'); /*小写*/
SELECT UPPER('KuangShen'); /*大写*/
SELECT LEFT('hello,world',5); /*从左边截取*/
SELECT RIGHT('hello,world',5); /*从右边截取*/
SELECT REPLACE('狂神说坚持就能成功','坚持','努力'); /*替换字符串*/
SELECT SUBSTR('狂神说坚持就能成功',4,6); /*截取字符串,开始和长度*/
SELECT REVERSE('狂神说坚持就能成功'); /*反转*/
#日期和时间函数
SELECT CURRENT_DATE(); /*获取当前日期*/
SELECT CURDATE(); /*获取当前日期*/
SELECT NOW(); /*获取当前日期和时间*/
SELECT LOCALTIME(); /*获取当前日期和时间*/
SELECT SYSDATE(); /*获取当前日期和时间*/
/*获取年月日,时分秒*/
SELECT YEAR(NOW());
SELECT MONTH(NOW());
SELECT DAY(NOW());
SELECT HOUR(NOW());
SELECT MINUTE(NOW());
SELECT SECOND(NOW());
#系统信息函数
SELECT VERSION(); /*版本*/
SELECT USER(); /*用户*/
# 查询姓李的同学,改成吴
SELECT REPLACE(studentname,'李','吴') AS 新名字
FROM student WHERE studentname LIKE '李%';
#聚合函数
#COUNT():返回满足SELECT条件的记录总和数,如SELECT COUNT(*)
#SUM():返回数字字段或表达式列作统计,返回一列的总和
#AVG():通常为数值字段或表达列作统计,返回一列的平均值
#MAX():可以为数值字段、字符字段或表达式列作统计,返回最大的值
#MIN():可以为数值字段、字符字段或表达式列作统计,返回最小的值
SELECT SUM(StudentResult) AS 总和 FROM result;
SELECT AVG(StudentResult) AS 平均分 FROM result;
SELECT MAX(StudentResult) AS 最高分 FROM result;
SELECT MIN(StudentResult) AS 最低分 FROM result;
来源:CSDN
作者:木子李木
链接:https://blog.csdn.net/weixin_43794032/article/details/95190031