MySQL
来源:互联网 发布:宜宾餐饮软件 编辑:程序博客网 时间:2024/06/06 13:05
select查询完整语法格式如下:
selet[select 选项] 字段列表[字段别名] /* from 数据源[where条件字句][group by 字句][having 字句][order by 字句][limit 字句]
【1】select选项:select对查出来的结果的处理方式;
① all :默认的,保留所有的结果;
② distinct:去重,将查出来的结果重复的去掉(所有字段值都相同才叫重复)。
下面两条语句等价:
select * from p_user_2;SELECT all * from p_user_2
Distinct示例:
select DISTINCT NAME,age from p_user_2
【2】字段别名
多表操作时可能会有字段名字重复,此时可重命名。
示例如下:
select NAME [as] '用户名',age [as] '年龄' from p_user_2;-- as可缺省
【3】数据源
数据源:数据的来源,关系型数据库数据来源为数据表。本质上只要保证数据类似二维表,最终都可以作为数据源。
数据源分多种:单表数据源,多表数据源(多表查询)以及查询语句(from子句)。
- 单表数据源 :
select * from p_user
- 多表数据源:
select * from p_user,c_user
可以自定义列,别名进行查询。如果默认查询且两表存在重复字段名,后置+1(此处用的Navicat for MySQL,如果在dos下,字段不会+1):
需要注意的是:这样查询效果是从一张表中取出一条记录,去另外一张表中匹配所有的记录,而且全部保留(包括记录数和字段数) 。将这种结果称之为–笛卡尔积(交叉连接)。
- 查询语句:
select * from (select NAME,age from p_user) as t;-- from后面查询语句结果作为一个临时表;-- 表一定要有别名
【4】where子句
where是唯一一个直接从磁盘获取数据的时候就开始判断的条件。
从磁盘取出一条记录,开始where判断。判断如果成立,则保存到内存中;失败则直接放弃。
where子句:用来判断数据筛选数据。返回结果0或者1,0–false;1–true。
判断条件:
比较运算符:<,>,>=,<=,!=,<>,=,like,between and,in/not in ;
逻辑运算符:and(&&),or(||),not(!)。
in 是一个区间,一个集合,准备的说是一个散列值的序列。
between是两个数直接的区间范围,左边的数必须小于或者等于右边的数字。
select * from p_user where age BETWEEN 10 and 20;select * from p_user where age <20 and age >10;select * from p_user where age in(10,11,12,15,19,18)
【5】group by 子句
group by:按照某个条件进行分组,记录相同的(按照数据表中保存的次序)只保留一条,然后根据条件字段进行排序默认升序。
即,对分组的结果合并之后的整个结果进行排序!
分组的意义:是为了统计数据(按组统计:按分组字段进行统计,一个组只统计一条数据)。
MySQL 提供的统计函数:
count():统计分组后的记录数,即每一组有多少记录;
max():统计每组中的最大值;
min():统计每组中的最小值;
avg():统计每组中的平均值;
sum:对每组进行求和。
- 语法格式如下:
select [columns] from table_name [where..] group by [columns] [having ...]
需要说明的是,在select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中!!!
详细参考group by实例分析
下面操作是在Navicat for MySQL中进行,该工具对语法进行了处理。
① 按照年龄进行分组:
select * from p_user GROUP BY age;
注意,group by 默认进行了排序,其age列效果同下 :
select DISTINCT age from p_user ORDER BY age asc;
② 按照年龄分组并count :
select *, COUNT(*) from p_user GROUP BY age;
count( ):里面可以使用两种参数:* 代表统计记录,字段名代表统计对应的字段(NULL不统计)。
count()是分组之后统计每组的记录数!!!
③ 按照年龄分组在count基础上取最大、最小值:
select *,count(age), max(id),min(id) from p_user GROUP BY age;
④ 多字段分组:
- 分组之后整合的结果也是先按照sex后按照age排序。
select sex,age,COUNT(age) from p_user GROUP BY sex,age;
如果想统计每组中的name呢?可以使用GROUP_CONCAT()函数。
group_concat() : 可以对分组的结果中的某个字段进行字符串链接(保留该组所有的某个字段)。
select sex,age,COUNT(age),GROUP_CONCAT(name) from p_user GROUP BY sex,age
回溯统计:with rollup 。
解释如下:任何一个分组后都会有一个小组,最后都需要根据当前分组的字段向上级分组进行汇报统计。
回溯统计的时候会将分组字段置空。
正常分组如下:
SELECT sex,COUNT(*) from p_user GROUP BY sex;
回溯统计如下:
select sex,count(*)from p_user GROUP BY sex with rollup;
多字段回溯统计
正常统计1-九条记录:
select sex,age,COUNT(age),GROUP_CONCAT(name) from p_user GROUP BY age,sex
回溯统计1-16条:
select sex,age,COUNT(age),GROUP_CONCAT(name) from p_user GROUP BY age,sex WITH ROLLUP
按照年龄进行分组,之后又针对每个年龄进行sex分组。那么首先向sex的上级分组age进行汇报统计,然后age再向顶级分组进行汇报统计。age有六组,故进行六次(sex-age)汇报统计,最后(age - 顶级)进行一次总的汇报统计。
正常统计2-九条记录:
select sex,age,COUNT(age),GROUP_CONCAT(name) from p_user GROUP BY sex,age
回溯统计2-12条:
select sex,age,COUNT(age),GROUP_CONCAT(name) from p_user GROUP BY sex,age WITH ROLLUP
首先根据sex进行分组,之后再根据age进行分组。那么汇报统计首先是age-sex,因为sex只有两组,故回溯统计两次。最后sex-顶层,进行一次回溯统计。共三次,故12条
多字段回溯:考虑第一层分组会有此回溯;第二次分组要看第一次分组的组数,组数是多少,回溯就是多少,然后加上第一层回溯即可。
【6】having子句
Having子句:与where子句一样进行条件判断的。
where是针对磁盘数据进行判断,进入到内存之后会进行分组操作,而分组结果需要having进行过滤。
having能做where能做的几乎所有事情,反之不能。
① 分组统计的结果或者统计函数只有having能使用,where不可以。
select age,count(*) from p_user group by age having count(*)>1;-- where 不可以,因为where是在group by前进行过滤,而count(*)是在group by之后统计。
② having能够使用字段别名,where不能。where是从磁盘获取数据,名字只可能是字段名,别名是在字段进入内存后才会产生。
select age,count(*) as total from p_user group by age having total>1;select name as 名字,age from p_user having 名字 like '%明%';-- 如果换成where则错误。
【7】order by子句
order by : 排序,根据某个字段进行升序或者降序排序,依赖校对集。
语法:order by 字段名 [asc|desc]
默认asc-升序,desc是降序。
排序可以进行多字段排序:先根据某个字段进行排序,然后排序好的内部,再按照某个数据进行再次排序。
select * from p_user ORDER BY sex,age;
【8】limit子句
limit子句是一种限制结果的子句:限制数量。
① 限制查询长度(记录数)
select * from p_user limit 2;
② 限制起始位置和偏移长度,limit m,n
- 常用来进行数据分页;
- 记录数从 0 开始;
select * from p_user limit 2 ,10;-- 查询从第二条到第十条的数据
数据分页:
- 分页可以为用户节省时间,提高服务器响应效率,减少资源的浪费。
对于服务器来讲,每次根据用户选择的页码来获取不同的数据,limit offset,length。
length:每页显示的数据量,基本不变。
offset:(页码-1)*length(因为记录数从0开始哦)。
至于selec各个子句直接执行的顺序,点击查看select执行顺序
- Mysql
- MySql
- MYSQL
- MySQL
- mysql
- mysql
- mysql
- mysql
- Mysql
- Mysql
- mysql
- MySQL
- mysql
- Mysql
- mysql
- mysql
- mysql
- mySQL
- Mybatis分页插件
- Vuex2.0 + Vue-Resource Todo实例
- 卷积神经网络
- 理解深度学习需要重新思考泛化
- 【框架-QT】修改程序图标
- MySQL
- 记录下从mysql迁移数据到hbase
- 【mysql linux安装】Mysql centos安装教程
- Linux(Fedora25) Oracle 11g 新增实例(非图形化)
- Vuex2 实战
- sizeof(string)的问题(很经典)
- 多线程安全
- 详解 Vue & Vuex 实践
- 我与python约个会:32.企业级开发进阶4:正则表达式