二 数据查询

1 SELECT语句

SELECT语句由以下列表中所述的几个子句组成:

  • SELECT之后是逗号分隔列或星号(*)的列表,表示要返回所有列。
  • FROM指定要查询数据的表或视图。
  • JOIN根据某些连接条件从其他表中获取数据。
  • WHERE过滤结果集中的行。
  • GROUP BY将一组行组合成小分组,并对每个小分组应用聚合函数。
  • HAVING过滤器基于GROUP BY子句定义的小分组。
  • ORDER BY指定用于排序的列的列表。
  • LIMIT限制返回行的数量。
SELECT
<字段列名>
FROM <表 1>, <表 2>…
WHERE <表达式>
GROUP BY <group by definition>
HAVING <expression> [{<operator> <expression>}…]]
ORDER BY <order by definition>
LIMIT[<offset>,] <row count>

2 列的选择与指定

2.1 选择指定的列

select 列 from 表名

2.2 定义并使用列的别名

select A列 A列别名,B列 B列别名 from 表名

2.3 替换查询结果集中的数据

select 

case 
 where 条件1 then 表达式1
 where 条件2 then 表达式2

else 表达式
end 列名称

from 表名

2.4 计算列值

select

列作计算

from 表名

2.5 聚合函数

常用聚合函数
函数名称 作用
MAX(column) 某列的最低值(有则不会返回NULL,没有则返回NULL)
MIN(column) 某列的最高值(没有则返回NULL)
COUNT(column) 某列的行数(不包括 NULL 值)
COUNT(*) 被选列行数(包括NULL)
SUM(column)
AVG(column) 平均值

3 FROM子句与多表连接查询

连接查询:将多张表连到一起进行查询(会导致记录数行和字段数列发生改变)

t_student学生表:scid、sname、cid

t_clazz班级表:cid、cname

3.1 交叉连接

交叉连接:将两张表的数据与另外一张表彼此交叉

原理

  1.  从第一张表依次取出每一条记录
  2.  取出每一条记录之后,与另外一张表的全部记录挨个匹配
  3.  没有任何匹配条件,所有的结果都会进行保留
  4.  记录数 = 第一张表记录数 * 第二张表记录数;字段数 = 第一张表字段数  + 第二张表字段数(笛卡尔积)

语法
基本语法:表1 cross join 表2;

应用
交叉连接产生的结果是笛卡尔积,没有实际应用。

交叉连接结果是笛卡尔积

左表的每条记录与右表的每条记录连接

SELECT * FROM t_student CROSS JOIN t_clazz ;

结果:15条记录

3.2 内连接

内连接:inner join,从一张表中取出所有的记录去另外一张表中匹配:利用匹配条件进行匹配,成功了则保留,失败了放弃。

原理
1、 从第一张表中取出一条记录,然后去另外一张表中进行匹配

2、 利用匹配条件进行匹配:

2.1 匹配到:保留,继续向下匹配

2.2 匹配失败:向下继续,如果全表匹配失败,结束

语法
基本语法:表1 [inner] join 表2 on 匹配条件;

  1. 如果内连接没有条件(允许),那么其实就是交叉连接(避免)
  2. 使用匹配条件进行匹配
  3. 因为表的设计通常容易产生同名字段,尤其是ID,所以为了避免重名出现错误,通常使用表名.字段名,来确保唯一性
  4. 通常,如果条件中使用到对应的表名,而表名通常比较长,所以可以通过表别名来简化
  5. 内连接匹配的时候,必须保证匹配到才会保存
  6. 内连接因为不强制必须使用匹配条件(on)因此可以在数据匹配完成之后,使用where条件来限制,效果与on一样(建议使用on)

应用
内连接通常是在对数据有精确要求的地方使用:必须保证两种表中都能进行数据匹配。

查询出两个表的共同部分

(笛卡尔积满足on条件的部分)

SELECT * FROM t_student s INNER JOIN t_clazz c ON s.`cid`=c.`cid`;

结果:4条记录

3.3 外连接

外链接:outer join,按照某一张表作为主表(表中所有记录在最后都会保留),根据条件去连接另外一张表,从而得到目标数据。

外连接分为两种:左外连接(left join),右外连接(right join)

左连接:左表是主表

右连接:右表是主表

