MYSQL必知必会1-8读书笔记

准备

MySQL必知必会PDF: http://download.csdn.net/download/lgh1992314/9965627

Mysql新版本安装配置:
http://blog.csdn.net/x_iya/article/details/53332893
创建数据库:
CREATE DATABASE IF NOT EXISTS forta DEFAULT CHARSET utf8 COLLATE utf8_unicode_ci;
等价于
MYSQL必知必会1-8读书笔记_第1张图片
导入数据库表:
方法一:
进入mysql的控制台后,使用source命令执行
mysql> source 【sql脚本文件的路径全名】 或 mysql> \. 【sql脚本文件的路径全名】
示例:
source E:\Plans\java\create.sql 或者 \. E:\Plans\java\create.sql
MYSQL必知必会1-8读书笔记_第2张图片
方法二:
使用cmd命令执行(windows下,unix或Linux在的其控制台下)
【MySQL的bin目录】\mysql –u用户名 –p密码 –D数据库<【sql脚本文件路径全名】
示例:
mysql -u root -plgh123 -Dforta < E:\Plans\java\populate.sql
MYSQL必知必会1-8读书笔记_第3张图片
注意:
A、如果在sql脚本文件中使用了use 数据库,则-D数据库选项可以忽略
B、如果【Mysql的bin目录】中包含空格,则需要使用“”包含,如:“C:\Program Files\mysql\bin\mysql” –u用户名 –p密码 –D数据库<【sql脚本文件路径全名】

MYSQL必知必会1-8读书笔记_第4张图片


第一章 了解SQL

数据库:保存有组织的数据的容器(通常是一个文件或者一组文件)。
数据库软件:DBMS(数据库管理系统)。
数据库是通过DBMS创建和操纵的容器。
表(table):某种特定类型数据的结构化清单。
表名:数据库中每个表的名字,用来标识自己,且唯一。
模式(schema):关于数据库和表的布局及特性的信息。
列(column):表中的一个字段。所有表都是由一个或多个列组成。
数据类型(datatype):所容许的数据的类型。每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据。
行(row):表中的一个记录。
主键(primary key):一列(或者一组列),其值能够唯一区分表中每个行。
表中的任何列都可以作为主键,只要它满足以下条件:
1、任意两行都不具有相同的主键值。
2、每个行都必须具有一个主键值(主键列不允许NULL值)
主键通常定义在表的一列上,但是也可以多个列作为主键。
主键的最好习惯:
1、不更新主键列中的值。
2、不重用主键列的值。
3、不在主键列中使用可能会更改的值。
SQL:结构化查询语言(Structured Query Language),是一种专门用来与数据库通信的语言。

第二章 MYSQL简介

Mysql是基于客户机-服务器的数据库。
服务器部分是负责所有数据访问和处理的一个软件。与数据文件打交道的只有服务器软件。客户机是与用户打交道的软件。
命令行登录
格式是:
Mysql  -h  mysql主机名\ip -P 端口号 -u root (用户)  -p
例如:mysql -u root -p123

第三章 使用MySQL

选择数据库

USE db_name
mysql> help use;
Name: 'USE'
Description:
Syntax:
USE db_name

The USE db_name statement tells MySQL to use the db_name database as
the default (current) database for subsequent statements. The database
remains the default until the end of the session or another USE
statement is issued:
必须首先使用USE打开数据库,才能读取其中的数据。

显示可用数据库

SHOW DATABASES;

显示数据库表

SHOW TABLES;
前提,使用USE打开使用的数据库

显示表列

SHOW COLUMNS FROM orders;

SHOW COLUMNS要求给出一个表名,它对每个字段返回一行,行中包含字段名、数据类型、是否允许NULL、键信息、默认值以及其他信息。

等价于DESCRIBE orders;

SHOW STATUS; 显示服务器状态信息。

SHOW CREATE DATABASE forta; 显示创建特定数据库的SQL语句。

SHOW CREATE TABLE orders;显示创建特定数据库表的SQL语句。

