mySQL 教程 第4章 数据查询

mySQL运算符

这些运算符在SQL查询中用得到。

算数运算符

+ 加

- 减

* 乘

/ DIV 除

% MOD 取余数

比较运算符

= 等于

<> != 不等于

<

<=

>

>=

Between 指定范围

In 存在于集合

Is null 为NULL

Is not null 不为空

Like 通配符

Regexp rlike 正则表达式

比如

比较运算符,返回的结果 真为1,假为0

运算符优先级

最高------------------------------------------à最低

! () * / div % mod - + = <>= like between case when then else not and or

单表查询

查询所有列所有行

select * from TStudent

查询指定列

select studentID,Sname,Sex,cardID from TStudent

为列指定别名

select studentID 学号,Sname 姓名,Sex 性别,cardID 身份证号 from TStudent

指定查询条件

查询条件中可以使用< > <= >= != 比较运算符

1. 查询网络班学生

select studentID 学号,Sname 姓名,Sex 性别,cardID 身份证号,class 班级

from TStudent where class=‘网络与网站开发‘

2. 查询网络班性别是女的学生

select studentID 学号,Sname 姓名,Sex 性别,cardID 身份证号,class 班级

from TStudent where class=‘网络与网站开发‘ and sex=‘女‘

3. 查找软件测试班或性别是女的学生

select studentID 学号,Sname 姓名,Sex 性别,cardID 身份证号,class 班级 from TStudent where class=‘软件测试‘ or Sex=‘女‘

4. 使用like模糊查询

使用字符比较符 like

% 0个或多个字符串

_ 任何单个的字符

[]在指定区域或集合内的任何单个字符

[^]不在指定区域或集合内的任何单个字符

查找姓名中含有“立”字的学生

select studentID 学号,Sname 姓名,Sex 性别,cardID 身份证号,class 班级 from TStudent where Sname like ‘%茂%‘

思考:查找姓名最后一个字是“茂”的同学,写出SQL语句。

5. 查找姓名是“韩立刚”,“韩旭”的学生

记下上面查询结果的两个名字。查找这两个名字的记录。

select studentID 学号,Sname 姓名,Sex 性别,cardID 身份证号,class 班级 from TStudent where Sname in (‘赵俊茂‘,‘魏清茂‘)

6. 查找出1975年到1980年出生的学生

使用比较操作符 = > < >= <= <>

select studentID 学号,Sname 姓名,Sex 性别,cardID 身份证号,class 班级,Birthday 生日

from TStudent where Birthday>‘1980‘ and Birthday<‘1985‘

7. 使用关系运算符

关系运算符优先级 not and or 如下面的例子 去掉括号结果一样

select studentID 学号,Sname 姓名,Sex 性别,cardID 身份证号,class 班级,Birthday 生日

from TStudent where Birthday>‘19820101‘ and Birthday<‘19841230‘ or sex=‘女‘

通过使用括号更运算顺序

select studentID 学号,Sname 姓名,Sex 性别,cardID 身份证号,class 班级,Birthday 生日

from TStudent where Birthday>‘19820101‘ and (Birthday<‘19841230‘ or sex=‘女‘)

8. 查询在一定范围内的值

查找生日在1985年到1990年之间的学生

select studentID 学号,Sname 姓名,Sex 性别,cardID 身份证号,class 班级,Birthday 生日

from TStudent where Birthday BETWEEN ‘19850000‘ and ‘19860000‘

查找不在1985年到1986年出生的学生

select studentID 学号,Sname 姓名,Sex 性别,cardID 身份证号,class 班级,Birthday 生日

from TStudent where Birthday not BETWEEN ‘19850000‘ and ‘19860000‘

尽量使用between而不使用and和比较操作符表示的表达式

如果想返回不在指定区域的行时,使用not between。这样会降低数据查询的速度。

9. 查询空值

insert into TStudent (studentid,sname) values (‘19999‘,‘张永超‘)

select * from TStudent where studentid=‘19999‘

可以看到没有插入的列值为Null

