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','zhangyong@onest.net','JAVA','20120803');

insert into TStudent values ('90007','赵洁','女','132302198905044565','19880503','zhaojie@onest.net','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

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

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

    前面一篇介绍了influxdb中基本的查询操作,在结尾处提到了如果我们希望对查询的结果进行分组,排序,分页时,应该怎么操作,接下来我们看一下上面几个场景的支持 在开始本文之前,建议先阅读上篇博文: 1 ...

  2. JAVA / MySql 编程—— 第三章 高级查询(一)

    1.        修改表: (1)修改表名语法: ALTER TABLE <旧表名> RENAME [ TO ] <新表名>: 注意:其中[TO]为可选参数,使用与否不影响结 ...

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

    前面几篇介绍了InfluxDB的添加,删除修改数据,接下来进入查询篇,掌握一定的SQL知识对于理解本篇博文有更好的帮助,下面在介绍查询的基础操作的同时,也会给出InfluxSql与SQL之间的一些差别 ...

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

    使用SQL Manager管理工具连接到schoolDB.由于三张表都设置了主键,因此,以下练习中插入的记录,主键不能重. 插入数据 1. 练习:为表的所有字段插入数据 为表中所有字段插入数据,可以不 ...

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

    存储过程和存储函数 MySQL的存储过程(stored procedure)和函数(stored function)统称为stored routines. 1. MySQL存储过程和函数的区别 函数只 ...

  6. Android+Servlet+MySql+JSON实现简单的数据查询操作--C/S架构

    本例简单地实现Android客户端与服务器端交互,主要是通过客户端输入内容(学号)提交到服务器端,服务器端与数据库交互去查询相应信息(姓名).根据这个做个完整的安卓登录是没问题的.本例数据库服务器都采 ...

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

    准备数据库 创建练习数据库,以下实验都是在这个数据库中完成. 练习1:比较各种数值型 create table tmp1 ( id INT, name VARCHAR(25), deptId deci ...

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

    设置mySQL字符集 支持中文的字符集是utf8,该设置可以更改mySQL配置文件进行全局设置,也可以针对数据库设置,也可以针对表设置,也可以针对列设置.字符集更改后新插入的数据生效,对以前不生效. ...

  9. mySQL教程 第1章 数据库设计

    E-R设计 很多同学在学SQL语句时,觉得非常困难,那是因为你在学一个你根本不了解的数据库,数据库中的表不是你设计的,表与表之间的关系你不明白.因此在学SQL语句之前,先介绍一下数据库设计. 下面举例 ...

随机推荐

  1. 从输入URL到页面加载发生了什么

    大体过程 浏览器的地址栏输入URL并按下回车 浏览器检查当前URL是否存在缓存,并比较缓存是否过期 DNS解析URL对应的IP 根据IP建立TCP连接(三次握手) HTTP发起请求 服务器处理请求,浏 ...

  2. mysql创建索引-----高性能(五)

    转载地址:https://www.cnblogs.com/llzhang123/p/7889382.html 索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或 ...

  3. cocos2d-x安装教程

    cocos2d-x安装教程 cocos的安装方法有多种,今天讲的是其中一种,使用cocos的源代码直接进行编译. 下载cocos2d-x的源代码,提供两种方式给大家 -- 中文官网下载 -- 英文官网 ...

  4. PatePoco中对sql参数化时Top参数化的问题

    PatePoco中对sql参数化是直接用@+参数名来处理,但是想用如下语句时竟然报错了 SELECT TOP @num * FROM tableA 执行时抛出异常,根据错误提示搞了很久都没找到原因,最 ...

  5. Windows 7 英文版操作系统中文软件乱码解决方法

    http://blog.csdn.net/lqhbupt/article/details/18863243

  6. JS实现点击按钮,下载文件

    PS:本文说的,并非如何用js创建流.创建文件.实现下载功能. 而是说的:你已知一个下载文件的后端接口,前端如何请求该接口,实现点击按钮.下载文件到本地.(可以是zip啦.excel啦都是一样) 有两 ...

  7. mysql-5.6.17-win32安装

    下载免安装压缩文件http://dev.mysql.com/downloads/mysql/ 解压到自定义目录,我这里演示的是D:\wamp\mysql\   复制根目录下的my-default.in ...

  8. 解决 Error: could not open `C:\Program Files\Java\jre7\lib\i386\jvm.cfg'

    解决 Error: could not open `C:\Program Files\Java\jre7\lib\i386\jvm.cfg' 重装JDK后,因为没有装在以前的目录,运行java命令后报 ...

  9. Windows 下python的tab自动补全

    方法一:安装一个ipython就OK啦,而且关键字还能高亮显示呢 一.打开cmd,输入pip3 install ipython联网安装 二.安装成功后,cmd里运行ipython,成功啦. 方法二:写 ...

  10. Mac 下配置php环境

    Mac OS X 内置了Apache 和 PHP,这样使用起来非常方便.本文以Mac OS X 10.6.3为例.主要内容包括: 启动Apache 运行PHP 安装MySQL 使用phpMyAdmin ...