这篇文章主要向大家介绍MySQL - select 查询完整语法,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。
select查询完整语法格式以下:web
selet[select 选项]
字段列表[字段别名] /*
from 数据源
[where条件字句]
[group by 字句]
[having 字句]
[order by 字句]
[limit 字句]
【1】select选项数据库
即select对查出来的结果的处理方式服务器
① all :默认的,保留全部的结果;
② distinct:去重,将查出来的结果重复的去掉(全部字段值都相同才叫重复)。svg
下面两条语句等价:函数
select * from p_user_2;
SELECT all * from p_user_2
Distinct示例:工具
select DISTINCT NAME,age from p_user_2
【2】字段别名.net
多表操做时可能会有字段名字重复,此时可重命名。3d
示例以下:code
select NAME [as] '用户名',age [as] '年龄' from p_user_2;
-- as可缺省
3】数据源xml
数据源:数据的来源,关系型数据库数据来源为数据表。本质上只要保证数据相似二维表,最终均可以做为数据源。
数据源分多种:单表数据源,多表数据源(多表查询)以及查询语句(from子句)。
- 单表数据源 :
select * from p_user
- 多表数据源:
select * from p_user,c_user
【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语句的后面,做为分组的依据;要么就要被包含在聚合函数中!!!
下面操做是在Navicat for MySQL中进行,该工具对语法进行了处理。
① 按照年龄进行分组:
select * from p_user GROUP BY age;
② 按照年龄分组并count :
select *, COUNT(*) from p_user GROUP BY age;
count( ):里面可使用两种参数:*
表明统计记录,字段名表明统计对应的字段(NULL不统计)。
count()是分组以后统计每组的记录数,单独执行count查询只会返回一行结果!!!
④ 多字段分组:
- 分组以后整合的结果也是先按照sex后按照age排序。
select sex,age,COUNT(age) from p_user GROUP BY sex,age;
③ 按照年龄分组在count基础上取最大、最小值:
select *,count(age), max(id),min(id) from p_user GROUP BY age;
若是想统计每组中的name呢?可使用GROUP_CONCAT()函数。
group_concat() : 能够对分组的结果中的某个字段进行字符串连接(保留该组全部的某个字段)。
select sex,age,COUNT(age),GROUP_CONCAT(name) from p_user GROUP BY sex,age
6】having子句
having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 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;
-- 查询从第二条到第十条的数据