将括号中多个字符串拼接到一起
select concat("王者","荣耀") -- 返回 王者荣耀
str:需要被替换的字符串
pos:从那个位置开始被替换,
len:被替换字符串的长度
newStr:拿什么字符串去替换
select insert("如果你乖我就给你买条gai",3,5,"把你头打歪"); -- 如果把你头打歪你买条gai
将str字符串中的所有大写字母转换成小写字母
select lower("ABcdJava") ;
将str字符串中的所有小写字母转换成大写字母
select upper("java and Android");
select substring("我的大刀早已饥渴难耐",5,2)
select curdate();
select curtime();
select now();
select week(now());
select year(now());
select hour(now());
select minute(now());
select datediff(now(),"2000-05-13");
select adddate(now(),5);
select ceil(3.6); -- 4 向上取整
select floor(3.6); -- 3 向下取整
select rand();
如何用SQL语句检测表是否创建?
drop table if exists 表名 ;
exists关键字的其他用法:
exists作用在子查询中
# 格式 select ... from 表名 where exists(子查询)
# 子查询有结果返回:exists(子查询) 结果为true
# 子查询没有结果返回: exists(子查询) 结果就为false,外层查询不执行
# 比如:判断是否有成绩大于80的数据
select exists(select*from result where studentResult>80);
# 案例:检查"Logic Java" 课程最近一次考试成绩
# 如果考试成绩有80分以上的成绩,显示分数排在前5名的学员学号和分数
# 分析:
# 采用exists 检测是否有人考试成绩达到了80分以上
# 如果有,使用select语句查询成绩从高到低排序,显示前5名的学号和成绩
# 第一步: 查询result表中所有Logic Java 的考试成绩
select * from result where subjectNo=(select subjectNo from subject where subjectName="Logic Java" );
# 第二步:查询出成绩大于80的数据
select * from result where subjectNo=(select subjectNo from subject where subjectName="Logic Java" ) and studentResult>80;
# 综合
select studentNo ,studentResult
from result where exists(
select * from result where subjectNo=(
select subjectNo from subject where subjectName="Logic Java" )
and studentResult>80 )
order by studentResult desc
limit 0,5;
问题:查询出每门课的平均成绩
## 查询所有的平均成绩
select avg(studentResult) avgresult from result;
# 分组查询的格式
# select ... from 表名 where ... group by 分组字段;
# 表示根据某个字段进行分组
select subjectNo ,avg(studentResult) avgresult from result group by subjectNo;
# 练习1:查询出每门课的总成绩
# 练习2:分别统计每个年级的人数
select count(*) from student group by gradeId;
# 问题: 分别统计每个年级 男,女生人数
select gradeId 年级, sex 性别 ,count(*) 人数 from student group by gradeId ,sex;
# 注意:如果需要根据多个字段分组,可以将多个字段都加到group by后面,用逗号隔开
# 问题:查询出每门课的平均成绩,按照成绩从高到低排序
select subjectNo ,avg(studentResult) avgresult from result
group by subjectNo
order by avg(studentResult) desc;
# 格式:select ... from 表名 where ... group by ... having...
# 问题:查询出平均成绩大于68分的的课程编号
# 步骤一:查询出每门课的平均成绩,及课程编号
select subjectNo ,avg(studentResult) avgresult from result group by subjectNo;
# 步骤二:筛选出平均成绩大于68分的课程编号
select subjectNo ,avg(studentResult) avgresult from result
group by subjectNo
having avg(studentResult)>68;
# 格式: select ... from 表名 where 字段 in (列表);
# 案例: 查询出分数为 60,95 ,71 分的学生编号,和分数
select studentNo ,studentResult from result
where studentResult=60 or studentResult=95 or studentResult=71;
# 使用in
select studentNo ,studentResult from result where studentResult in (60,95,71);
# 案例:查询出哪些同学的分数大于71分,显示出学生名称
# 步骤一,查询出分数大于71的学生编号
select studentNo from result where studentResult>71; -- (10002,10005,10096,10008)
# 步骤二,查出学生编号在步骤一的集合中的学生名称和编号
select studentNo,studentName from student where studentNo
in(select studentNo from result where studentResult>71);
# 如果格式为: select ... from 表名 where 字段 in(子查询)
# in括号中为子查询时,子查询返回的列只能是一列,否则就会出错
# 比如:下面的in中的子查询,查询studentResult,studentNo 两列,执行语句时会报
# Operand should contain 1 column(s) 错误
select studentNo,studentName from student where studentNo
in(select studentResult, studentNo from result where studentResult>71);
# 问题: 查询出成绩表中有哪些课程的成绩,显示出课程名称
select subjectName from subject where subjectNo in (select subjectNo from result);
select subjectNo from result;
-- 此条查询语句,会查询出很多重复数据,这些重复数据在列表中,会影响查询性能,一般会选择去掉重复数据。
# distinct 关键字使用
# 格式: select distinct ... from 表名;
select distinct subjectNo from result;
# 表示 查询subjectNo ,并去掉重复数据
select distinct subjectNo,studentResult from result
# 表示查询 subjectNO ,studentResult ,并去掉 重复的结果数据
# 注意:
# distinct 会将后面的字段值看做一个整体,只有当字段值都一样时才会认为是重复数据
# dustinct 只能卸载select 后面
# 比如下面写法会出错
select subjectNo , distinct studentResult from result;
# 问题: 查询出 姓李的学生数据
# 使用like模糊查询解决问题
# 格式 : select ... from 表名 where 字段 like ...
select * from student where studentName like '_斯_';
# 注意: 下划线 _ 表示一个占位符,表示此处一个内容
# %表示此处可以有0个或者多个内容
select * from student where studentName like '李%';
#练习:查询出名字中包含 ‘文’ 字的学生数据
select * from student where studentName like '%文%';
# 问题: 查询出分数大于71分的 学生编号,课程名称,分数
select subjectName from subject where subjectNo in (select subjectNo from result where studentResult >71);
# 内连接格式:
# select ... from 表1 inner join 表2 on 关联字段关系
select result.studentNo ,result.studentResult,subject.subjectName
from result inner join subject on result.subjectNo = subject.subjectNo;
select rs.studentNo ,rs.studentResult ,sb.subjectName
from result rs inner join subject sb on rs.subjectNo = sb.subjectNo;
# 注意: on 后面 写的是多表关联的字段
# 格式: select ... from 表1 , 表2 where 关联字段关系
select result.studentNo ,result.studentResult,subject.subjectName
from result,subject where result.subjectNo = subject.subjectNo;
# 练习: 查询出分数大于71 的学生姓名,和分数
select st.studentName ,rs.studentResult from student st
inner join result rs on st.studentNo=rs.studentNo
where rs.studentResult >71 ;
# 注意:关联查询中,使用字段时,建议在字段前面都加上表名. ,表示区分使用的哪张表中的字段
# 练习:查询出分数大于71的学生姓名,分数,以及课程名称(三张表关联)
select st.studentName ,rs.studentResult ,sb.subjectName from student st
inner join result rs on st.studentNo=rs.studentNo
inner join subject sb on rs.subjectNo=sb.subjectNo
where rs.studentResult > 71;
select st.studentName,rs.studentResult,sb.subjectName
from student st, result rs , subject sb
where st.studentNo= rs.studentNo and
rs.subjectNo = sb.subjectNo and
rs.studentResult > 71;
# 格式: select ... from 表1 left join 表2 on ....
# 查询出每个学生姓名以及成绩
select st.studentName , rs.studentResult from student st
left join result rs on st.studentNo = rs.studentNo;
±------------±--------------+
| studentName | studentResult |
±------------±--------------+
| 郭靖 | 71 |
| 郭靖 | 60 |
| 李文 | 46 |
| 李斯文 | 83 |
| 张萍 | 60 |
| 韩秋洁 | 60 |
| 张秋丽 | 95 |
| 肖梅 | 93 |
| 秦洋 | 23 |
| 何睛睛 | 96 |
| 王宝宝 | NULL |
| 何小华 | NULL |
| 陈志强 | NULL |
| 李露露 | NULL |
±------------±--------------+
将两张表的位置互换
select st.studentName , rs.studentResult from result rs
left join student st on st.studentNo = rs.studentNo;
±------------±--------------+
| studentName | studentResult |
±------------±--------------+
| 郭靖 | 71 |
| 郭靖 | 60 |
| 李文 | 46 |
| 李斯文 | 83 |
| 张萍 | 60 |
| 韩秋洁 | 60 |
| 张秋丽 | 95 |
| 肖梅 | 93 |
| 秦洋 | 23 |
| 何睛睛 | 96 |
±------------±--------------+
# 对于left join而言
# left join 左边的表为主表 ,右边的表为从表
# 主表中的数据会逐条匹配从表中的数据
# 如果匹配到了数据,就显示数据
# 如果匹配不到,就用null填充
# 主表中的数据都会显示,
# 对于right join而言
# right join 右边的表为主表 ,左边的表为从表
# 主表中的数据会逐条匹配从表中的数据
# 如果匹配到了数据,就显示数据
# 如果匹配不到,就用null填充
select st.studentName , rs.studentResult from result rs
right join student st on st.studentNo = rs.studentNo;
±------------±--------------+
| studentName | studentResult |
±------------±--------------+
| 郭靖 | 71 |
| 郭靖 | 60 |
| 李文 | 46 |
| 李斯文 | 83 |
| 张萍 | 60 |
| 韩秋洁 | 60 |
| 张秋丽 | 95 |
| 肖梅 | 93 |
| 秦洋 | 23 |
| 何睛睛 | 96 |
| 王宝宝 | NULL |
| 何小华 | NULL |
| 陈志强 | NULL |
| 李露露 | NULL |