一.简单查询

-- 创建表
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 是否为null
select 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 或 or
select 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 默认为升序
降序:DESC
PS:排序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 之 单表查询的更多相关文章

  1. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  2. Mariadb/MySQL数据库单表查询基本操作及DML语句

    Mariadb/MySQL数据库单表查询基本操作及DML语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一数据库及表相关概述 1>.数据库操作 创建数据库: CREATE ...

  3. day 38 MySQL之单表查询

    MySQL之单表查询   阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER ...

  4. Mysql数据库单表查询

    1.单表查询语法 #查询数据的本质:mysql会到你本地的硬盘上找到对应的文件,然后打开文件,按照你的查询条件来找出你需要的数据.下面是完整的一个单表查询的语法 select * from,这个sel ...

  5. MySQL之单表查询、多表查询

    一.单表查询: 单个表的查询方法及语法顺序需要通过实际例子来熟悉 先将表数据创建下: mysql> create database singe_t1; # 建个数据库singe_t1 Query ...

  6. MySQL 的单表查询

    单表查询 语法: 一.单表查询的语法 SELECT 字段1,字段2 ,...FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY filed LIMIT ...

  7. 四 mysql之单表查询

    目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 1. 什么是分组?为什么要分组? 2. ONLY_FULL_GROUP_BY ...

  8. mysql(单表查询,多表查询,MySQl创建用户和授权,可视化工具Navicat的使用)

    单表查询 语法: 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT ...

  9. MySQL的单表查询

    单表查询 单表查询语法: select distinct 字段1,字段2... from 表名 where 条件 group by field having筛选 order by 关键字执行的优先级: ...

  10. day037 mysql之单表查询

    一.单表查询语法 select distinct 字段1,字段2,... from 库名.表名 where 条件 group by 字段 having 筛选条件 order by 字段 limit 限 ...

随机推荐

  1. ThreadLocal 简介 案例 源码分析 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. python3 requests获取某网站折线图上数据

    比如要抓取某网站折线图上数据,如下截图: 借助Chrome开发者工具Network.经过分析发现获取上面的热度数据,找到对应的事件url:https://pcw-api.iqiyi.com/video ...

  3. [猜你喜欢]冠军“yes,boy!”分享,含竞赛源代

    [猜你喜欢]冠军“yes,boy!”分享,含竞赛源代码  DataCastle运营 发表于 2016-7-20 17:31:52      844  3  5 我是Yes,boy! ,来自东北大学计算 ...

  4. 微软BI 之SSIS 系列 - 导出数据到 Excel 2013 的实现

    开篇介绍 碰到有几个朋友问到这个问题,比较共性,就特意写了这篇小文章说明一下如何实现在 SSIS 中导出数据到 Office Excel 2013 中.通常情况下 2013 以前的版本大多没有问题,但 ...

  5. vue Object.defineProperty Proxy 数据双向绑定

    Object.defineProperty 虽然已经能够实现双向绑定了,但是他还是有缺陷的. 只能对属性进行数据劫持,所以需要深度遍历整个对象 对于数组不能监听到数据的变化 虽然 Vue 中确实能检测 ...

  6. MySQL 四种事务隔离级的说明[转]

    很早之前写的文章,重新回顾和学习下: 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ).MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔 ...

  7. GCD 之线程死锁

    GCD 确实好用 ,很强大,相比NSOpretion 无法提供 取消任务的功能. 如此强大的工具用不好可能会出现线程死锁. 如下代码: - (void)viewDidLoad { [super vie ...

  8. C++复数运算 重载

    近期整理下很久前写的程序,这里就把它放在博文中了,有些比较简单,但是很有学习价值. 下面就是自己很久前实现的复数重载代码,这里没有考虑特殊情况,像除法中,分母不为零情况. #include <i ...

  9. json简介及JsonCpp用法

    [时间:2017-04] [状态:Open] [关键词:数据交换格式,json,jsoncpp,c++,json解析,OpenSource] json简介 本文仅仅是添加我个人对json格式的理解,更 ...

  10. 关于Python打包运行的一些思路

    需求 本地开发python django应用程序,然后放到生产环境运行.使用了tensorflow,手动安装包很麻烦.生产环境不能联网,不能使用 pip freeze. 思路: 使用docker,直接 ...