深入浅出SQL(4)-SELECT语句

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baby_hua/article/details/81910361

该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动!

SELECT语句:取得精美数据包装里的数据

在数据库的世界里,取得数据的需求很可能与插入数据的需求一样多;

本章我们将见识到功能非常强大的SELECT语句,以获取到放在表里的重要信息;

还会学到如何利用WHERE AND OR选择数据,甚至可以过滤掉不用选择的数据;

在之前数据与表一章中,我们新建了my_contacts表;

    我们不能始终SELECT所有数据,想要获取符合条件的数据又该如何?

更好的SELECT:

    我们使用WHERE子句,他为RDNMS提过搜索的特定条件;

    有助于缩小结果,只会返回符合条件的行;

WHERE:告诉RDBMS软件,现在要用一些特殊条件进行搜索;

上述语句可以理解为:如果first_name列的值是Pat,就把整条记录显示给我看;

*究竟是什么:

    星号*告诉RDBMS返回表中的所有列;

    如果不想选出所有列,后续我们会学到如何挑选部分列;

新建一个测试数据库及表,并插入相应内容:

    示例数据库:

    CREATE DATABASE drinks;

    USE drinks;

    新建表:

CREATE TABLE easy_drinks 

( 

drink_name VARCHAR(50) NOT NULL, 

main VARCHAR(50) NOT NULL, 

amount1 DEC(4,2) NOT NULL DEFAULT 1, 

second VARCHAR(50) NOT NULL, 

amount2 DEC(4,2) NOT NULL DEFAULT 0, 

directions BLOB 

);

    查看新建的表结构:

    插入若干数据:

    查看新插入的若干条数据:

我们来尝试下下述SQL语句,有些看起来并不对:

上述示例:

    单引号用成双引号虽然运行了,但是请不要这样做;

         我们的SQL日后可能会和其他语言搭配使用如PHP,在有些编程语言中双引号是用来囊括SQL语句的;

    DEC变量的值加了单引号也能运行,但是请不要这样做;

        之所以可用是因为多数SQL RDBMS会自动省略多余的引号,把DEC和INT视为数字,而不会因为引号把这些值视为文本值;

原则上这两个查询都是错的,但是RDBMS原谅了他们;

如何查询数据类型:

    为了写入合格的(valid)WHERE子句,我们需要确认所用数据类型的正确格式;

    常用数据类型的格式惯例:

        DEC和INT不需引号,其他都需要引号;

更多的标点问题:

    如果一条SQL语句输入之后,没有结束,多加几个分号,想让查询结束,但没有效果;

    想必是语句中的某个单引号出了问题;

不成对的单引号:

    SQL期待收到成对的单引号;如果单引号总数是单数,SQL RDBMS还在等待能让程序结束的最后一个单引号;

    输入单引号和分号即可结束语句;

    错误提示会从多出单引号的地方开始;

单引号是特殊字符:

    单引号是SQL中的保留字符;

    如果需要插入包含单引号的文本数据,就必须对RDBMS进行说明:这些数据中的单引号并非表示文本结束,而是文本的一部分;

    在单引号前加上反斜线就能说明此效果;

帮引号 转义 的两种方式:

SELECT特定数据:

    我们已经知道如何SELECT所有带引号的数据类型,以及如何SELECT包含引号的数据;

    如何只SELECT需要看到的列,来缩小结果集;

SELECT特定列来限制结果数量:

    只选出想要的列就可以缩小可见的结果;

SELECT特定列以加快结果呈现:

小结:

1.如果需要所有列,一点能要使用*;只有在不需要太多列时,才需要逐一指出需要检索的列;

2.有时从Web粘来的语句执行查询的时候由于包含了外观空格,所以会报错,可在编辑器中重新编辑;

综合查询:

查找main是tonic water;second是pineapple juice 的所有饮品;

1)单独查询:SELECT drink_name,main FROM easy_drinks WHERE second = 'pineapple juice';

2)单独查询:SELECT drink_name,second FROM easy_drinks WHERE main = 'tonic water';

3)综合查询:SELECT drink_name FROM easy_drinks WHERE main = 'tonic water' AND second = 'pineapple juice’;

可以用AND同时处理两项查询;

    使用AND结合两个WHERE子句;

数值查询:

    检索包含1盎司以上soda的饮料:

    运用大于等于 运算符;

