MySQL 之 单表查询
一.简单查询
-- 创建表
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`age` tinyint(4) DEFAULT '',
`sex` enum('男','女','人妖') NOT NULL DEFAULT '人妖',
`salary` decimal(10,2) NOT NULL DEFAULT '250.00',
`hire_date` date NOT NULL,
`did` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8; -- 创建数据 -- 教学部
INSERT INTO `person` VALUES ('', 'alex', '', '人妖', '53000.00', '2010-06-21', '');
INSERT INTO `person` VALUES ('', 'wupeiqi', '', '男', '8000.00', '2011-02-21', '');
INSERT INTO `person` VALUES ('', 'egon', '', '男', '6500.00', '2015-06-21', '');
INSERT INTO `person` VALUES ('', 'jingnvshen', '', '女', '6680.00', '2014-06-21', ''); -- 销售部
INSERT INTO `person` VALUES ('', '歪歪', '', '女', '3000.00', '2015-02-21', '');
INSERT INTO `person` VALUES ('', '星星', '', '女', '2000.00', '2018-01-30', '');
INSERT INTO `person` VALUES ('', '格格', '', '女', '2000.00', '2018-02-27', '');
INSERT INTO `person` VALUES ('', '周周', '', '女', '2000.00', '2015-06-21', ''); -- 市场部
INSERT INTO `person` VALUES ('', '月月', '', '女', '4000.00', '2014-07-21', '');
INSERT INTO `person` VALUES ('', '安琪', '', '女', '4000.00', '2015-07-15', ''); -- 人事部
INSERT INTO `person` VALUES ('', '周明月', '', '女', '5000.00', '2014-06-21', '');
-- 鼓励部
INSERT INTO `person` VALUES ('', '苍老师', '', '女', '1000000.00', '2018-02-21', null);
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#查询语法: select [distinct]*(所有)|字段名,...字段名 from 表名;#查询所有字段信息select * from person;#查询指定字段信息select id,name,age,sex,salary from person;#别名查询,使用的as关键字,as可以省略的select name,age as'年龄',salary '工资' from person;#直接对列进行运算,查询出所有人工资,并每人增加100块.select (5/2);select name, salary+100 from person;#剔除重复查询select distinct age from person; |
二 条件查询
条件查询:使用 WHERE 关键字 对简单查询的结果集 进行过滤
1. 比较运算符: > < >= <= = <>(!=)
2. null 关键字: is null , not null
3.逻辑运算符: 与 and 或 or (多个条件时,需要使用逻辑运算符进行连接)
|
1
2
3
4
5
6
7
8
9
10
11
12
|
#查询格式:select [distinct]*(所有)|字段名,...字段名 from 表名 [where 条件过滤]#比较运算符: > < >= <= = <>(!=) is null 是否为nullselect * from person where age = 23;select * from person where age <> 23;select * from person where age is null;select * from person where age is not null;#逻辑运算符: 与 and 或 orselect * from person where age = 23 and salary =29000;select * from person where age = 23 or salary =29000; |
三 区间查询
关键字 between 10 and 20 :表示 获得10 到 20 区间的内容
|
1
2
3
4
|
# 使用 between...and 进行区间 查询select * from person where salary between 4000 and 8000;ps: between...and 前后包含所指定的值等价于 select * from person where salary >= 4000 and salary <= 8000; |
四 集合查询
关键字: in, not null
|
1
2
3
4
5
6
|
#使用 in 集合(多个字段)查询select * from person where age in(23,32,18);等价于: select * from person where age =23 or age = 32 or age =18;#使用 in 集合 排除指定值查询select * from person where age not in(23,32,18); |
五 模糊查询
关键字 like , not like
%: 任意多个字符
_ : 只能是单个字符
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#模糊查询 like %:任意多个字符, _:单个字符#查询姓名以"张"字开头的select * from person where name like '张%';#查询姓名以"张"字结尾的select * from person where name like '%张';#查询姓名中含有"张"字的select * from person where name like '%张%';#查询 name 名称 是四个字符的人select * from person where name like '____';#查询 name 名称 的第二个字符是 'l'的人select * from person where name like '_l%';#排除名字带 a的学生select * from student where name not like 'a%' |
六 排序查询
关键字: ORDER BY 字段1 DESC, 字段2 ASC
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#排序查询格式:select 字段|* from 表名 [where 条件过滤] [order by 字段[ASC][DESC]]升序:ASC 默认为升序降序:DESCPS:排序order by 要写在select语句末尾#按人员工资正序排列,注意:此处可以省略 ASC关键字select * from person order by salary ASC;select * from person order by salary;#工资大于5000的人,按工资倒序排列select * from person where salary >5000 order by salary DESC;#按中文排序select * from person order by name;#强制中文排序select * from person order by CONVERT(name USING gbk);ps:UTF8 默认校对集是 utf8_general_ci , 它不是按照中文来的。你需要强制让MySQL按中文来排序 |
七 聚合函数
聚合: 将分散的聚集到一起.
聚合函数: 对列进行操作,返回的结果是一个单一的值,除了 COUNT 以外,都会忽略空值
COUNT:统计指定列不为NULL的记录行数;
SUM:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
MAX:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
AVG:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
|
1
2
3
4
5
|
#格式:select 聚合函数(字段) from 表名;#统计人员中最大年龄、最小年龄,平均年龄分别是多少select max(age),min(age),avg(age) from person; |
八 分组查询
分组的含义: 将一些具有相同特征的数据 进行归类.比如:性别,部门,岗位等等
怎么区分什么时候需要分组呢?
套路: 遇到 "每" 字,一般需要进行分组操作.
例如: 1. 公司每个部门有多少人.
2. 公司中有 多少男员工 和 多少女员工.

