【MYSQL】基础SQL语句总结(三)筛选记录基本用法

【SQL语句】 - 查

本文主要介绍一些基本的关于SQL语句中查询方面的一些语句和关键字。

查询语句基本语法: SELECT * FROM tablename [WHERE CONDITION];

查询最简单的方式就是将表中的所有记录都查询出来。

select * from emp;

星号*就代表要将所有的字段都筛选出来,也可以用字段名加上逗号分隔的方式查询想要查询的字段,如:
select field1, field2 from tablenam;

在具体的应用中我们需要的往往不是所有的记录,而是符合我们条件的记录,下面是筛选记录的一些基本用法:

1、DISTINCT 查询不重复的字段

查询 field1 不重复的所有记录

select distinct field1 from table1;

2、WHERE CONDITION 条件查询

查询所有 age 等于 20 并且 sex 为 0 的记录:

select * from table1 where age = 20 and sex = 0;

where关键字后面是一个条件或多个条件,可以由字段和 > , < , >= , <= , != 等比较运算符组成,多个条件可以由 or , and 等逻辑运算符进行组合。


3、排序 ORDER BY 和限制 LIMIT

ORDER BY : 
SELECT * FROM tablename [WHERE CONDITION] [ORDER BY field1 [DESC | ASC ], field2 [DESC | ASC]];

上面是排序的基本语法,其中DESC和ASC是排序顺序的关键字,DESC代表降序排列,ASC代表升序排列,如果不加这个关键字,缺省默认为ASC升序排列。ORDER BY 后面可以也可以跟多个字段,比如按照 age 从小到大,score 从大到小排列:

select * from student order by age asc, score desc;

当 age 值一样的时候,就会按照 score 进行排序。如果是只排一个或者多个字段的值都相等,则这些记录会无序排列。


(MySQL) LIMIT: 

limit关键字用来控制排序查询出来的记录数目,当我们需要将排序后的记录进行部分截取的时候,就可以使用limit:
SELECT ... [LIMIT offset_start, row_count] 

offset_start 是需要截取的起始偏移量,row_count 指从起始偏移量截取的记录个数,offset_start 字段可以缺省,缺省默认为从0开始。

select * from table1 order by score desc limit 6, 10;
-- 缺省起始偏移量
select * from table1 order by score desc limit 3;

4、聚合

语法:
SELECT [field1, field2, ... , fieldn] fun_name
FROM tablename
[WHERE where_condition]
[GROUP BY field1, field2, ... , fieldn]
[WITH ROLLUP]
[HAVING where_condition]
· func_name 表示要做的聚合操作,也就是聚合函数,常用的有:sum(求和),count(*) (统计数量),max(最大值),min(最小值)
· GROUP BY 表示要进行分类的字段,order by field1 按 field1 字段分类
· WITH ROLLUP 表示是否对进行分类过后的结果进行再次汇总
· HAVING 表示对分类后的结果再进行条件过滤

having 和 where 的区别在于,having 是对聚合后的结果进行条件过滤,而where是在聚合前就对记录进行过滤,如果逻辑允许,应尽可能用where先过滤记录,这样因为结果集减小,将对聚合的效率大大提高,最后再根据逻辑看是否需要用having进行再过滤。

5、表连接

当我们需要同事查询除多个表的字段时,就需要用到表连接。表连接可以分为内连接和外连接,内连接和外连接最主要的区别是:内连接仅选出两张表中互相匹配的记录,而外连接则会选出其他不匹配的记录。

内连接:

select table1_field1, table2_field1 from table1, table2 where table1.field2 = table2.field2;

外连接又分为左连接和右连接。

· 左连接:包含所有左边表中的记录甚至是右边表中没有和它匹配的记录。

select table1_field1, table2_field1
from table1 left join table2
on table1_field2 = table2_field2;

上述语句就是通过left join ... on ... 左连接语句来查询 满足条件 table1 中的 field2 字段等于 table2 中的 field2 字段的记录,并显示记录中 table1 中的 field1 字段和 table2 中的field1 字段,包括不满足条件的 table1 中的记录。

· 右连接:包含所有右边表中的记录甚至是左边表中没有和它匹配的记录。

select table1_field1, table2_field1
from table1 right join table2
on table1_field2 = table2_field2;
而这个语句则是通过 right join ... on ... 左连接语句来查询 满足条件 table1 中的 field2 字段等于 table2 中的 field2 字段的记录,并显示记录中 table1 中的 field1 字段和 table2 中的field1 字段,包括不满足条件的 table2 中的记录。


6、子查询

当查询的时候,需要用到的条件是另一个查询语句的结果,这时候就用到子查询。常用的关键字主要包括 in,not in,=,!=,exists、not exists 等。

主要语法为:

SELECT ... WHERE ... [ IN ] [ NOT IN ] [ = ] [ != ] [ EXISTS ] [ NOT EXISTS ] ( SELECT ... );

后面的括号中为子查询语句,需要注意的是 =,!= 这两个关键字必须要子查询的结果是唯一的。


7、联合

联合有两个用法:union all,union。

SELECT ... 

UNION ALL

SELECT ... ;

UNION ALL 合并两个查询语句的结果集,不去重,如果两条语句都查询出了某一条记录,则 UNION ALL 联合后的结果集会有两条这个记录。


SELECT ...

UNION

SELECT ... ;

UNION 也是合并结果集,但是是去重的,如果两条语句都查询出了某一条记录,则 UNION 联合后的结果集只会有一条这个记录。


以上就是一些基本 sql 查语句的用法,后面几个都没有写例子,而且仅仅看例子也不会有很深的理解。要掌握还是要进行练习,近来发现LeetCode上不仅有算法题,还有一些数据库的题,可以通过做那个题目来加深对SQL语句的掌握。上面还有很多其他的题目,shell 等其他的。LeetCode 真是一个不错的网站。

你可能感兴趣的:(【数据库】)