MySQL单表查询详细解析

一、关键字的执行优先级

  1,from:找到表

  2,where:拿着where指定的约束条件,去文件/表中取出一条条数据

  3,group by:将取出的一条条数据进行分组,如果没有group by,则整体作为一组

  4,having:将分组的结果进行having过滤

  5,select:执行select

  6,distinct:去重

  7,order by:将结果按条件排序

  8,limit:限制结果的显示条数

二、去重,四则运算,自定义显示

#避免重复DISTINCT
  SELECT post FROM employee;#直接这样查询我们会看到很多重复的内容,我只想看一下有哪些职位,那么多重复的内容是没用的,所以我们加一个去重的功能,叫做distinct
  SELECT DISTINCT post FROM employee;  #对查询出来的记录进行去重,如果post职位有重复的,就会被剔除,剩下不重复的内容,注意,因为我们查询出来的记录里面只有一个字段post,才会根据post来进行去重
  SELECT DISTINCT post,salary FROM employee;#但是如果这样写,你会发现,貌似没有起到根据post来去重的效果,因为你的去重条件变成了post和salary两个字段的数据,只有他俩合起来是一个重复记录的时候才会去重  #通过四则运算查询
    SELECT name, salary*12 FROM employee; #查询每个人的年薪,月薪我们有记录,查年薪呢?简单的乘以12就可以了,from 库.表的时候,我们已经通过use 库名;来指定了库了,所以from的时候直接写from 表,就行了
    #你会发现,结果是出来了,但是我们的那个薪资的字段名变成了salary*12,是因为我们通过查询语句查询出来的也是一张表,但是这个表是不是内存当中的一个虚拟表,并不是我们硬盘中存的那个完整的表,对吧,虚拟表是不是也有标题和记录啊,
既然是一个表,我们是可以指定这个虚拟表的标题的,通过as+新字段名来指定
    SELECT name, salary*12 AS Annual_salary FROM employee; #as + 新字段名,就是起一个别名的意思,上面的那个salary*12的字段名也是一个别名,只不过不直观,是MySQL自动给你写上的
  #除了乘法以外,加减乘除都是可以的
#自定义显示格式,自己规定查询结果的显示格式
  CONCAT() 函数用于连接字符串
  SELECT CONCAT('姓名: ',name,'  年薪: ', salary*12)  AS Annual_salary  #我想让name这个字段显示的字段名称是中文的姓名,让salary*12显示的是中文的年薪,
  FROM employee;#看结果:通过结果你可以看出,这个concat就是帮我们做字符串拼接的,并且拼接之后的结果,都在一个叫做Annual_salary的字段中了
    +---------------------------------------+
    | Annual_salary                        |
    +---------------------------------------+
    | 姓名: egon  年薪: 87603.96            |
    | 姓名: alex  年薪: 12000003.72        |
    | 姓名: wupeiqi  年薪: 99600.00        |
    | 姓名: yuanhao  年薪: 42000.00        |
    .....
      +---------------------------------------+
  SELECT CONCAT('姓名: ',name,'  年薪: ', salary*12)  AS Annual_salary,CONCAT('性别:',sex) from employee;#还可以这样分成两列  
  CONCAT_WS() 第一个参数为分隔符来进行字符串拼接
  SELECT CONCAT_WS(':',name,salary*12)  AS Annual_salary from employee; #通过冒号来将name和salary连接起来#上面这个效果我们也可以通过concat来实现:SELECT CONCAT(name,':',salary*12)  AS Annual_salary from employee;

三、where约束

  1,比较运算符:> < >= <= <> !=

  2,between 80 and 100

  3,in(80,90,100)

  4,like 'ee%' 模糊匹配,%表示任意多字符,_表示一个字符

  5,逻辑运算符:在多个条件直接可以用逻辑运算符 and or not

#1:单条件查询
    SELECT name FROM employee WHERE post='sale';  #注意优先级,我们说where的优先级是不是比select要高啊,所以我们的顺序是先找到这个employee表,然后按照post='sale'的条件,然后去表里面select数据
#2:多条件查询
    SELECT name,salary FROM employee WHERE post='teacher' AND salary>10000;
#3:关键字BETWEEN AND 写的是一个区间
    SELECT name,salary FROM employee  WHERE salary BETWEEN 10000 AND 20000; #就是salary>=10000 and salary<=20000的数据
    SELECT name,salary FROM employee  WHERE salary NOT BETWEEN 10000 AND 20000; #加个not,就是不在这个区间内,薪资小于10000的或者薪资大于20000的,注意没有等于,
#4:关键字IS NULL(判断某个字段是否为NULL不能用等号,需要用IS) 判断null只能用is
    SELECT name,post_comment FROM employee WHERE post_comment IS NULL;
    SELECT name,post_comment FROM employee WHERE post_comment IS NOT NULL#5:关键字IN集合查询
    SELECT name,salary FROM employee WHERE salary=3000 OR salary=3500 OR salary=4000 OR salary=9000 ; #这样写是不是太麻烦了,写一大堆的or,下面我们用in这个简单的写法来搞
    SELECT name,salary FROM employee WHERE salary IN (3000,3500,4000,9000) ;
    SELECT name,salary FROM employee WHERE salary NOT IN (3000,3500,4000,9000) ;
#6:关键字LIKE模糊查询,模糊匹配,可以结合通配符来使用
    通配符’%’  #匹配任意所有字符
    SELECT * FROM employee WHERE name LIKE 'eg%';
    通配符’_’  #匹配任意一个字符 
    SELECT * FROM employee WHERE name LIKE 'al__'; #注意我这里写的两个_,用1个的话,匹配不到alex,因为al后面还有两个字符ex。

四、分组查询group by

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/34f0549a99587d68ae96b99577fef50b.html