MySQL - 常用的查询语句 --- select 案例

借鉴:https://www.cnblogs.com/progor/p/8786133.html

 

先给一下完整的语法,后面将逐一来讲解。

基础语法:select 字段列表 from 数据源;

完整语法:

SELECT DISTINCT <select_list> AS 别名                     

FROM <left_table> <join_type> JOIN <right_table> ON <on_predicate>

WHERE <where_predicate>

GROUP BY <group_by_specification>

HAVING <having_predicate>

ORDER BY <order_by_list>

LIMIT n, m

 

这就是select 的完整语法了,所有的查询都是由这些组合而成。

 

然后就是 SELECT 语句的处理过程

  1. FROM
  2. ON 
  3. JOIN 
  4. WHERE 
  5. GROUP BY 
  6. HAVING 
  7. SELECT
  8. DISTINCT 
  9. ORDER BY 
  10. LIMIT

 

1、去重选项

去重选项就是是否对结果中完全相同的记录(所有字段数据都相同)进行去重:

  • all (默认):不去重
  • distinct:去重

语法:select 去重选项 字段列表 from 表名;

示例:

去重前:    去重后:

CREATE TABLE `table_01` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  `pwd` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

insert into table_01 values(1,"血魔",123),(2,"血魔",234);

select name from table_01; select distinct name from table_01;

 

2、字段别名

  • 字段别名是给查询结果中的字段另起一个名字
  • 字段别名只会在当次查询结果中生效。
  • 字段别名一般都是辅助了解字段意义(比如我们定义的名字是name,我们希望返回给用户的结果显示成姓名)、简写字段名
  • 语法:select 字段 as 字段别名 from 表名;

示例:

起别名前    起别名后 

 

3、数据源

  • 事实上,查询的来源可以不是“表名”,只需是一个二维表即可。那么数据来源可以是一个select结果。
  • 数据源可以是单表数据源,多表数据源,以及查询语句
    • 单表:select 字段列表 from 表名;
    • 多表: select 字段列表 from 表名1,表名2,…; 【多表查询时是将每个表中的x条记录与另一个表y条记录组成结果,组成的结果的记录条数为x*y】【可以称为笛卡尔积】
  • 查询语句:select 字段列表 fromr (select语句) as 表别名;【这是将一个查询结果作为一个查询的目标二维表,需要将查询结果定义成一个表别名才能作为数据源】
  • 复制代码
    -- 示例
    select name from (select * from student) as d;

 

4、where 子句

  • where子句是用于筛选符合条件的结果的。

where几种语法:

    • 基于值:
    • = : where  字段 =值  ;查找出对应字段等于对应值的记录。(相似的,<是小于对应值,<=是小于等于对应值,>是大于对应值,>=是大于等于对应值,!=是不等于),例如:where name = 'lilei'
      • like:where 字段 like 值 ;功能与 = 相似 ,但可以使用模糊匹配来查找结果。例如:where name like 'li%'

基于值的范围:

      • in: where 字段 in 范围;查找出对应字段的值在所指定范围的记录。例如:where age in (18,19,20)
      • not in : where 字段 not in 范围;查找出对应字段的值不在所指定范围的记录。例如:where age not in (18,19,20)
      • between x and y :where 字段 between x and y;查找出对应字段的值在闭区间[x,y]范围的记录。例如:where age between 18 and 20。
    • 条件复合:
      • or : where 条件1 or 条件2… ; 查找出符合条件1或符合条件2的记录。
      • and:  where 条件1 and 条件2… ; 查找出符合条件1并且符合条件2的记录。
      • not : where not 条件1 ;查找出不符合条件的所有记录。
      • &&的功能与and相同;||与or功能类似,!与not 功能类似

 

  • where是从磁盘中获取数据的时候就进行筛选的。所以某些在内存是才有的东西where无法使用。(字段别名什么的是本来不是“磁盘中的数据”(是在内存这中运行时才定义的),所以where无法使用,一般都依靠having来筛选).
select name as n ,pwd from table_01 where name ="血魔";
-- select name as n ,pwd from table_01 where n ="血魔"; --报错

select name as n ,pwd from table_01 having n ="血魔";

 

5、group by

  • group by 可以将查询结果依据字段来将结果分组。
  • 语法:select 字段列表 from 表名 group by 字段;

固定格式写法

-- 也就是说,group by 字段名  在select 后面的子句必须要存在(且除了聚合函数外,不允许有其它字段),否则报错

select name, count(*)  as 数量 from table_01 group by name;

select name, pwd , count(*)  as  数量  from  table_01  group  by name,pwd;

select name,count(*)  as  数量 ,  pwd  from  table_01  group  by  name,pwd;

-- select * from table_01 group by name; -- 错误写法

 

  • 实际上,group by 的作用主要是统计(使用情景很多,比如说统计某人的总分数,学生中女性的数量。。),所以一般会配合一些统计函数来使用:
    • count(x):统计每组的记录数,x是*时代表记录数,为字段名时代表统计字段数据数(除去NULL)
    • max(x):统计最大值,x是字段名
    • min(x):统计最小值,x是字段名
    • avg(x):统计平均值,x是字段名
    • sum(x):统计总和,x是字段名
  • group by 字段 后面还可以跟上 asc 或 desc,代表分组后是否根据字段排序。

 

6、having

  • having功能与where类似,不过having的条件判断发生在数据在内存中时,所以可以使用在内存中才发生的数据,如“分组”,“字段别名”等。
  • 语法:select 字段列表 from 表名 having 条件;【操作符之类的可以参考where的,增加的只是一些“内存”中的筛选条件】
select name as n ,pwd from table_01 having n ="血魔";

select name,count(*)  as 数量 from table_01 group by name having count(*) > 1;

 

7、order by

  • order by 可以使查询结果按照某个字段来排序
  • 语法:select 字段列表 from 表名 order by 字段 [asc|desc];
    • 字段可以有多个,从左到右,后面的排序基于前面的,(比如:先按name排序,再按gender排序,后面的gender排序是针对前面name排序时name相同的数据)
    • asc代表排序是递增的
    • desc代表是递减的
    • 也可以指定某个字段的排序方法,比如第一个字段递增,第二个递减。只需要在每个字段后面加asc或desc即可(虽然默认不加是递增,但还是加上更清晰明确)。

 

select * from table_01 order by id;

select * from table_01 order by id desc;

 

 

8、limit

  • limit是用来限制结果数量的。与select 查询等配合使用时,可以限制匹配出的结果。但凡是涉及数量的时候都可以使用limit(这里只是强调limit的作用,不要过度理解)
  • 语法:select 字段列表 from 表名 limit [offset,] count;
    • count是数量
    • offset是起始位置,offset 默认从0开始,可以说是每条记录的索引号

示例

select * from table_01 limit 1;

select * from table_01 limit 1,3;

 

 

下面来看看一些具体场景用法吧。

posted @ 2021-12-03 23:50  血魔-杨司徒  阅读(327)  评论(0编辑  收藏  举报