MySQL-select查询完整语法
这篇⽂章主要向⼤家介绍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】字段别名
多表操做时可能会有字段名字重复,此时可重命名。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⼦句是⼀种限制结果的⼦句:限制数量。
① 限制查询长度(记录数)mysql帮助文档
select * from p_user limit 2;
② 限制起始位置和偏移长度,limit m,n
经常使⽤来进⾏数据分页;
记录数从 0 开始;
select * from p_user limit 2 ,10;
-- 查询从第⼆条到第⼗条的数据

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。