利用比较运算符取得数字数据:

    等于号:=;

    不等于:<>;

    大于:>;

    小于:<;

    大于等于:>=;

    小于等于:<=;

新建表drink_info 并填入数据;

CREATE TABLE drink_info

(

drink_name VARCHAR(50) NOT NULL,

cost DEC(4,2) NOT NULL DEFAULT 1,

carbs DEC(4,2) NOT NULL DEFAULT 0,

color VARCHAR(20),

ice CHAR(1) NOT NULL DEFAULT 'Y',

calories INT NOT NULL DEFAULT 0

);
INSERT INTO drink_info

(drink_name,cost,carbs,color,ice,calories)

VALUES

('Blackthorn',3,8.4,'yellow','Y',33),

('Blue Moon',2.5,3.2,'blue','Y',12),

('Oh My Gosh',3.5,8.6,'orange','Y',35),

('Lime Fizz',2.5 ,5.4,'green','Y',24),

('Kiss on the Lips',5.5 ,42.5,'purple','Y',171),

('Hot Gold',3.2 ,32.1,'orange','N',135),

('Lone Tree',3.6 ,4.2,'red','Y',17),

('Greyhound',4 ,14,'yellow','Y',50),

('Indian Summer',2.8 ,7.2,'brown'   ,'N',30),

('Bull Frog',2.6 ,21.5,'fan','Y',80),

('Soda and It',3.8 ,4.7,'red','N',19);

查看新建表的内容:

实践示例:

    从drink_info表中找到定价至少是3.5$、热量又少于50卡路里的饮料;

    每一种加冰,热量高于33卡路里的黄色饮料的价格;

    每一种碳水化合物低于4克而且加冰的饮料的名称和颜色;

    每一种热量大于或者等于80卡路里的饮料的价格;

    只会返回Greyhound和Kiss on the Lips的查询,并附上他们的颜色及调制时是否加冰,不要在你的查询中使用饮料名称;

对文本数据套用比较运算符:

    比较像CHAR和VARCHAR这样的文本字符串,运作方式和数字类似;

    比较运算符会按照字母顺序地评估所有事物的大小;    

    选出所有名称以’L’开头的饮料;

选出成分:

    如何选出包含樱桃汁的饮料?

    我们需要结合两组查询的方式;

OR,只要符合一项条件:

    两组查询可以用OR结合;结合后的条件会返回任何符合条件之一的记录;

别把AND和OR搞混了:

    需要所有条件都成立时,用AND;

    徐璈任何条件成立时,请用OR;

    可以在一个子句中使用AND和OR;

新建示例表 doughnut_ratings:(新建过程省略)

用IS NULL 找到NULL;

    有些查询查出了NULL:

    但是我们并不能直接选择NULL:

    利用关键字选择NULL:

    当然间接的查询其他非NULL的字段也可以查出上述结果;

    唯一直接选择NULL的方法就是利用关键字IS NULL;


续接》》》》》》

我们先来回顾下昨天我们新建的数据库、表及其内容:

USE drinks;

再看看另一个数据库中新建的一张表:

接下里开始今天的学习:(接下来不再使用图片)

对于esay_drinks表,如果想要获取配料使用果汁的饮料,我们会怎么写:

mysql> SELECT drink_name,main,second FROM easy_drinks WHERE

    -> main = 'cherry juice' OR 

    -> main = 'apple juice' OR

    -> second = 'pineapple juice' OR

    -> second = 'blueberry juice' OR

    -> second = 'lime juice' OR

    -> second = 'orange juice' OR 

    -> second = 'cherry juice' OR

    -> second = 'grapefruit juice';

+------------------+--------------+------------------+

| drink_name       | main         | second           |

+------------------+--------------+------------------+

| Blackthorn       | tonic water  | pineapple juice  |

| Blue Moon        | soda         | blueberry juice  |

| Oh My Gosh       | peach nectar | pineapple juice  |

| Lime Fizz        | Sprite       | lime juice       |

| Kiss on the Lips | cherry juice | apricot nectar   |

| Hot Gold         | peach nectar | orange juice     |

| Lone Tree        | soda         | cherry juice     |

| Greyhound        | soda         | grapefruit juice |

| Indian Summer    | apple juice  | hot tea          |

| Blackthorn's JU  | tonic water  | pineapple juice  |

