day3 -- select语句学习

本文介绍了如何使用SQL中的SELECT语句进行数据检索,包括选择特定列、过滤操作、排序以及使用通配符和正则表达式进行复杂搜索。还详细讲解了WHERE子句、ORDERBY子句以及如何处理NULL值和使用IN、BETWEEN等操作符。

数据库和表的准备

  • 下载《mysql必知必会》提供的脚本用于创建样例表
cd /mnt/d/unix_dir
wget https://forta.com/wp-content/uploads/books/0672327120/mysql_scripts.zip
unzip mysql_scripts.zip
  • 运行对应的脚本创建样例表
create database crashtest;
show databases;
use crashtest;
source /mnt/d/unix_dir/create.sql;
source /mnt/d/unix_dir/populate.sql;
show tables;
desc customers;

在这里插入图片描述
在这里插入图片描述

select

SQL语句是由简单的英语单词构成的。这些单词称为关键字,每个SQL语句都是由一个或多个关键字构成的。
大概,最经常使用的SQL语句就是SELECT语句了。它的用途是从一个或多个表中检索信息。

为了使用SELECT检索表数据,必须至少给出两条信息——想选择什么,以及从什么地方选择
SQL 语句不区分大小写,通常大家把关键字大写
在处理SQL语句时,其中所有空格都被忽略

# 从products表中检索一个名为 prod_name的列
select prod_name from products; 

# 选择多列,列名之间逗号分隔,最后一个列名不需要加入逗号
select prod_id,prod_name,prod_price from products;

# 选择所有列,使用通配符可能会使检索输出的列位置和实际表中的位置不符
select * from products;

# 使用DISTINCT关键字 此关键字指示MySQL只返回不同的值,类似于 程序设计语言种的 unique
select distinct vend_id from products;

# LIMIT 5指示MySQL返回 不多于5行,检索位置靠前的行被返回
select * from products limit 5;
# LIMIT 5, 5指示MySQL返回从行5开始的5行
select * from products limit 55;
# or 从第四行检索,返回最多5行
select * from products limit 5 offset 4;

# 限定表名和数据库名
# products.prod_name 限定了那个表的哪一列
# crashtest.products 限定了哪个数据库的哪一个表
select products.prod_name from crashtest.products

select + order by

# 从products表中检索一个名为 prod_name的列并排序
select prod_name from products order by prod_name;

# 从products表中检索一个名为 prod_name的列并按照降序排序
select prod_name from products order by prod_name desc;
# 降序还可以这样用
# 先根据 prod_id降序,再根据prod_price升序
select prod_id,prod_name,prod_price from products order by prod_id desc,prod_price;

# 用非检索列排序,也是合法的
select prod_name from products order by prod_id;

# 选择多列,列名之间逗号分隔,最后一个列名不需要加入逗号
# 同时根据多列数据进行排序,列名之间需要逗号隔开
select prod_id,prod_name,prod_price from products order by prod_id,prod_name,prod_price;

# 多个子句的组合,先选再排最后输出
select prod_name from products order by prod_id limit 1

select + where

NULL 无值(no value),它与字段包含0、空字符串或仅仅包含空格不同
因为未知具有 特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤 或不匹配过滤时不返回它们

# 选择 prod_price列中等于2.5的数据
select prod_price from products where prod_price = 2.5;
# mysql> select prod_price from products where prod_price == 2.5; 将会报错

# 在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后, 否则将会产生错误
select prod_price from products where prod_price = 2.5 order by prod_name;

# MySQL在执行匹配时默认不区分大小写
select prod_price,prod_name from products where prod_name = "fuses";

# between and 关键字实现区间选取
select prod_price,prod_name from products where prod_price between 5 and 10 ;

# 检查空值 NULL需要特殊的语句
select prod_price,prod_name from products where prod_price IS NULL ;

select + 高级过滤操作

AND 用在WHERE子句中的关键字,用来指示检索满足所有给定 条件的行
OR操作符与AND操作符不同,它指示MySQL检索匹配任一条件的行
AND / OR操作符可以任意次数的组合但是 AND的计算次序优先级更高 <== 结合序问题 <== 使用圆括号括起来解决

# AND / OR 连接组合where 子句
select prod_price,prod_name from products where prod_price IS NULL AND prod_name = "fuses";
select prod_price,prod_name from products where prod_price IS NULL OR prod_name = "fuses";

select prod_price,prod_name from products where (prod_price IS NULL OR prod_name = "fuses") AND prod_id >= 1000;

# 区别与betwenn and ,IN操 作符后跟由逗号分隔的合法值清单,整个清单必须括在圆括号中。
SELECT prod_name,prod_price FROM  products WHERE vend_id IN (1002,1004) ORDER BY prod_name;

# WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件 ⇐  == 取反操作
SELECT prod_name,prod_price FROM  products WHERE vend_id NOT IN (1002,1004) ORDER BY prod_name;

使用通配符进行过滤

为在搜索子句中使用通配符,必须使用LIKE操作符。
LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。

最后需要注意的是,通配符并不是完全意义上的通配,至少它不匹配 NULL。

# 通配符是百分号(%),表示任何字符出现 任意次数  <== 和unix中的正则表达式有区别呀
# 找出所有以词jet起头的产品,%告诉MySQL接受jet之后的任意字符
SELECT prod_name,prod_price FROM  products WHERE prod_name LIKE "jet%";

# 匹配任何位置包含文本jet的值,而不论它之前或之后出现什么字符
SELECT prod_name,prod_price FROM  products WHERE prod_name LIKE "%jet%";

# 通配符也可以出现在搜索模式的中间
SELECT prod_name,prod_price FROM  products WHERE prod_name LIKE "je%t";

# 下划线(_)。下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符
SELECT prod_name,prod_price FROM  products WHERE prod_name LIKE "_jet";
  • 正如所见, MySQL的通配符很有用。但这种功能是有代价的:通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长
  • 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符
  • 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的
  • 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据

使用正则表达式进行搜索

个人认为 LIKE 进行的通配符检索和正则很像,
主要区别是 LIKE 后面接的是 ^pattern$ 这种形式,却写作 pattern <= 隐式表达
正则的pattern 则需要手动指定 定位符 ^ pattern $ <= 显示表达

# 下面的语句检索列prod_name包含 文本1000的所有行
SELECT prod_name,prod_price FROM  products WHERE prod_name REGEXP "1000" ORDER BY prod_name;

# 正则表达式中的特殊字符,比如 . 表示任意且切实存在的一位字符
SELECT prod_name,prod_price FROM  products WHERE prod_name REGEXP ".000" ORDER BY prod_name;

# 正则表达式中的 OR,它表示匹配其中之一,因此1000和2000都匹配并返回
SELECT prod_name,prod_price FROM  products WHERE prod_name REGEXP "1000|2000";

# 只想匹配特定的字符,可通过指定一组用[和]括起来的字符来完成
# [123]定义一组字符,它的意思是匹配1或2或3
SELECT prod_name,prod_price FROM  products WHERE prod_name REGEXP "[12]000";

# 字符集合的取反操作
SELECT prod_name,prod_price FROM  products WHERE prod_name REGEXP "[^12]000";
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值