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】字段别名.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;

-- 查询从第二条到第十条的数据

上一篇:深度学习(七)U-Net原理以及keras代码实现医学图像眼球血管分割


下一篇:【SQL】在一个含有group by的查询sql中,同时存在having和where,sql在解析执行的时候,先执行的是哪一个?