+------------------+--------------+------------------+

10 rows in set (0.00 sec)

不得不说 这个使用OR链接查询条件的SQL语句 ‘又臭又长’,而且耗时,还容易打错写...;

节省时间就用关键字:LIKE

    使用关键字LIKE,配合通配符%,可查询部分文本字符串并返回所有匹配条件的行;

    在单引号中放入的百分号是用来替换非查询条件的字符的;

    新插入一条测试语句:

INSERT INTO easy_drinks

(drink_name,main,amount1,second,amount2,directions)

VALUES

('Blackthorn twice','tonic water',2,'pineapple juice tw',1,'stir with ice,strain into cocktail glass with lemon twist’);

使用LIKE 执行查询:

mysql> SELECT drink_name,main,second FROM easy_drinks

    -> WHERE main LIKE '%juice' 

    -> OR second LIKE '%juice%';

+------------------+--------------+--------------------+

| drink_name       | main         | second             |

+------------------+--------------+--------------------+

| Blackthorn       | tonic water  | pineapple juice    |

| Blue Moon        | soda         | blueberry juice    |

| Oh My Gosh       | peach nectar | pineapple juice    |

| Lime Fizz        | Sprite       | lime juice         |

| Kiss on the Lips | cherry juice | apricot nectar     |

| Hot Gold         | peach nectar | orange juice       |

| Lone Tree        | soda         | cherry juice       |

| Greyhound        | soda         | grapefruit juice   |

| Indian Summer    | apple juice  | hot tea            |

| Blackthorn's JU  | tonic water  | pineapple juice    |

| Blackthorn twice | tonic water  | pineapple juice tw |

+------------------+--------------+--------------------+

11 rows in set (0.00 sec)

    %juice:表示以juice结尾的字符串;

    %juice%:则表示包含juice的字符串;

调用通配符:

    %也是一种通配符,是实际存在于该处的字符的替身;

    ‘_’下划线是LIKE喜欢的第二个通配符:仅是一个未知字符的替身;

        用法和%通配符类似:

mysql> SELECT drink_name,main FROM easy_drinks 

    -> WHERE main LIKE '_oda';

+------------+------+

| drink_name | main |

+------------+------+

| Blue Moon  | soda |

| Lone Tree  | soda |

| Greyhound  | soda |

+------------+------+

3 rows in set (0.00 sec)

mysql> SELECT drink_name,main FROM easy_drinks 

    -> WHERE main LIKE '__da';

+------------+------+

| drink_name | main |

+------------+------+

| Blue Moon  | soda |

| Lone Tree  | soda |

| Greyhound  | soda |

+------------+------+

3 rows in set (0.00 sec)

利用AND和比较运算符选取一个范围:

    找出热量在30-60之间的饮料(包含30和60)

mysql> SELECT drink_name,calories FROM drink_info

    -> WHERE calories >=30 AND calories <= 60;

+---------------+----------+

| drink_name    | calories |

+---------------+----------+

| Blackthorn    |       33 |

| Oh My Gosh    |       35 |

| Greyhound     |       50 |

| Indian Summer |       30 |

+---------------+----------+

4 rows in set (0.00 sec)

更好的BETWEEN:

    注意BETWEEN AND包含的是闭区间

mysql> SELECT drink_name,calories FROM drink_info

    -> WHERE calories BETWEEN 30 AND 60;

+---------------+----------+

| drink_name    | calories |

+---------------+----------+

| Blackthorn    |       33 |

| Oh My Gosh    |       35 |

| Greyhound     |       50 |

| Indian Summer |       30 |

+---------------+----------+

4 rows in set (0.00 sec)

关键字IN:

    获取表easy_drinks中Blackthorn 、Blue Moon  、Oh My Gosh三种饮料的制作说明:

    除了使用OR链接若干个查询条件 还可以使用关键字IN,加上括号围起来的值的集合;

    只要列值匹配集合中的任何值,即返回改行或该列;

mysql> SELECT drink_name,directions FROM easy_drinks

    -> WHERE drink_name = 'Blackthorn' 

    -> OR drink_name = 'Blue Moon'

    -> or drink_name = 'Oh My Gosh';

+------------+-----------------------------------------------------------+

| drink_name | directions                                                |

+------------+-----------------------------------------------------------+

| Blackthorn | stir with ice,strain into cocktail glass with lemon twist |

| Blue Moon  | stir with ice,strain into cocktail glass with lemon twist |

| Oh My Gosh | stir with ice,strain into shot glass                      |

+------------+-----------------------------------------------------------+

3 rows in set (0.00 sec)

mysql> SELECT drink_name,directions FROM easy_drinks

    -> WHERE drink_name IN ('Blackthorn','Blue Moon','Oh My Gosh');

+------------+-----------------------------------------------------------+

| drink_name | directions                                                |

+------------+-----------------------------------------------------------+

| Blackthorn | stir with ice,strain into cocktail glass with lemon twist |

| Blue Moon  | stir with ice,strain into cocktail glass with lemon twist |

| Oh My Gosh | stir with ice,strain into shot glass                      |

+------------+-----------------------------------------------------------+

3 rows in set (0.01 sec)

NOT  IN:

    NOT能反转查询结果,找出值不在集合中的记录;

mysql> SELECT drink_name,directions FROM easy_drinks

    -> WHERE drink_name NOT IN ('Blackthorn','Blue Moon','Oh My Gosh');

+------------------+-----------------------------------------------------------+

| drink_name       | directions                                                |

+------------------+-----------------------------------------------------------+

| Lime Fizz        | stir with ice,strain into cocktail glass                  |

| Kiss on the Lips | serve over ice with straw                                 |

| Hot Gold         | pour hot orange juice in mug and add peach nectar         |

| Lone Tree        | stir with ice,strain into cocktail glass                  |

| Greyhound        | serve over ice,stir well                                  |

| Indian Summer    | add juice to mug and top off with hot tea                 |

| Bull Frog        | serve over ice with lime slice                            |

| Blackthorn's JU  | stir with ice,strain into cocktail glass with lemon twist |

| Blackthorn twice | stir with ice,strain into cocktail glass with lemon twist |

+------------------+-----------------------------------------------------------+

9 rows in set (0.00 sec)

更多NOT:

    NOT还可LIKE或BETWEEN一起使用,重点是NOT需要放在WHERE OR 或AND的后边紧邻;

    可以说NOT IN是个例外,但是即使把NOT移到WHERE后运行也是正常的;

检索示例:

    不是juice 且 主配料的量不在1-2之间 的饮料:

mysql> SELECT * FROM easy_drinks 

    -> WHERE NOT main LIKE '%juice'

    -> AND NOT second LIKE ‘%juice%'

    -> AND NOT amount2 BETWEEN 1 AND 2;

+------------+----------+---------+----------+---------+--------------------------------+

| drink_name | main     | amount1 | second   | amount2 | directions                     |

+------------+----------+---------+----------+---------+--------------------------------+

| Bull Frog  | iced tea |    1.50 | lemonade |    5.00 | serve over ice with lime slice |

+------------+----------+---------+----------+---------+--------------------------------+

1 row in set (0.00 sec)

NOT可以套用在NULL上,要取得某列中所有不是NULL的值,可以这样查询;

mysql> SELECT * FROM easy_drinks 

    -> WHERE NOT main LIKE '%juice'

    -> AND NOT second LIKE '%juice%'

    -> AND NOT amount2 BETWEEN 1 AND 2

    -> AND NOT drink_name IS NULL;

+------------+----------+---------+----------+---------+--------------------------------+

| drink_name | main     | amount1 | second   | amount2 | directions                     |

+------------+----------+---------+----------+---------+--------------------------------+

| Bull Frog  | iced tea |    1.50 | lemonade |    5.00 | serve over ice with lime slice |

+------------+----------+---------+----------+---------+--------------------------------+

1 row in set (0.00 sec)

总结:

我们来看下本章我们收获了那些SQL工具;

1.SELECT * 用于选择表中所有的列;

2.用\或’实现转义;

3.运算符=、<>、<、>、<=、>=;

4.IS NULL 用于创建比较麻烦的NULL值条件;

5.AND 和 OR 可以在WHERE子句中结合查询条件,让查询更精确;

6.NOT 用于反转查询结果,取得相反的值;

7.BETWEEN 选择一个范围内的值;

8.LIKE搭配%或_通配符,可搜索部分文本字符串;

猜你喜欢

转载自blog.csdn.net/baby_hua/article/details/81910361