写在前面
这篇文章主要以MySQL数据库进行讲解
在阅读本文之前假设已经安装MySQL数据库。请先构建好数据源,如果没有安装MYSQL数据库可以通过下面的在线网站构建数据源并练习SQL语句
SQL在线练习网站:http://sqlfiddle.com/
源数据下载:https://forta.com/wp-content/uploads/books/0672327120/mysql_scripts.zip
SQL语言分类
SQL语言主要分为三类:
- DML(Data Manipulation Language):数据操作语言,常用的增删改查就属于DML,操作的对象是数据表中的对象。
- DDL(Data Definition Language):数据定义语言。建表,建立数据库就属于DDL
- DCL(Data Control Language):数据控制语言,提交回滚,数据库安全管理等属于DCL
本文将逐一介绍这三个SQL语言分类的简单讲解。
检索数据
SELECT语句
#建products表并插入数据
CREATE TABLE products
(
prod_id char(10) NOT NULL,
vend_id int NOT NULL ,
prod_name char(255) NOT NULL ,
prod_price decimal(8,2) NOT NULL ,
prod_desc text NULL ,
PRIMARY KEY(prod_id)
) ENGINE=InnoDB;
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV01', 1001, '.5 ton anvil', 5.99, '.5 ton anvil, black, complete with handy hook');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV02', 1001, '1 ton anvil', 9.99, '1 ton anvil, black, complete with handy hook and carrying case');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('OL1', 1002, 'Oil can', 8.99, 'Oil can, red');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FU1', 1002, 'Fuses', 3.42, '1 dozen, extra long');
检索单个列
语法:SELECT 列名 FROM 表名
检索prod_name列
SELECT prod_name FROM products;
#结果为
| prod_name |
|--------------|
| .5 ton anvil |
| 1 ton anvil |
| Fuses |
| Oil can |
- 上面的语句利用SELECT语句从products表中检索一个列为prod_name。所需列名在
SELECT
关键字后面给出,FROM
关键字指定要从哪个表检索数据
检索多个列
语法:SELECT 列名1,列名2... FROM 表名
- 要从一个表中检索多个列,使用SELECT语句,后面键入多个列名,列名之间必须以逗号隔开
当心逗号:在选择多个列时,一定要在列名之间加逗号,最后一个列名之后不用加
还是以上面的数据源为例,检索prod_id、prod_name两列
SELECT prod_id,prod_name FROM products;
#其结果如下:
| prod_id | prod_name |
|---------|--------------|
| ANV01 | .5 ton anvil |
| ANV02 | 1 ton anvil |
| FU1 | Fuses |
| OL1 | Oil can |
检索所有列
语法:SELECT * FROM 表名
- 检索所有列时,给定一个通配符(
*
),则会检索表中的所有列。
SELECT * FROM products;
prod_id | vend_id | prod_name | prod_price | prod_desc
ANV01 | 1001 | .5 ton anvil | 5.99 | .5 ton anvil, black
ANV02 | 1001 | 1 ton anvil | 9.99 | 1 ton anvil, black
检索不同的行(DISTINCT)
语法:SELECT DISTINCT 列名 FROM 表名
要检索出有不同值的列表,使用DISTINCT
关键字,此关键字必须直接放在列名的前面。此关键字指示MySQL只返回不同的值,这里的DISTINCT不能部分使用,它应用于所有列而不仅是前置它的列。
SELECT DISTINCT vend_id FROM products;
| vend_id |
|---------|
| 1001 |
| 1002 |
限制结果(LIMIT)
限制返回的行数。可以有两个参数,第一个参数为起始行,从 0 开始;第二个参数为返回的总行数。
语法:
SELECT 列名1,列名2,...
FROM 表名
LIMIT starts,count;
-
count
:检索取多少行 -
starts
:从第几行开始,注意这里的开始行从0开始
返回前五行:
SELECT * FROM products LIMIT 5;
SELECT * FROM products LIMIT 0,5
带一个值的LIMIT
总是从第一行开始,给出的数为返回的行数。带两个值的LIMIT
可以指定从行号为第一个值的位置开始。
过滤数据
使用WHERE子句
在SELECT语句中,数据根据WHERE
子句中指定的搜索条件进行过滤。WHERE子句在表名后给出。在同时使用ORDER BY
和WHERE子句时,应该让ORDER BY位于WHERE之后
WHERE子句操作符
语法:
SELECT 列名1,列名2,...
FROM 表名
WHERE 条件
MYSQL支持以下所有条件操作符:
操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 在指定的两个值之间 |
IS NULL | 为NULL值 |
过滤单个值
过滤prod_name='fuses’的数据
SELECT prod_name,prod_price
FROM products
WHERE prod_name='fuses';
过滤价格小于10元的数据
SELECT prod_name,prod_price
FROM products
WHERE prod_price<10;
过滤价格小于等于10元的数据
SELECT prod_name,prod_price
FROM products
WHERE prod_price<=10;
过滤不匹配
过滤vend_id不是1002的数据
SELECT prod_name,prod_price
FROM products
WHERE vend_id != 1002;
如果条件值为字符串类型,则需要引用引号,如果条件值为数值类型,则不需要引用引号
过滤范围值(BETWEEN)
如果需要检查某个范围的值,可以使用BETWEEN
操作符。其语法与其他WHERE子句的操作符不同。BETWEEN需要两个值,过滤范围的开始值和结束值。在范围使用BETWEEN时,必须指定两个值——所需范围的低端值和高端值。这两个值必须用AND
关键字分隔。BETWEEN匹配范围中的所有值,包括指定的开始值和结束值。
过滤价格在5元和10元之间的所有产品
SELECT prod_name,prod_price
FROM products
WHERE prod_price BETWEEN 5 AND 10;
空值过滤(IS NULL)
WHERE子句 IS NULL
用来检查具有NULL值的列。
SELECT prod_name
FROM products
WHERE prod_price IS NULL;
组合WHERE子句
AND
操作符
为了通过不止一个列在过滤,可使用AND
操作符给WHERE子句附加条件,用来指示检索满足所有给定的条件的行。
案例:
SELECT prod_id,prod_price,prod_name
FROM products
WHERE vend_id = 1003 AND prod_price <= 10;
OR
操作符:
用于过滤检索匹配任意一条件的行
SELECT prod_id,prod_price,prod_name
FROM products
WHERE vend_id = 1003 OR prod_price <= 10;
IN
操作符
IN
操作符用于指定条件范围,范围中每个条件都可以进行匹配。IN在WHERE中用来指定匹配值的关键字,功能与OR相当
SELECT prod_name,prod_price
FROM products
WHERE vend_id IN(1002,1003)
ORDER BY prod_name;
IN
操作符的优点如下:
- 当需要匹配的值比较多时,IN操作符的语法更清楚且更直观;
- IN操作符一般比OR操作符执行更快;
- 在使用IN时,计算的次序更容易管理;
- IN的一最大优点就是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句;
NOT
操作符:
NOT
用在WHERE子句中,用来否定后跟的条件表达式,MYSQL中的NOT,支持NOT对IN,BETWEEN和EXISTS子句取反。