原理

  1. 确定连接主表:左连接就是left join左边的表为主表;right join就是右边为主表
  2. 拿主表的每一条记录,去匹配另外一张表(从表)的每一条记录
  3. 如果满足匹配条件:保留;不满足即不保留
  4. 如果主表记录在从表中一条都没有匹配成功,那么也要保留该记录:从表对应的字段值都未NULL

语法
基本语法:

左连接:主表 left join 从表 on 连接条件;

右连接:从表 right join 主表 on连接条件;

左连接对应的主表数据在左边;右连接对应的主表数据在右边:

特点

  1. 外连接中主表数据记录一定会保存:连接之后不会出现记录数少于主表(内连接可能)
  2. 左连接和右连接其实可以互相转换,但是数据对应的位置(表顺序)会改变

应用
非常常用的一种获取的数据方式:作为数据获取对应主表以及其他数据(关联)

左外连接

查询出两个表的共同部分+属于左表不属于右表部分

SELECT * FROM t_student s LEFT JOIN t_clazz c ON s.`cid`=c.`cid`;

结果:5条记录

右外连接

查询出两个表的共同部分+属于右表不属于左表部分

SELECT * FROM t_student s RIGHT JOIN t_clazz c ON s.`cid`=c.`cid`;

结果:5条记录

4 where子句与条件查询

我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。

如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。

语法

以下是 SQL SELECT 语句使用 WHERE 子句从数据表中读取数据的通用语法:

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....

4.1 比较运算

 

符号

形式

作用

=

X1=X2

判断是否相等

<>或!=

X1<>X2或 X1!=X2

判断是否不相等

<=>

X1<=>X2

判断是否相等,可以判断是否相等NULL

>、>=

X1>X2 、X1>=X2

判断是否大于等于

<、<=

X1<X2 、X1<=X2

判断是否小于等于

4.2 判断范围

符号

形式

作用

BETWEEN AND或

NOT BETWEEN

X1 BETWEEN m

AND n

判断是否在范围内

IN 或NOT IN

X1 IN(值1…)

判断是否在,某一个固定范围内

4.3 判断空值

符号

形式

作用

IS NULL或IS NOT

 NULL

X1 IS NULL

X1 IS NOT NULL

判断是否等于NULL

4.4 子查询

IN子查询

结合关键字 IN 所使用的子查询主要用于判断一个给定值是否存在于子查询的结果集中。其语法格式为:

<表达式> [NOT] IN <子查询>

语法说明如下。

  • <表达式>:用于指定表达式。当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回的值正好相反。
  • <子查询>:用于指定子查询。这里的子查询只能返回一列数据。对于比较复杂的查询要求,可以使用 SELECT 语句实现子查询的多层嵌套。

比较运算符子查询

比较运算符所使用的子查询主要用于对表达式的值和子查询返回的值进行比较运算。其语法格式为:

<表达式> {= | < | > | >= | <= | <=> | < > | != }
{ ALL | SOME | ANY} <子查询>

语法说明如下。

  • <子查询>:用于指定子查询。
  • <表达式>:用于指定要进行比较的表达式。
  • ALLSOME 和 ANY:可选项。用于指定对比较运算的限制。其中,关键字 ALL 用于指定表达式需要与子查询结果集中的每个值都进行比较,当表达式与每个值都满足比较关系时,会返回 TRUE,否则返回 FALSE;关键字 SOME 和 ANY 是同义词,表示表达式只要与子查询结果集中的某个值满足比较关系,就返回 TRUE,否则返回 FALSE。

EXIST子查询

关键字 EXIST 所使用的子查询主要用于判断子查询的结果集是否为空。其语法格式为:EXIST <子查询>

若子查询的结果集不为空,则返回 TRUE;否则返回 FALSE。

5 GROUP BY 子句与分组数据

group by:对select查询出来的结果集按照某个字段或者表达式进行分组,获得一组组的集合,然后从每组中取出一个指定字段或者表达式的值。

6 WHVING 子句

having:用于对where和group by查询出来的分组经行过滤,查出满足条件的分组结果。它是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作。

7 ORDER BY 子句

排序

8  LIMIT 子句

分页

发布了53 篇原创文章 · 获赞 768 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/tangcv/article/details/102632882