select * from TStudent where cardID is NULL

你绝不要这样写

select * from TStudent where cardID=‘‘

使用is not null来查询指定列中非空的行

select * from TStudent where cardID is not NULL

格式化结果集

1. 排序

默认是降序 desc升序 asc 降序

select * from TStudent order by cardID

select * from TStudent order by cardID asc

按两列排序 先按班级排序 再按学号排序

select * from TStudent order by Class,studentid desc

以下命令就是按第7列和第1列排序,输出结果和以上的一样

select * from TStudent order by 7,1 desc

2. 消除重复的行

以下命令查看有几个班

select DISTINCT class 班级 from TStudent

多表查询

在TStudent表插入两个学生

insert into TStudent values (‘90006‘,‘张勇‘,‘男‘,‘132302198903044565‘,‘19880203‘,‘[email protected]‘,‘JAVA‘,‘20120803‘);

insert into TStudent values (‘90007‘,‘赵洁‘,‘女‘,‘132302198905044565‘,‘19880503‘,‘[email protected]‘,‘JAVA‘,‘20120803‘)

这两个学生没有成绩

3. 使用Join内连接多张表

内连接使用inner关键字,可以省去。

没有成绩的学生没有列出来。

使用外键匹配可以讲多个表组成一张大表,可以看到组成的大表记录条数4个学生*2科

select a.*,b.*,c.* 分数 FROM `TStudent` a inner join `TScore` b on a.`StudentID`=b.`StudentID` inner join `TSubject` c on b.`subJectID`=c.`subJectID`

从以上三个表组成的大表找到计算机网络课程分数大于80分的记录

select sname 姓名,sex 性别,c.`subJectName` 学科,b.`mark` 分数 FROM `TStudent` a join `TScore` b on a.`StudentID`=b.`StudentID` join `TSubject` c on b.`subJectID`=c.`subJectID` where c.`subJectName`=‘计算机网络‘ and b.`mark`>80

可以看到输出结果来自三张表

4. 左连接

做连接使用left有连接使用right

select a.*,b.* FROM `TStudent` a left join `TScore` b on a.`StudentID`=b.`StudentID`使用左连接可以看到没有成绩学生也出现在表中

思考:左连接

5. 自连接

自己连接自己,比如查找重名的学生

select a.studentid,a.sname,b.studentid,b.sname from TStudent a join TStudent b on a.sname=b.sname where a.studentid<>b.studentid

6. 使用子查询

使用子查询,输出结果只能来自一张表,其他表作为查询的条件。

为什么使用子查询---子查询可以把一个复杂的查询分解成一系列逻辑步骤,这样就可以用一个单个的语句解决复杂的查询问题。

为什么使用连接而不使用子查询---执行效力差不多,子查询可能要求查询优化器执行额外的操作,比如排序,而这些操作将会影响查询的处理策略。

select sname 姓名 from `TStudent` where Studentid in (select StudentID from `TScore` where mark>90)

以下SQL语句子查询中又嵌套了子查询,查询计算机网络,输出结果只能来自一个表。

select sname 姓名 from `TStudent` where Studentid in (select StudentID from `TScore` where mark>90 and subjectID in (select subjectID from `TSubject` where subJectName=‘计算机网络‘))

7. 使用any关键字

创建两个表

create table tb1 (num int not null);

create table tb2 (num int not null);

插入数据

insert into tb1 VALUES (2),(5),(13),(25),(32);

insert into tb2 VALUES (6),(8),(20),(43),(70),(4);

查找tb1,条件是只要值大于tb2的任何一个值就可以

select num from tb1 where num>any(select num from tb2)

8. 使用关键字all

返回tb2所有值都小的值

select num from tb1 where num<all(select num from tb2)

9. 使用exist关键字

如果成绩表中的分数有大于80分的记录,就返回TStudent表中的第一条记录

当然也可以使用not exist

select * from `TStudent` where EXISTS (select * from `TScore` where mark>80) limit 1

有大于100分的学生,就查出学生记录。