#分组查询格式:
select 被分组的字段 from 表名 group by 分组字段 [having 条件字段]
ps: 分组查询可以与 聚合函数 组合使用. #查询每个部门的平均薪资
select avg(salary),did from person GROUP BY did; #查询每个部门的平均薪资 并且看看这个部门的员工都有谁?
select avg(salary),did,GROUP_CONCAT(name) from person GROUP BY did;
#GROUP_CONCAT(expr):按照分组,将expr字符串按逗号分隔,组合起来 #查询平均薪资大于10000的部门, 并且看看这个部门的员工都有谁?
select avg(salary),did,GROUP_CONCAT(name) from person GROUP BY did having avg(salary)>10000;

where 与 having区别:
#执行优先级从高到低:where > group by > having
#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
九 分页查询
好处:限制查询数据条数,提高查询效率
|
1
2
3
4
5
6
7
8
9
10
|
#查询前5条数据select * from person limit 5;#查询第5条到第10条数据select * from person limit 5,5;#查询第10条到第15条数据select * from person limit 10,5;ps: limit (起始条数),(查询多少条数); |
十 正则表达式
MySQL中使用 REGEXP 操作符来进行正则表达式匹配。
| 模式 | 描述 |
|---|---|
| ^ | 匹配输入字符串的开始位置。 |
| $ | 匹配输入字符串的结束位置。 |
| . | 匹配任何字符(包括回车和新行) |
| [...] | 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 |
| [^...] | 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。 |
| p1|p2|p3 | 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# ^ 匹配 name 名称 以 "e" 开头的数据select * from person where name REGEXP '^e';# $ 匹配 name 名称 以 "n" 结尾的数据select * from person where name REGEXP 'n$';# . 匹配 name 名称 第二位后包含"x"的人员 "."表示任意字符select * from person where name REGEXP '.x';# [abci] 匹配 name 名称中含有指定集合内容的人员select * from person where name REGEXP '[abci]';# [^alex] 匹配 不符合集合中条件的内容 , ^表示取反select * from person where name REGEXP '[^alex]';#注意1:^只有在[]内才是取反的意思,在别的地方都是表示开始处匹配#注意2 : 简单理解 name REGEXP '[^alex]' 等价于 name != 'alex'# 'a|x' 匹配 条件中的任意值select * from person where name REGEXP 'a|x'; #查询以w开头以i结尾的数据select * from person where name regexp '^w.*i$';#注意:^w 表示w开头, .*表示中间可以有任意多个字符, i$表示以 i结尾 |
正则详情参考 :http://www.cnblogs.com/aaronthon/p/8479841.html
十一 SQL 语句关键字的执行顺序
查询:姓名不同人员的最高工资,并且要求大于5000元,同时按最大工资进行排序并取出前5条.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
select name, max(salary) from person where name is not null group by name having max(salary) > 5000 order by max(salary)limit 0,5 |
在上面的示例中 SQL 语句的执行顺序如下:
(1). 首先执行 FROM 子句, 从 person 表 组装数据源的数据
(2). 执行 WHERE 子句, 筛选 person 表中 name 不为 NULL 的数据
(3). 执行 GROUP BY 子句, 把 person 表按 "name" 列进行分组
(4). 计算 max() 聚集函数, 按 "工资" 求出工资中最大的一些数值
(5). 执行 HAVING 子句, 筛选工资大于 5000的人员.
(7). 执行 ORDER BY 子句, 把最后的结果按 "Max 工资" 进行排序.
(8). 最后执行 LIMIT 子句, . 进行分页查询
执行顺序: FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY ->limit
十二 练习题
练习题一: http://www.cnblogs.com/aaronthon/articles/8479868.html
练习题二:http://www.cnblogs.com/aaronthon/articles/8479875.html
MySQL 之 单表查询的更多相关文章
- MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询
MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...
- Mariadb/MySQL数据库单表查询基本操作及DML语句
Mariadb/MySQL数据库单表查询基本操作及DML语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一数据库及表相关概述 1>.数据库操作 创建数据库: CREATE ...
- day 38 MySQL之单表查询
MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER ...
- Mysql数据库单表查询
1.单表查询语法 #查询数据的本质:mysql会到你本地的硬盘上找到对应的文件,然后打开文件,按照你的查询条件来找出你需要的数据.下面是完整的一个单表查询的语法 select * from,这个sel ...
- MySQL之单表查询、多表查询
一.单表查询: 单个表的查询方法及语法顺序需要通过实际例子来熟悉 先将表数据创建下: mysql> create database singe_t1; # 建个数据库singe_t1 Query ...
- MySQL 的单表查询
单表查询 语法: 一.单表查询的语法 SELECT 字段1,字段2 ,...FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY filed LIMIT ...
- 四 mysql之单表查询
目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 1. 什么是分组?为什么要分组? 2. ONLY_FULL_GROUP_BY ...
- mysql(单表查询,多表查询,MySQl创建用户和授权,可视化工具Navicat的使用)
单表查询 语法: 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT ...
- MySQL的单表查询
单表查询 单表查询语法: select distinct 字段1,字段2... from 表名 where 条件 group by field having筛选 order by 关键字执行的优先级: ...
- day037 mysql之单表查询
一.单表查询语法 select distinct 字段1,字段2,... from 库名.表名 where 条件 group by 字段 having 筛选条件 order by 字段 limit 限 ...
随机推荐
- 461.汉明距离(c++实现)
问题描述: 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目. 给出两个整数 x 和 y,计算它们之间的汉明距离. 注意:0 ≤ x, y < 231. 示例: 输入: x = ...
- Java通过JNI调用C++程序
JNI是Java Native Interface的缩写,中文为JAVA本地调用.使用JNI可以很方便的用我们的Java程序调用C/C++程序.很多时候,某些功能用Java无法实现,比如说涉及到底层驱 ...
- MySql之查询基础与进阶
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/8283547.html 一:基本查询 SELECT [DISTINCT] 列1,列2,列3... FROM 表 ...
- Jexus 网站服务器和 ASP.NET 跨平台开发
微软的跨平台战略 微软在过去的一年多中时间中发生了令整个 IT 行业感到惊叹的变化.这一切始于 Ballmer 的退位和 Nadella 的决心,更始于早已在微软各个基层部门蠢蠢欲动的二次创业. 以开 ...
- 下载网易云音乐的MV
网易云音乐有很多经典视频, 但是苦于没有下载按钮...今天就记录下如何保存MV到本地, 又get一项新技能!!! 一. 安装360极速浏览器(非安利) 二. 打开网易云音乐客户端, 点击"等 ...
- C++11中的右值引用及move语义编程
C++0x中加入了右值引用,和move函数.右值引用出现之前我们只能用const引用来关联临时对象(右值)(造孽的VS可以用非const引用关联临时对象,请忽略VS),所以我们不能修临时对象的内容,右 ...
- 如何查看memcache的性能
memcache的运行状态可以方便的用 stats 命令显示.首先用telnet 127.0.0.1 11211这样的命令连接上memcache,然后直接输入stats就可以得到当前memcache的 ...
- 【C语言】数组名传递给函数,数组的sizeof变为4的原因
C语言中,数组名作为参数传递给函数时,退化为指针,sizeof对指针操作结果应该是4.例子如下: #include<iostream> using namespace std; void ...
- MySQL 5.6新特性 -- Multi-Range Read
如果基表很大,数据没有被缓存,在二级索引上使用范围扫描读取行可能会导致大量的随机磁盘访问.使用Multi-Range Read新特性,mysql可以减少对磁盘的随机读的次数:首先,mysql只是扫描索 ...
- 每日英语:Mrs. Obama Takes Stab at Ping-Pong Diplomacy
U.S. first lady Michelle Obama took ping-pong diplomacy to a new level on Friday on her weeklong tou ...