SQL语句之高级篇

SQL语句之高级篇

从本篇开始开始介绍SQL语句一些高级组合知识,事实上这些东西也只是对前面的单独内容的一个组合运用。其目的是深入理解SQL语句的内层含义。

目录
  1. 分组查询

  2. 排序查询

  3. 多表查询

  4. 别名概念


  1. SQL语句之分组查询

在数据库当中有时候查询数值时候需要用到分组的概念(例如查询"每个、每人"这样的概念的时候)

在这个时候就需要用到分组查询。

其作用是根据一个或多个列对结果集进行分组

分组查询语法:(关键字:group by)

select column_name1 from table_name group by column_name2;

(当然也可以通过column_name1进行分组)

分组查询接条件查询:

看到这里可能会有初学者认为这个是一个简单的语句,只需要在group by后面接一个where子句查询即可(因为我之前也是这样想的~~)但是现实总是不能如愿。

分组查询后接条件查询要用到新的关键字:having

分组查询接条件查询的语法:

select column_name from table_name group by column_name2 having column_name;

那么这里需要注意三个点:

  1. where子句与having子句的区别

  2. having子句的位置

  3. where子句的位置


  1. where子句与having子句的区别:

主要有两个区别:

1、having子句要接在group by后,且having子句的过滤条件要在select语句当中出现过

2、where子句后不能接聚合函数,having子句后可以接聚合函数

(这里涉及到新概念:聚合函数。后面会拿出单独一篇来详细介绍聚合函数)

  1. having子句的位置:

在介绍where子句与having子句的区别的时候就已经说了having子句要接在group by之后。

  1. where子句的位置:

where子句接在group by之前。


  1. 排序查询

排序查询指的是对结果集进行排序进行查询。

关键词:order by

这里要注意的是:order by查询默认对结果集进行升序查询,还可以引用其他关键词对结果集进行升序或者是降序查询。

关键词:

asc:升序

desc:降序(因为降序会用在排序查询当中所以前面提到的查询字段信息的时候不建议使用desc table_name;)

排序查询语法:

select column_name from table_name order by column_name asc;

select column_name from table_name order by column_name desc:


知识补充:

有时候我们需要查询前几名的信息,例如成绩表查询第2到第4名的成绩,这个时候就要运用到排序+过滤的知识。

整个查询的逻辑是:先对表格信息进行降序排列,然后筛选出第2到第4名的信息。

select * form table_name(成绩表) order by column_name(成绩) limit 1,3;

这里面用到了limit语句。

limit语句的作用

用于返回的记录的数目

limit语句的语法:

select column_name from table_name limit x,y;

其中:

x:偏移量可以理解为以第几行为零,从一(这个时候的一就是零的下一行)开始

y:显示y行信息

(这里就可以理解上面的语句为什么是limit 1,3而不是limit 2,4了)


  1. 多表查询

什么是多表查询?

有时候我们查询数据的时候需要查询的字段不一定在一个表格内,所以要使用多表查询。

多表连接查询

既然是多表连接查询很容易就会联想到能一起查询的表一定有他们的关联之处。这一点一般开发人员在建立表格的时候都会通过主键和外键的方式简历表格的联系。

多表查询的方式:

(1)内连接:(关键词:join inner join)

内连接是指:将一张表格作为主表,另一张表格作为副表进行查询。

查询出的结果是两张表格内容的交集(都有的字段名和字段值)

(2)左连接:(关键词:left join)

左连接是指:将一张表格作为主表,在其右边插入副表格进行查询。

查询出的结果是主表的全部内容以及副表当中与主表内容相匹配的内容

(3)右连接:(关键词:right join)

右连接是指:将一张表格作为主表,在其左边插入副表格进行查询。

查询出的结果是主表的全部内容以及副表当中与主表内容相匹配的内容

多表查询的语法:

select table1.column_name,table2.column from table1,table2;

其实这样就已经写出了一个多表查询的语句,但是这个语句查询出的结果集会有一个问题就是会有很多结果。具体原因可以百度"布尔乘积现象"

要消除这种现象:

select table1.column_name,table2.column from table1,table2 where table1.关系字段=table2.关系字段;

多表连接查询的语法:

(1)内连接:

select table1.column_name,table2.column_name from table1 inner join table2 where table1.关系字段=table2.关系字段;

上面语句等价于:

select table1.column_name,table2.column_name from table1 join table2 where table1.关系字段=table2.关系字段;

这个语句在join后就用了where,所以后面如果要过滤信息就不想要在使用where而是直接加条件即可。(后面可接group by在接having进行查询)

(2)左连接:

select table1.column_name,table2.column_name from table1 left join table2 on table1.关系字段=table2.关系字段;

这个语句后面可以跟where子句进行信息过滤。

(3)右连接:

select table1.column_name,table2.column_name from table1 right join table2 on table1.关系字段=table2.关系字段;

这个语句后面可以跟where子句进行信息过滤。


  1. 别名概念:

别名就是在结果集中加入一个新字段名,在原表中不存在。

语法:(关键字:as)

select column_name as A from table;

原文地址:https://www.cnblogs.com/JunkingBoy/p/14020499.html