select * from `TStudent` where EXISTS (select * from `TScore` where mark>100) limit 1

10. 使用union合并查询结果

查找tb1和tb2大于40的数据

Select num from tb1 where num>40 union select num from tb2 where num>40

数据分组和汇总

11. Group by进行数据汇总

如果使用聚集函数,则将对表中的所有记录的某个字段进行汇总,然后生成单个的值。如果想生成多个汇总值,同时使用聚集函数和group by 语句,联合使用having和group by子句能够使结果集只包含满足条件的记录。

计算各个班“计算机网络”平均分

select a.Class 班级,AVG(b.`mark`) 计算机网络平均分 from `TStudent` a join `TScore` b on a.`StudentID`=b.`StudentID` join `TSubject` c on b.`subJectID`=c.`subJectID` where c.`subJectName`=‘计算机网络‘ group by a.`Class`

Group by 必须和集合函数结合使用

12. 联合使用group by子句与having子句

Having 相当于条件

查找计算机网络课程平均分大于80分的班级

select a.Class 班级,AVG(b.`mark`) 计算机网络平均分 from `TStudent` a join `TScore` b on a.`StudentID`=b.`StudentID` join `TSubject` c on b.`subJectID`=c.`subJectID` where c.`subJectName`=‘计算机网络‘ group by a.`Class` having AVG(b.`mark`)>75

13. 思考题:统计各个班级所有科目的总分。

14. 查询指定的行数

使用limit显示前2行数据

select StudentID,Sname,sex,cardID from `TStudent` limit 2

显示从第2条记录后面的3条记录

select StudentID,Sname,sex,cardID from `TStudent` limit 2,3

15. 使用聚集函数统计行数

Count函数不统计Null记录

select count(*) from `TStudent`;

select count(cardID) 登记了身份证的学生数量 from `TStudent`,没有登记身份证不统计。

16. 思考:统计男生数量

使用正则表达式

一个正则表达式中的可以使用以下保留字

