利用select语句对列进行过滤检索

利用select语句对列进行过滤检索

1.单纯直接的检索表中的列(单列,多列,全部列)
2.对“单纯直接的检索表中的列” 的结果 排序输出 (order by)
3.带有简单过滤条件的检索表中的列(单值匹配,范围匹配,不匹配,null匹配)(where语句)
4.通过操作符实现更复杂过滤条件的检索表中的列 (利用AND,OR,NOT,IN操作符来组合简单的where过滤条件)

1.单纯直接的检索表中的列(单列,多列,全部列)

select语句:
用途是从一个或者多个表中检索信息。
​检索信息至少需要两条信息:想检索什么 和 从哪里检索。

1.1)检索单个列

select <列名或者叫header> from <数据表名>; 
# 表示从 数据表名 中检索一个名为 列名 的列。
# 输出结果将会是那个列的所有数据,由于这里没有明确排序查询结果,则返回的数据的顺序没有任何意义或者规律。
# sql 语句不区分大小写,但可以自我养成习惯,以增加程序可读性
# sql 将忽略语句中的所有空格,所以可以转行写

1.2)检索多个列

select 列名1,列名2,列名3 from 数据表名; # 从同一个表中检索多个列,select语句结构不变,只是多加几个列名,之间用逗号分开。
# sql 语句检索返回的是无格式的数据,对数据进行某种格式规范是一种表示的问题,而不是检索的问题。

1.3)检索所有列

select * from 数据表名; # 上述两种是指定返回所需的列,这里是自动检索一个数据表中所有的列。使用通配符*可以完成任务。
# 同样这里列之间的顺序也没有意义
# 对于通配符的表示要慎重,因为这样可能导致检索不需要的列而降低性能。
# 使用通配符的好处在于可以检索出未知的列。		

1.4)检索不同的行

在表中,同一个id可能重复多次出现,比如说数据表记录着本月支出,可能在同一个id处多次消费,那么按照上面的检索出的会多次反复出现,现在想要每个id只出现一次的话:

select distinct 列名 from 数据表名; # 这里的关键字distinct告诉MySQL只返回不同的列名就可以。
# 一般这种用法只对一个列名有效,若是select后面跟两个列名,大多数的情况下所有行都会检索出来。

1.5)检索部分行

不加限制的select语句会返回所有匹配的行,现在为了返回某一行或者前几行,使用limit语句。

select 列名 from 数据表名 limit 5; # 本句表示返回不多于前5行
select 列名 from 数据表名 limit 4,5; # 本句表示返回从行4开始的5行,注意,数据表的第一行为行0
# 当limit给出的范围过大,行数不够,填不满这个范围时,能返回多少就返回多少

1.6)使用完全限定的表名

之前基本上是针对一个数据库的一个数据表中的检索,这在涉及不同数据表 的检索中会用到
​在遇到不同的数据库和数据表存在时,可以加以限定

select 数据表名.列名 from 数据表名;
select 数据表名.列名 from 数据库.数据表名;

2.对“单纯直接的检索表中的列” 的结果 排序输出 (order by)

2.1)按某一个列的字母顺序排序

之前的检索方法,返回的数据的顺序其实是 数据在底层表中出现的 顺序显示,可能是最开始输入的顺序,但如果后来进行过更新/删改的话,
​则会改变顺序,因为此过程未知,所以返回的数据的顺序无意义。

select 列名1 from 数据表名 order by 列名2; # 这里表明按照列名2的数据的字母顺序来检索并返回列名1的数据
# 列名1和列名2可以相同也可以不相同
# 这里介绍概念子句(clause), from xx 和 order by xxx 都是子句

2.2)按多个列排序

select 列名1 from 数据表名 order by 列名2,列名3; 
# 这里表明 先用列名2的数据的字母顺序对列名1的数据进行排序,当列名2中字母相同时,再用列名3的字母顺序进行排序
# 假设列名2中所有值都是唯一的,那么根本不会用到列名3
# 列名1可以出现在列名2,列名3中,但列名2与列名3一般不相同

2.3)指定排序方向

默认的排序方向时升序排序,但也可以指定为降序排序,这里要用到desc关键字。

select 列名1,列名2 from 数据表名 order by 列名3 desc; # 按照列名3的降序排列
select 列名1,列名2 from 数据表名 order by 列名3 desc, 列名4; # 按照列名3的降序排,若出现一样,则按照列名4的升序排列

2.4)排序的用法之一:找最值

select 列名1 from 数据表名 order by 列名2 desc limit 1; # 找到列名2的最大值对应的列名1

3.带有简单过滤条件的检索表中的列(单值匹配,范围匹配,不匹配,null匹配)(where语句) 以及

4.通过操作符实现更复杂过滤条件的检索表中的列 (利用AND,OR,NOT,IN操作符来组合简单的where过滤条件)

数据库往往很大,一般不会检索所有的行,而是根据一定条件筛选出一些,那么就要设定过滤条件filter condition了。
这里就要用到where语句,where子句中会指定过滤条件,where跟在from之后。
过滤条件:

# = 等于
# != 不等于
# <> 不等于
# < 小于;<= 小于等于
# > 大于;>= 大于等于
# between 在指定的两个值之间

用例子来说明用法

# 筛选出prod_price=2.50的 prod_name和 prod_price并返回
select prod_name, prod_price from products where prod_price=2.50; 

# where 一定要放在ordey by 之前,意味着要先筛选再排序,否则会出问题
select prod_name, prod_price from products where prod_nmae="fuses"; # sql 不区分大小写 所以Fuses也符合要求
select prod_name, prod_price from products where prod_price<10;
select prod_name, prod_price from products where prod_price!=2.50;
select prod_name, prod_price from products where prod_price<>2.50;

# 表示范围在5到10之间的都可以
# 使用between一定要设置两个值,一个最小值一个最大值,两个值用and来连接,这种写法是包含两个极端值在内的
select prod_name, prod_price from products where prod_price between 5 and 10; 

# 用于检查是否有空值null的
select prod_name, prod_price from products where prod_price is null; 
### 这里值得注意的是,如果设立过滤条件 !=5 的话,null是不符合条件的,因为是空值,数据库不知道它是否匹配,所以要单独考虑null

### where 的过滤条件可以连接起来使用,这里就会用到操作符 operator
# and 操作符
select prod_name, prod_price from products where prod_price=2.50 and vend_id=1003; # 表示要同时符合这个条件
# or 操作符
select prod_name, prod_price from products where prod_price=2.50 or vend_id=1003; # 表示符合一个就可以
# and 与 or 同时使用的时候, 记得用括号来规定先后顺序
select prod_name, prod_price from products where (vend_id=1002 or vend_id=1003) and prod_price=2.50; 
# in 操作符
# in 关键字可以用括号表示出范围,极端值也包含,好处在于方便并且在 in 的范围中可以包含其他的 select语句
select prod_name, prod_price from products where vend_id in (1002,1003) order by prod_name;
# not 相当于取反,往往与in 连在一起用非常方便
select prod_name, prod_price from products where vend_id not in (1002,1003) order by prod_name;
上一篇:线性筛


下一篇:CF891E Lust