Mysql 查询中函数的运用

Mysql 查询中函数的运用
1.连接字符串函数 concat(str1,str2…,strn);

将括号中多个字符串拼接到一起

select concat("王者","荣耀")   -- 返回 王者荣耀
2.字符串替换函数 insert(str,pos,len,newStr)

str:需要被替换的字符串

pos:从那个位置开始被替换,

len:被替换字符串的长度

newStr:拿什么字符串去替换

select insert("如果你乖我就给你买条gai",3,5,"把你头打歪"); -- 如果把你头打歪你买条gai
3.将字符转换成小写字符 lower(str)

将str字符串中的所有大写字母转换成小写字母

select lower("ABcdJava") ;
4.将字符转换成大写字符 upper(str)

将str字符串中的所有小写字母转换成大写字母

select upper("java and Android");
5.截取字符串 substring(str,pos,len)
select substring("我的大刀早已饥渴难耐",5,2)
6.获取当前日期: curdate()
select curdate();
7.获取当前时间: curtime();
select curtime();
8. 获取当前日期和时间: now()
select now();
9.获取日期date为一年中的第几周: week(date)
select week(now());
10.获取日期date的年份: year(date)
select year(now());
11.获取time的小时:hour(time)
select hour(now());
12.获取time的分钟值: minute(time);
select minute(now());
13.获取两个时间相隔的天数:datediff(date1,date2)
select datediff(now(),"2000-05-13");
14.获取指定日期加上n天数后的日期 :adddate(date,n)
select adddate(now(),5);
15.获取大于或等于数值x的最小整数: ceil(x)
select ceil(3.6); -- 4  向上取整
16.获取小于或等于数值x的最小整数:floor(x)
select floor(3.6); -- 3 向下取整
17.在0-1之间随机生成一个小数:rand()
select rand();
二,Mysql 中的高级查询
2.1 exists 关键字

如何用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;
2.2 分组查询 group by
问题:查询出每门课的平均成绩
## 查询所有的平均成绩
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;
2.3 分组筛选
# 格式: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;
回顾
in 关键字
# 格式: 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);

distinct 关键字: 去重
# 问题: 查询出成绩表中有哪些课程的成绩,显示出课程名称
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 关键字: 模糊查询
# 问题: 查询出 姓李的学生数据 
# 使用like模糊查询解决问题

# 格式 : select ... from 表名  where  字段 like ...
select * from student where studentName like '_斯_';
# 注意: 下划线 _  表示一个占位符,表示此处一个内容
# %表示此处可以有0个或者多个内容
select * from student where studentName like '李%';

#练习:查询出名字中包含 ‘文’ 字的学生数据
select * from student where studentName like '%文%';

多表查询
内连接 inner join
# 问题: 查询出分数大于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而言
# 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 |

你可能感兴趣的:(Mysql数据库)