符号 说明
^ 所匹配的字符串以后面的字符串开头
$ 所匹配的字符串以前面的字符串结尾
. 匹配任何字符(包括新行
a* 匹配任意多个a(包括空串)
a+ 匹配任意多个a(不包括空串)
a? 匹配一个或零个a
de|abc 匹配de或abc
(abc)* 匹配任意多个abc(包括空串)
[a-dx] 匹配“a”、“b”、“c”、“d”或“x”
[^a-dx] 匹配除“a”、“b”、“c”、“d”、“x”以外的任何字符。“[”、“]”必须成对使用

17. 查询特定字符或字符串开头的记录

select sname,email from `TStudent` where email REGEXP ‘^KY‘

18. 查询以特定字符或字符串结尾的记录

select sname,email from `TStudent` where sname REGEXP ‘富$‘

19. 使用*和+来匹配字符串中的多个字符

*匹配前面字符任意多次,包括0次,+匹配前面字符至少一次。

select sname,email from `TStudent` where email REGEXP ‘^TB*‘

select sname,email from `TStudent` where email REGEXP ‘^TB+‘

20. 匹配指定字符串

select sname,email from `TStudent` where email REGEXP ‘BZ‘

21. 匹配字符串的任意一个

select sname,email from `TStudent` where emai

时间: 2024-10-26 06:34:21

mySQL 教程 第4章 数据查询的相关文章

mySQL教程 第4章 数据查询

第4章 数据查询 mySQL运算符 这些运算符在SQL查询中用得到. 算数运算符 + 加 - 减 * 乘 / DIV 除 % MOD 取余数 比较运算符 = 等于 <> != 不等于 < <= > >= Between 指定范围 In 存在于集合 Is null 为NULL Is not null 不为空 Like 通配符 Regexp rlike 正则表达式 比如 比较运算符,返回的结果 真为1,假为0 运算符优先级 最高-----------------------

mySQL教程 第5章 插入 更新与删除数据

第5章 插入 更新与删除数据 使用SQL Manager管理工具连接到schoolDB.由于三张表都设置了主键,因此,以下练习中插入的记录,主键不能重. 插入数据 1. 练习:为表的所有字段插入数据 为表中所有字段插入数据,可以不用指定列 其中的into可以省去 insert into TStudent values ('00008','白安','男','132302197604044565','19760404', '[email protected]','JAVA','20120803')

mySQL教程 第1章 数据库设计

第1章 数据库设计 E-R设计 很多同学在学SQL语句时,觉得非常困难,那是因为你在学一个你根本不了解的数据库,数据库中的表不是你设计的,表与表之间的关系你不明白.因此在学SQL语句之前,先介绍一下数据库设计. 下面举例说明数据库设计: 学校需要开发一个系统记录有学生.课程和成绩信息.数据库如何设计? 这里面涉及到两个实体,学生表.课程,这些表为实体表. 这些表之间有什么关系呢?.学生考试出成绩,成绩记录在成绩表. 一个学生可以参加多门课程,关系是1对多. 数据库设计实例 设计数据库和表 安装m

mySQL 教程 第2章 安装和介绍mySQL

第2章 安装和介绍mySQL 设置mySQL字符集 支持中文的字符集是utf8,该设置可以更改mySQL配置文件进行全局设置,也可以针对数据库设置,也可以针对表设置,也可以针对列设置.字符集更改后新插入的数据生效,对以前不生效. 练习1:更改MySQL的默认字符集 直接修改 my.cnf,增加一行内容,然后重启 MySQL,使之全局生效,影响新建的所有数据库. default-character-set = utf8 重启mySQL服务 [email protected]:~# /etc/ini

mySQL 教程 第3章 数据类型和数据完整性

第3章 数据类型和数据完整性 准备数据库 创建练习数据库,以下实验都是在这个数据库中完成. 练习1:比较各种数值型 create table tmp1 ( id INT, name VARCHAR(25), deptId decimal(5,1), salary FLOAT ); 执行desc tmp1; 显示 插入两行记录查看结果 insert into tmp1 VALUES (199,'韩立刚',3223.32,544.5); insert into tmp1 VALUES (19999,

mySQL教程 第7章 存储过程和函数

第7章 存储过程和函数 存储过程和存储函数 MySQL的存储过程(stored procedure)和函数(stored function)统称为stored routines. 1. MySQL存储过程和函数的区别 函数只能通过return语句返回单个值或者表对象.而存储过程不允许执行return,但是通过out参数返回多个值. 函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行. 函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制

Influx Sql系列教程九:query数据查询基本篇二

前面一篇介绍了influxdb中基本的查询操作,在结尾处提到了如果我们希望对查询的结果进行分组,排序,分页时,应该怎么操作,接下来我们看一下上面几个场景的支持 在开始本文之前,建议先阅读上篇博文: 190813-Influx Sql系列教程八:query数据查询基本篇 0. 数据准备 在开始查询之前,先看一下我们准备的数据,其中name,phone为tag, age,blog,id为field > select * from yhh name: yhh time age blog id name

MySQL学习总结(五) --- 表数据查询

查询数据记录,是指从数据库对象表中获取所要查询的数据记录,该操作可以说是数据最基本的操作之一,也是使用频率最高.最重要的数据操作. 1.单表数据记录查询 1.1.简单数据查询 SELECT field1,field2,…,fieldn FROM table_name,filed可以是表中所有的字段,也可以是部分字段. SELECT * FROM table_name ,从表中查询所有的数据.*符号可以代替所有的字段,但是这种方式不够灵活,只能按照表中字段的顺序固定进行显示,不能够随便改变字段的显

Influx Sql系列教程八:query数据查询基本篇

前面几篇介绍了InfluxDB的添加,删除修改数据,接下来进入查询篇,掌握一定的SQL知识对于理解本篇博文有更好的帮助,下面在介绍查询的基础操作的同时,也会给出InfluxSql与SQL之间的一些差别 在开始之前,先看一下供查询的数据 > show measurements name: measurements name ---- yhh > select * from yhh name: yhh time age blog id name phone ---- --- ---- -- ---