mysql> SHOW CREATE DATABASE forta;
+----------+----------------------------------------------------------------+
| Database | Create Database                                                |
+----------+----------------------------------------------------------------+
| forta    | CREATE DATABASE `forta` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW CREATE TABLE orders;
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                                                                                                                                                                                                                                                         |
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| orders | CREATE TABLE `orders` (
  `order_num` int(11) NOT NULL AUTO_INCREMENT,
  `order_date` datetime NOT NULL,
  `cust_id` int(11) NOT NULL,
  PRIMARY KEY (`order_num`),
  KEY `fk_orders_customers` (`cust_id`),
  CONSTRAINT `fk_orders_customers` FOREIGN KEY (`cust_id`) REFERENCES `customers` (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=20010 DEFAULT CHARSET=utf8 |
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>
SHOW GRANTS;显示授予用户的安全权限。

SHOW ERRORS;和SHOW WARNINGS;显示服务器错误和警告信息。

第四章 检索数据

SELECT:从一个或多个表中检索信息。

使用SELECT语句必须给出两条信息:想选择什么;从什么地方选择。

检索单个列

mysql> SELECT prod_name FROM products;
+----------------+
| prod_name      |
+----------------+
| .5 ton anvil   |
| 1 ton anvil    |
| 2 ton anvil    |
| Detonator      |
| Bird seed      |
| Carrots        |
| Fuses          |
| JetPack 1000   |
| JetPack 2000   |
| Oil can        |
| Safe           |
| Sling          |
| TNT (1 stick)  |
| TNT (5 sticks) |
+----------------+
14 rows in set (0.00 sec)

mysql>

以上从products表中检索一个名为prod_name的列。

以上返回的数据是未排序的,其顺序没有特殊意义。

多条SQL语句必须以分号(;)分隔,单条SQL语句则没有必要。

SQL语句不区分大小写,但是习惯SQL关键字大写,表名、列名小写。

在处理SQL语句时,其中所有的空格都被忽略。

检索多个列

mysql> SELECT prod_id, prod_name, prod_price FROM products;
+---------+----------------+------------+
| prod_id | prod_name      | prod_price |
+---------+----------------+------------+
| ANV01   | .5 ton anvil   |       5.99 |
| ANV02   | 1 ton anvil    |       9.99 |
| ANV03   | 2 ton anvil    |      14.99 |
| DTNTR   | Detonator      |      13.00 |
| FB      | Bird seed      |      10.00 |
| FC      | Carrots        |       2.50 |
| FU1     | Fuses          |       3.42 |
| JP1000  | JetPack 1000   |      35.00 |
| JP2000  | JetPack 2000   |      55.00 |
| OL1     | Oil can        |       8.99 |
| SAFE    | Safe           |      50.00 |
| SLING   | Sling          |       4.49 |
| TNT1    | TNT (1 stick)  |       2.50 |
| TNT2    | TNT (5 sticks) |      10.00 |
+---------+----------------+------------+
14 rows in set (0.00 sec)

mysql>
在选择多个列时,一定要在列名之间加上逗号,最后一个列名不加。
SQL语句一般返回原始的、无格式的数据。数据的格式化是一个表示问题,而不是一个检索问题。

检索所有列

mysql> SELECT * FROM products;
+---------+---------+----------------+------------+----------------------------------------------------------------+
| prod_id | vend_id | prod_name      | prod_price | prod_desc                                                      |
+---------+---------+----------------+------------+----------------------------------------------------------------+
| ANV01   |    1001 | .5 ton anvil   |       5.99 | .5 ton anvil, black, complete with handy hook                  |
| ANV02   |    1001 | 1 ton anvil    |       9.99 | 1 ton anvil, black, complete with handy hook and carrying case |
| ANV03   |    1001 | 2 ton anvil    |      14.99 | 2 ton anvil, black, complete with handy hook and carrying case |
| DTNTR   |    1003 | Detonator      |      13.00 | Detonator (plunger powered), fuses not included                |
| FB      |    1003 | Bird seed      |      10.00 | Large bag (suitable for road runners)                          |
| FC      |    1003 | Carrots        |       2.50 | Carrots (rabbit hunting season only)                           |
| FU1     |    1002 | Fuses          |       3.42 | 1 dozen, extra long                                            |
| JP1000  |    1005 | JetPack 1000   |      35.00 | JetPack 1000, intended for single use                          |
| JP2000  |    1005 | JetPack 2000   |      55.00 | JetPack 2000, multi-use                                        |
| OL1     |    1002 | Oil can        |       8.99 | Oil can, red                                                   |
| SAFE    |    1003 | Safe           |      50.00 | Safe with combination lock                                     |
| SLING   |    1003 | Sling          |       4.49 | Sling, one size fits all                                       |
| TNT1    |    1003 | TNT (1 stick)  |       2.50 | TNT, red, single stick                                         |
| TNT2    |    1003 | TNT (5 sticks) |      10.00 | TNT, red, pack of 10 sticks                                    |
+---------+---------+----------------+------------+----------------------------------------------------------------+
14 rows in set (0.00 sec)

mysql>
如上,如果给定一个通配符(*),则返回表中所有列。
检索不同的行
mysql> SELECT DISTINCT vend_id FROM products;
+---------+
| vend_id |
+---------+
|    1001 |
|    1002 |
|    1003 |
|    1005 |
+---------+
4 rows in set (0.06 sec)

mysql>
DISTINCT关键字指示MySQL只返回不同的值。它必须直接放在列名前面。

限制结果

mysql> SELECT prod_name FROM products LIMIT 5;
+--------------+
| prod_name    |
+--------------+
| .5 ton anvil |
| 1 ton anvil  |
| 2 ton anvil  |
| Detonator    |
| Bird seed    |
+--------------+
5 rows in set (0.00 sec)

mysql>
LIMIT 5指示MySQL返回不多于5行。
mysql> SELECT prod_name FROM products LIMIT 5, 5;
+--------------+
| prod_name    |
+--------------+
| Carrots      |
| Fuses        |
| JetPack 1000 |
| JetPack 2000 |
| Oil can      |
+--------------+
5 rows in set (0.00 sec)
LIMIT 5, 5指示MySQL返回从行5开始的5行。第一个数为开始位置,第二个数为要检索的行数。
检索出来的第一行为行0而不是行1。所以LIMIT1, 1将检索出第二行而不是第一行。
行数不够时MySQL只返回它能够返回的那么多行。
MySQL支持LIMIT的另一种语法:LIMIT 4 OFFSET 3--从行3开始取4行。

第五章 排序检索数据

排序数据

关系型数据库中,如果不明确规定排序顺序,则不应该假定检索出来的数据的顺序有意义。
mysql> SELECT prod_name FROM products ORDER BY prod_name;
+----------------+
| prod_name      |
+----------------+
| .5 ton anvil   |
| 1 ton anvil    |
| 2 ton anvil    |
| Bird seed      |
| Carrots        |
| Detonator      |
| Fuses          |
| JetPack 1000   |
| JetPack 2000   |
| Oil can        |
| Safe           |
| Sling          |
| TNT (1 stick)  |
| TNT (5 sticks) |
+----------------+
14 rows in set (0.07 sec)
ORDER BY 子句取一个或多个列的名字,据此对输出进行排序。
通过非选择列也是可以的:SELECT prod_name FROM products ORDER BY prod_id;

按多个列排序

mysql> SELECT prod_id, prod_name, prod_price FROM products ORDER BY prod_price, prod_name;
+---------+----------------+------------+
| prod_id | prod_name      | prod_price |
+---------+----------------+------------+
| FC      | Carrots        |       2.50 |
| TNT1    | TNT (1 stick)  |       2.50 |
| FU1     | Fuses          |       3.42 |
| SLING   | Sling          |       4.49 |
| ANV01   | .5 ton anvil   |       5.99 |
| OL1     | Oil can        |       8.99 |
| ANV02   | 1 ton anvil    |       9.99 |
| FB      | Bird seed      |      10.00 |
| TNT2    | TNT (5 sticks) |      10.00 |
| DTNTR   | Detonator      |      13.00 |
| ANV03   | 2 ton anvil    |      14.99 |
| JP1000  | JetPack 1000   |      35.00 |
| SAFE    | Safe           |      50.00 |
| JP2000  | JetPack 2000   |      55.00 |
+---------+----------------+------------+
14 rows in set (0.00 sec)
上述例子,仅在多个行具有相同的prod_price时才对产品按照prod_name进行排序。
如果prod_price列中所有的值都是唯一的,则不会按prod_name排序。

指定排序方向

MySQL检索数据,默认是按照升序排序(从A到Z)。
mysql> SELECT prod_id, prod_name, prod_price FROM products ORDER BY prod_price DESC;
+---------+----------------+------------+
| prod_id | prod_name      | prod_price |
+---------+----------------+------------+
| JP2000  | JetPack 2000   |      55.00 |
| SAFE    | Safe           |      50.00 |
| JP1000  | JetPack 1000   |      35.00 |
| ANV03   | 2 ton anvil    |      14.99 |
| DTNTR   | Detonator      |      13.00 |
| FB      | Bird seed      |      10.00 |
| TNT2    | TNT (5 sticks) |      10.00 |
| ANV02   | 1 ton anvil    |       9.99 |
| OL1     | Oil can        |       8.99 |
| ANV01   | .5 ton anvil   |       5.99 |
| SLING   | Sling          |       4.49 |
| FU1     | Fuses          |       3.42 |
| FC      | Carrots        |       2.50 |
| TNT1    | TNT (1 stick)  |       2.50 |
+---------+----------------+------------+
14 rows in set (0.00 sec)
DESC关键字只应用到直接位于其前面的列名。
mysql> SELECT prod_id, prod_name, prod_price FROM products ORDER BY prod_price DESC, prod_name;
+---------+----------------+------------+
| prod_id | prod_name      | prod_price |
+---------+----------------+------------+
| JP2000  | JetPack 2000   |      55.00 |
| SAFE    | Safe           |      50.00 |
| JP1000  | JetPack 1000   |      35.00 |
| ANV03   | 2 ton anvil    |      14.99 |
| DTNTR   | Detonator      |      13.00 |
| FB      | Bird seed      |      10.00 |
| TNT2    | TNT (5 sticks) |      10.00 |
| ANV02   | 1 ton anvil    |       9.99 |
| OL1     | Oil can        |       8.99 |
| ANV01   | .5 ton anvil   |       5.99 |
| SLING   | Sling          |       4.49 |
| FU1     | Fuses          |       3.42 |
| FC      | Carrots        |       2.50 |
| TNT1    | TNT (1 stick)  |       2.50 |
+---------+----------------+------------+
14 rows in set (0.00 sec)
上述例子,DESC只作用于prod_price,即prod_price按照降序排序,而prod_name依旧按照升序排序(prod_price相同的时候)。
如果想对多个列降序排序,则应该对每个列指定DESC关键字。
与DESC相反的是升序排序(ASC),它是默认的,一般我们不写ASC关键字。
使用ORDER BY 与 LIMIT 的组合,可以找到一个列中的最大。最小值。
mysql> SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;
+------------+
| prod_price |
+------------+
|      55.00 |
+------------+
1 row in set (0.00 sec)
在使用ORDER BY 子句时,应该保证它位于FROM子句之后,如果使用LIMIT,它必须位于ORDER BY之后,否则出错。
mysql> SELECT prod_price FROM products LIMIT 1 ORDER BY prod_price DESC;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY prod_price DESC' at line 1

第六章 过滤数据

使用WHERE子句

只检索出所需数据需要指定搜索条件,也叫过滤条件,由WHERE子句指定。
mysql> SELECT prod_name, prod_price FROM products WHERE prod_price = 2.50;
+---------------+------------+
| prod_name     | prod_price |
+---------------+------------+
| Carrots       |       2.50 |
| TNT (1 stick) |       2.50 |
+---------------+------------+
2 rows in set (0.00 sec)
上述SQL语句检查一个列是否具有指定的值,据此进行过滤。
在同时使用WHERE和ORDER BY 子句时,需要保证ORDER BY 位于WHERE之后。

WHERE子句操作符

MySQL支持的条件操作符:等于=、不等于<>、不等于!=、小于<、小于等于<=、大于>、大于等于>=、BETWEEN在指定的
两个值之间。
例子:
mysql> SELECT prod_name, prod_price FROM products WHERE prod_name = 'fuses';
+-----------+------------+
| prod_name | prod_price |
+-----------+------------+
| Fuses     |       3.42 |
+-----------+------------+
1 row in set (0.00 sec)
mysql> SELECT prod_name, prod_price FROM products WHERE prod_price <= 10;
+----------------+------------+
| prod_name      | prod_price |
+----------------+------------+
| .5 ton anvil   |       5.99 |
| 1 ton anvil    |       9.99 |
| Bird seed      |      10.00 |
| Carrots        |       2.50 |
| Fuses          |       3.42 |
| Oil can        |       8.99 |
| Sling          |       4.49 |
| TNT (1 stick)  |       2.50 |
| TNT (5 sticks) |      10.00 |
+----------------+------------+
9 rows in set (0.00 sec)
mysql> SELECT vend_id, prod_name FROM products WHERE vend_id != 1003;
+---------+--------------+
| vend_id | prod_name    |
+---------+--------------+
|    1001 | .5 ton anvil |
|    1001 | 1 ton anvil  |
|    1001 | 2 ton anvil  |
|    1002 | Fuses        |
|    1005 | JetPack 1000 |
|    1005 | JetPack 2000 |
|    1002 | Oil can      |
+---------+--------------+
7 rows in set (0.34 sec)
!=等价于<>

范围值检查

mysql> SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
+----------------+------------+
| prod_name      | prod_price |
+----------------+------------+
| .5 ton anvil   |       5.99 |
| 1 ton anvil    |       9.99 |
| Bird seed      |      10.00 |
| Oil can        |       8.99 |
| TNT (5 sticks) |      10.00 |
+----------------+------------+
5 rows in set (0.04 sec)
使用:BETWEEN 低端值 AND 高端值

空值检查

NULL无值,它与字段包含0、空字符串或仅仅包含空格不同。
在一个列不包含值时,称其包含空值NULL。
mysql> SELECT cust_id FROM customers WHERE cust_email IS NULL;
+---------+
| cust_id |
+---------+
|   10002 |
|   10005 |
+---------+
2 rows in set (0.00 sec)

mysql> select * from customers;
+---------+----------------+---------------------+-----------+------------+----------+--------------+--------------+---------------------+
| cust_id | cust_name      | cust_address        | cust_city | cust_state | cust_zip | cust_country | cust_contact | cust_email          |
+---------+----------------+---------------------+-----------+------------+----------+--------------+--------------+---------------------+
|   10001 | Coyote Inc.    | 200 Maple Lane      | Detroit   | MI         | 44444    | USA          | Y Lee        | [email protected]     |
|   10002 | Mouse House    | 333 Fromage Lane    | Columbus  | OH         | 43333    | USA          | Jerry Mouse  | NULL                |
|   10003 | Wascals        | 1 Sunny Place       | Muncie    | IN         | 42222    | USA          | Jim Jones    | [email protected] |
|   10004 | Yosemite Place | 829 Riverside Drive | Phoenix   | AZ         | 88888    | USA          | Y Sam        | [email protected]    |
|   10005 | E Fudd         | 4545 53rd Street    | Chicago   | IL         | 54545    | USA          | E Fudd       | NULL                |
+---------+----------------+---------------------+-----------+------------+----------+--------------+--------------+---------------------+
5 rows in set (0.00 sec)
在通过过滤选择出不具有特定值的行时,不会返回具有NULL值的行,因为未知具有特殊的含义,数据库不知道它们是否匹配。
mysql> SELECT * from customers WHERE cust_email != '';
+---------+----------------+---------------------+-----------+------------+----------+--------------+--------------+---------------------+
| cust_id | cust_name      | cust_address        | cust_city | cust_state | cust_zip | cust_country | cust_contact | cust_email          |
+---------+----------------+---------------------+-----------+------------+----------+--------------+--------------+---------------------+
|   10001 | Coyote Inc.    | 200 Maple Lane      | Detroit   | MI         | 44444    | USA          | Y Lee        | [email protected]     |
|   10003 | Wascals        | 1 Sunny Place       | Muncie    | IN         | 42222    | USA          | Jim Jones    | [email protected] |
|   10004 | Yosemite Place | 829 Riverside Drive | Phoenix   | AZ         | 88888    | USA          | Y Sam        | [email protected]    |
+---------+----------------+---------------------+-----------+------------+----------+--------------+--------------+---------------------+
3 rows in set (0.00 sec)

第七章 数据过滤

MySQL允许给出多个WHERE 子句,这些子句使用AND 或者OR连接。
mysql> SELECT prod_id, prod_name, prod_price FROM products WHERE vend_id = 1003;
+---------+----------------+------------+
| prod_id | prod_name      | prod_price |
+---------+----------------+------------+
| DTNTR   | Detonator      |      13.00 |
| FB      | Bird seed      |      10.00 |
| FC      | Carrots        |       2.50 |
| SAFE    | Safe           |      50.00 |
| SLING   | Sling          |       4.49 |
| TNT1    | TNT (1 stick)  |       2.50 |
| TNT2    | TNT (5 sticks) |      10.00 |
+---------+----------------+------------+
7 rows in set (0.00 sec)

mysql> SELECT prod_id, prod_name, prod_price FROM products WHERE vend_id = 1003 AND prod_price <= 10;
+---------+----------------+------------+
| prod_id | prod_name      | prod_price |
+---------+----------------+------------+
| FB      | Bird seed      |      10.00 |
| FC      | Carrots        |       2.50 |
| SLING   | Sling          |       4.49 |
| TNT1    | TNT (1 stick)  |       2.50 |
| TNT2    | TNT (5 sticks) |      10.00 |
+---------+----------------+------------+
5 rows in set (0.00 sec)
AND用在WHERE子句中的关键字,用来指示检索满足 所有给定条件的行。
还可以添加多个过滤条件,每添加一条就要使用一个AND。
mysql> SELECT prod_id, prod_name, prod_price FROM products WHERE vend_id = 1003 OR vend_id = 1002;
+---------+----------------+------------+
| prod_id | prod_name      | prod_price |
+---------+----------------+------------+
| DTNTR   | Detonator      |      13.00 |
| FB      | Bird seed      |      10.00 |
| FC      | Carrots        |       2.50 |
| FU1     | Fuses          |       3.42 |
| OL1     | Oil can        |       8.99 |
| SAFE    | Safe           |      50.00 |
| SLING   | Sling          |       4.49 |
| TNT1    | TNT (1 stick)  |       2.50 |
| TNT2    | TNT (5 sticks) |      10.00 |
+---------+----------------+------------+
9 rows in set (0.01 sec)
OR:WHERE子句中使用的关键字,用来表示检索匹配 任一给定条件的行。

优先级:

mysql> SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003 AND prod_price >= 10;
+----------------+------------+
| prod_name      | prod_price |
+----------------+------------+
| Detonator      |      13.00 |
| Bird seed      |      10.00 |
| Fuses          |       3.42 |
| Oil can        |       8.99 |
| Safe           |      50.00 |
| TNT (5 sticks) |      10.00 |
+----------------+------------+
6 rows in set (0.00 sec)

mysql> SELECT prod_name, prod_price FROM products WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
+----------------+------------+
| prod_name      | prod_price |
+----------------+------------+
| Detonator      |      13.00 |
| Bird seed      |      10.00 |
| Safe           |      50.00 |
| TNT (5 sticks) |      10.00 |
+----------------+------------+
4 rows in set (0.00 sec)
在SQL语言中,AND操作符的优先级大于OR的优先级。
所以,第一个例子匹配的是vend_id等于1003且prod_price大于等于10的产品,或者vend_id等于1002的产品。
在不清楚优先级的情况下,增加括号是个不错的选择。

IN操作符

mysql> SELECT vend_id, prod_name, prod_price FROM products WHERE vend_id IN (1002, 1003) ORDER BY prod_name;
+---------+----------------+------------+
| vend_id | prod_name      | prod_price |
+---------+----------------+------------+
|    1003 | Bird seed      |      10.00 |
|    1003 | Carrots        |       2.50 |
|    1003 | Detonator      |      13.00 |
|    1002 | Fuses          |       3.42 |
|    1002 | Oil can        |       8.99 |
|    1003 | Safe           |      50.00 |
|    1003 | Sling          |       4.49 |
|    1003 | TNT (1 stick)  |       2.50 |
|    1003 | TNT (5 sticks) |      10.00 |
+---------+----------------+------------+
9 rows in set (0.00 sec)
IN操作符后跟由逗号分隔的合法值清单,整个清单必须括在圆括号中。

NOT操作符

NOT:WHERE子句中用来否定后跟条件的关键字。
mysql> SELECT vend_id, prod_name, prod_price FROM products WHERE vend_id NOT IN (1002, 1003) ORDER BY prod_name;
+---------+--------------+------------+
| vend_id | prod_name    | prod_price |
+---------+--------------+------------+
|    1001 | .5 ton anvil |       5.99 |
|    1001 | 1 ton anvil  |       9.99 |
|    1001 | 2 ton anvil  |      14.99 |
|    1005 | JetPack 1000 |      35.00 |
|    1005 | JetPack 2000 |      55.00 |
+---------+--------------+------------+
5 rows in set (0.05 sec)

第八章 用通配符进行过滤

通配符:用来配置值的一部分的特殊字符。
搜索模式:由字面值、通配符或两者组合构成的搜索条件。
为了在搜索子句中使用通配符,必须使用LIKE操作符。

百分号(%)通配符

%表示任何字符出现任意多次
mysql> SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'jet%';
+---------+--------------+
| prod_id | prod_name    |
+---------+--------------+
| JP1000  | JetPack 1000 |
| JP2000  | JetPack 2000 |
+---------+--------------+
2 rows in set (0.00 sec)
以上搜索以jet开头的词。
通配符可以出现在任意位置:
mysql> SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '%anvil%';
+---------+--------------+
| prod_id | prod_name    |
+---------+--------------+
| ANV01   | .5 ton anvil |
| ANV02   | 1 ton anvil  |
| ANV03   | 2 ton anvil  |
+---------+--------------+
3 rows in set (0.00 sec)
%代表搜索模式中给定位置的0个、1个或多个字符。
%通配符不能匹配NULL

下划线(_)通配符

其只匹配单个字符。
mysql> SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '_ ton anvil';
+---------+-------------+
| prod_id | prod_name   |
+---------+-------------+
| ANV02   | 1 ton anvil |
| ANV03   | 2 ton anvil |
+---------+-------------+
2 rows in set (0.00 sec)
比较:
mysql> SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '% ton anvil';
+---------+--------------+
| prod_id | prod_name    |
+---------+--------------+
| ANV01   | .5 ton anvil |
| ANV02   | 1 ton anvil  |
| ANV03   | 2 ton anvil  |
+---------+--------------+
3 rows in set (0.00 sec)
通配符虽然很有用,但是其搜索花费的时间比普通的搜索要长。














你可能感兴趣的:(Database)