首先,创建一个表格,命名为student。
插入数据:
前边查询时,我们经常会用到查询所有的,一旦有大量数据时,这样查询的效率就会很低。
1.指定查询内容
select id, name, math from student;
2.去重查询
select distinct math from student;
distinct如果结果中有相同的,去除重复的。
3.在select语句中进行运算并且起别名
例3.1:查询学生总成绩
select id, name, (chinese+math+english) from student;
我们会想到这样的查询方式,但是看起来不是很方便,就有了下边的这种起别名的方式。
select id, name, (chinese+math+english) as ‘总成绩’ from student;
将所有姓唐的同学总成绩增加60%
select id, name, (chinese+math+english)*1.6 as ‘总成绩’ from student
where name like ‘唐%’;
4.select的where语句
使用where语句,进行查询过滤。
例4.1:查询所有姓李的学生信息以及总成绩
select id, name, (chinese+math+english) as ‘总成绩’ from student
where name like ‘李%’;
例4.2:查询所有英语成绩大于90的同学信息
select id, name, english from student
where english > 90;
例4.3:查询所有总分大于200分的同学
按照我们的正常思路来说应该需要这样得查询语句。
select id, name, (chinese+math+english) as ‘总成绩’
from student
where ‘总成绩’ > 200;
发现查询结果为空,这是为什么呢?
因为该select语句中先执行where语句,再执行select语句。所以,’总成绩’这个字段不会被查询到。所以,where语句中不能使用别名。
select id, name, (chinese+math+english) as ‘总成绩’
from student
where (chinese+math+english) > 200;
例4.4:查询姓李并且id小于10的学生信息(and)
select id, name
from student
where name like ‘李%’ and id < 10;
例4.5:查询英语成绩大于语文成绩的同学
select id, name
from student
where english > chinese;
例4.6:查询所有总分大于200并且数学成绩小于语文成绩的姓唐的学生信息
select id, name
from student
where (chinese+math+english) > 200 and math < chinese and name like ‘唐%’;
例4.7:查询所有英语成绩在80~90分的同学信息
select id, name
from student
where english>=80 and english<=90;
也可以这样写。
select id, name
from student
where english between 80 and 90;
注意:between…and只能用于闭区间。
例4.8:查询数学成绩为89,90,91的同学信息
select id, name
from student
where math=89 or math=90 or math=91;
也可以这样写。
select id, name
from student
where math in(89,90,91);
表示若干个特定值,可以用in。
总结:
like 模糊查询
not like
and
or
between … and
5.select order by(排序)语句
a.默认升序(asc),如果要降序使用关键字desc
b. order by语句一定放在语句结尾
例5.1:对数学成绩排序
select math from student order by math asc;
例5.2:总成绩从高到低输出
select (chinese+math+english) as ‘总成绩’
from student
order by ‘总成绩’;
order by可以使用别名,是与where语句不同的。
原因是order by进行排序时,会先拿到数据进行,然后进行排序。
例5.3:对所有姓李的学生按照成绩进行倒序排序
select id, name, (chinese+math+english) as ‘总成绩’
from student
where name like ‘李%’
order by 总成绩 desc;
6.常用函数
a.count()或count(列名):统计数量
只能用于数值型。
例6.1:统计当前表中一共有多少学生
select count(*) as ‘学生人数’
from student;
例6.2:统计一个班中数学成绩大于等于90的学生人数
select count(*) as ‘学生人数’
from student
where math >= 90;
说明:count(*)会统计为null的情况,count(列名)不会统计为空的情况
select count(*) from student;
select count(math) from student;
通过比较,可以看出count(列名)为空的不会统计。
b.sum()
只能用于数值型。
例6.3:统计一个班的数学总成绩
select sum(math)
from student;
例6.4:统计一个班的所有成绩的总成绩
select sum(chinese),sum(math),sum(english)
from student;
c.avg()
只能用于数值型。
当我们学过了sum和count函数,将这两个函数结合使用就可以计算平均成绩。
select sum(math)/count(math) as ‘平均成绩’
from student;
例6.5:全班数学成绩的平均分
select avg(math)
from student;
我们发现avg函数求均分的时候是不包括null的。
d.max(),min()
只能用于数值型。
例6.6:求一个班级的最高分以及最低分
select max(chinese+math+english) as ‘最高成绩’,
min(chinese+math+english) as ‘最低成绩’
from student;
e.日期函数
函数 | 表示含义 |
---|---|
current_date() | 当前日期 |
current_time() | 当前时间 |
current_timestamp | 当前时间戳 |
date(datetime) | 返回datetime的日期部分 |
date_add(date,interval d_value_d_type) | 在date上加上日期或时间 |
data_sub(date,interval d_value_d_type) | 在date上减去日期或时间 |
datedeff(date1,date2) | 两个日期差 |
now() | 当前时间 |
说明:
* date_add()和date_sub()中的interval后面可以是year minute second day
* datediff(data1,date2)得到的是天数,date1-date2.
例6.7:创建一张用于记录生日的表
添加当前日期
insert into tmp values(1,current_date());
创建一张留言表
查询在十分钟内发布的帖子
select * from msg where date_add(sendtime, interval 10 minute) > now();
f.字符串函数
函数 | 表达含义 |
---|---|
charset(str) | 返回字符串字符集 |
concat(stri1,str2,…) | 连接字符串 |
instr(str,substr) | 返回substr在str中出现的位置,没有则返回0 |
ucase(str) | 将str转换成大写 |
lcase(str) | 将str转换成小写 |
left(str,length) | 从str中的左边开始取length个字符 |
length(str) | str的长度 |
replace(str,search_str,replace_str) | 在str中用replace_str替换search_str |
strcmp(str1,str2) | 逐字符比较两字符串大小 |
substring(str,pos[,length]) | 从str的pos位开始,取length个字符 |
ltrim(str)、rtrim(str)、trim(string) | 去除前空格或后空格 |
例6.8:获取msg表列的字符集
例6.9:要求将student表中的数据格式化输出。
格式为XXX的语文成绩为XXX,数学成绩为XXX,英语成绩为XXX。
select concat(name,’的语文成绩,’,chinese,’数学成绩,’,math,’英语成绩,’,english) as ‘分数’
from student;
例6.10:获取学生表中姓名占用的字节数
select length(name), name from student;
例6.11:将student表中所有姓名中带‘红’的替换为’上海’
select replace(name,’红’,’上海’),name from student;
注意:replace只是在查询的时候替换,不会改变原表。
例6.12:以首字母小写的形式展示所有员工的姓名(组合使用)
select concat(lcase(substring(name,1,1)),substring(name,2)) from student;
g.常用的数学函数
函数 | 含义 |
---|---|
abs(number) | 绝对值 |
bin(number) | 十进制转二进制 |
ceiling(number) | 向上取整 |
conv(number,from_base,to_base) | 进制转换 |
floor(number) | 向下取整 |
format(number,decimal_places) | 保留小数位数(小数四舍五入) |
hex(decimal_num) | 转换成16进制 |
rand() | 返回随机浮点值,范围0~1 |
mod(num,denominator) | 余数 |
h.其他常用函数
user():查询当前用户
mds(str):对一个字符串str进行加密
password():对mysql用户加密
ifnull(val1,val2):如果val1为null,返回val2,否则返回val1.