一、MYSQL基础查询
1.1 SELECT 完整语法
select 字段列表 from 数据源; ##字段列表可以是*。*指显示查询的所有字段
select 去重选项 字段列表 [as 字段别名] from 数据源 [where子句] [group by 子句] [having子句] [order by 子句] [limit子句];
eg:
SELECT * FROM testtablenew
、
1.2 去重选项
去重选项是指将查询结果中完全相同的记录进行去重:
all:不去重
distinct:去重
语法结构如下:
select [all|distinct] 字段列表 from 表名;
eg:
在testtablenew表中插入重复的数据(采用笔记六中插入数据的语句)。数据如下:
使用sql语句查询testtablenew中的数据,查询结果中不能包含重复数据,其查询语句如下:
##写法一:
SELECT DISTINCT * FROM testtablenew
##写法二:
SELECT DISTINCT ID , fullname , age FROM testtablenew
注意:去重只是针对的是查询出来的记录,而不是存储在表中的记录。如果说仅仅查询的是某些字段,那么去重针对的是这些字段。
1.3 字段别名
字段别名是给查询的字段再定义一个名字(改名字只在查询结果中应用)
字段别名一般都是辅助了解字段意义(比如我们定义的名字是name,我们希望返回给用户的结果显示成姓名)、简写字段名
具体语法如下:
select 字段 as 字段别名 from 表名;
select 字段 字段别名 from 表名;
eg:
查询testtablenew表中的数据,并对字段进行别名设置。使其显示出来的字段为编号、姓名、年龄
SELECT DISTINCT ID '编号', fullname AS '姓名' , age '年龄' FROM testtablenew
执行结果如下:
1.4 数据源
数据源可以是单表数据源,多表数据源,其查询语法格式如下:
select 字段列表 from 表名;
select 字段列表 from 表名1,表名2,…; 【多表查询时是将每个表中的x条记录与另一个表y条记录组成结果,组成的结果的记录条数为x*y】【可以称为笛卡尔积】
select 字段列表 fromr (select语句) as 表别名;【这是将一个查询结果作为一个查询的目标二维表,需要将查询结果定义成一个表别名才能作为数据源】
1.5 MYSQL查询的子句
编号 | 子句 | 作用 | 说明 |
---|---|---|---|
1 | where子句 | 条件查询 | 按照“条件表达式”指定的条件进行查询。 |
2 | group by子句 | 分组 | 按照“属性名”指定的字段进行分组。group by子句通常和count()、sum()等聚合函数一起使用 |
3 | having子句 | 筛选 | 有group by才能having子句,只有满足“条件表达式”中指定的条件的才能够输出 |
4 | order by子句 | 排序 | 按照“按照“属性名”指定的字段进行排序。排序方式由“asc”和“desc”两个参数指出,默认是按照“asc”来排序,即升序。 |
5 | limit | 限制结果集 |
1.5.1 where子句
where子句是主要是用来筛选符合条件的结果。
where常见的有种用法:
- 基于值:
= :
where 字段 =值 ;查找出对应字段等于对应值的记录。(相似的,<是小于对应值,<=是小于等于对应值,>是大于对应值,>=是大于等于对应值,!=是不等于)。
SELECT * FROM testtablenew WHERE fullname='001'
SELECT * FROM testtablenew WHERE ID>5
SELECT * FROM testtablenew WHERE ID!=7
like:
where 字段 like 值 ;功能与 = 相似 ,但可以使用模糊匹配来查找结果。模糊查询的匹配字符常见的有四种:
编号 | 匹配符 | 说明 |
---|---|---|
1 | % | 表示任意 0 个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示 |
2 | _ | 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句。 |
3 | [] | 表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 |
4 | [^] | 表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 |
SELECT * FROM testtablenew WHERE fullname LIKE '%7'
SELECT * FROM testtablenew WHERE fullname LIKE '_01'
SELECT * FROM testtablenew WHERE fullname REGEXP '00[1-2]'
SELECT * FROM testtablenew WHERE fullname REGEXP '00[^1-2]'
- 基于值的范围
in:
where 字段 in 范围;查找出对应字段的值在所指定范围的记录。
SELECT * FROM testtablenew WHERE ID IN (1,2,3,4)
not in :
where 字段 not in 范围;查找出对应字段的值不在所指定范围的记录。
SELECT * FROM testtablenew WHERE ID NOT IN (1,2,3,4)
between x and y :
where 字段 between x and y;查找出对应字段的值在闭区间[x,y]范围的记录。
SELECT * FROM testtablenew WHERE ID BETWEEN 3 AND 5
- 条件复合
or :
where 条件1 or 条件2… ; 查找出符合条件1或符合条件2的记录。
SELECT * FROM testtablenew WHERE ID =5 OR fullname='002'
and:
where 条件1 and 条件2… ; 查找出符合条件1并且符合条件2的记录。
SELECT * FROM testtablenew WHERE ID =5 AND age>16
not :
where not 条件1 ;查找出不符合条件的所有记录。
SELECT * FROM testtablenew WHERE NOT ID =5
&&的功能与and相同;||与or功能类似,!与not 功能类似。
1.5.2 group by子句
“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。
select类别, sum(数量) as数量之和
from A
groupby类别
注:group by语句中select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中。
mysql中五种常用的聚合函数:
编号 | 聚合函数 | 作用 |
---|---|---|
1 | max(列名) | 求最大值 |
2 | min(列名) | 求最小值 |
3 | sum(列名) | 求和 |
4 | avg(列名) | 求平均值 |
5 | count(列名) | 统计记录的条数 |
-
求最大值
获取testtablenew 表中的最大IDSELECT MAX(ID) FROM testtablenew
-
求最小值
获取testtablenew 表中的最小IDSELECT MIN(ID) FROM testtablenew
-
求和
求testtablenew 表中所有ID之和。SELECT SUM(ID) FROM testtablenew
-
求平均值
求testtablenew 表中ID的平均值。SELECT AVG(ID) FROM testtablenew
-
统计记录的条数
求testtablenew 表中有多少条数据。SELECT COUNT(ID) FROM testtablenew SELECT COUNT(*) FROM testtablenew
eg:
统计testtablenew 表中的信息,分别计算各个年龄的数据条数。sql语句如下:
SELECT age,COUNT(*) FROM testtablenew
GROUP BY age
命令结果执行如下:
1.5.3 having子句
having子句可以让我们筛选成组后的各种数据,where子句在聚合前先筛选记录,也就是说作用在group by和having子句前。而having子句在聚合后对组记录进行筛选。语法格式如下:
select类别, sum(数量) as数量之和from A
group by类别
having sum(数量) >18
eg:
在testtablenew表中,查询age条数大于等于4条的age。sql语句如下:
SELECT age,COUNT(*) FROM testtablenew
GROUP BY age
HAVING COUNT(*)>=4
Having和Where的联合使用,句法结构如下:
select类别, SUM(数量)from A
where数量>8
groupby类别
havingSUM(数量) >10
where和having的区别:
- having 和where 都是用来筛选用的
- having 是筛选组 而where是筛选记录
- having一般跟在group by之后,执行记录组选择的一部分来工作的。where则是执行所有数据来工作的。
- 再者having可以用聚合函数,如having sum(qty)>1000
1.5.4 order by 子句
SELECT * FROM testtablenew ORDER BY ID #按照ID进行升序(默认)
SELECT * FROM testtablenew ORDER BY ID DESC #按照ID进行降序
SELECT * FROM testtablenew ORDER BY ID ASC #按照ID进行升序
SELECT * FROM testtablenew ORDER BY RAND() #随机排列,效率不高
1.5.5 limit 子句
语法结构:
limit [offset,] N
offset 偏移量,可选,不写则相当于limit 0,N
N 取出条目
eg:
取ID第1-3的数据
SELECT * FROM testtablenew ORDER BY ID ASC LIMIT 2,3;
1.5.6 总结
编号 | 子句 | 说明 | 是否必须使用 |
---|---|---|---|
1 | select | 要返回的列或表示式 | 是 |
2 | form | 从中检索数据的表 | 仅在从表选择数据时使用 |
3 | where | 行级过滤 | 否 |
4 | group by | 分组说明 | 仅在按组计算聚集时使用 |
5 | having | 组级过滤 | 否 |
6 | order by | 输出排序顺序 | 否 |
7 | limit | 要检索的行数 | 否 |