前面章节我们介绍表的建立、删除和更新。这一章节我们介绍SELECT语句。
SELECT <列名>,..... FROM<表名>;
这里我们使用SELECT语句对数据库操作一下,选择如下三列,可以看出选择出的三列顺序和SELECT选择结果中一致。
SELECT product_id,product_name,purchase_price
FROM product;
SELECT * FROM product;
使用‘AS’关键字可以为列设置别名。如果需要设置中文别名,则需要用双引号(单引号不行)引起来。
SELECT product_id AS id,product_name AS name,purchase_price AS price
FROM product;
SELECT product_id AS "商品编号",product_name AS "商品名称",purchase_price AS "进货单价"
FROM product;
查询常数:是指可以查询一些常数,比如字符串常数,数字常数,日期常数,可能这些数据数据库中没有。
SELECT '商品' AS string, 38 AS number, '2009-02-24' AS date,
product_id, product_name
FROM product;
可以看出,被选择的常数作为了一列数据展示了出来,而这些数据是我们选择的,不是数据库中有的。
从上可知,在product_type这一列中含有重复的值,我们可以使用DISTINCT来去除重复值。
SELECT DISTINCT product_type FROM product;
这样就去除了重复的行。说明一下,如果某列中含有null空值,则NULL也会看成一类数据,所有的NULL会被合成为一条数据
合并空值NULL
SELECT DISTINCT purchase_price FROM product;
可看见,两个NULL变成了一个NULL。
我们也可选择多个列的组合,将重复的数据合并为一条数据。(这里的重复是指多个列的值都重复),且DISTINCT关键字只能用在第一个列名之前。
SELECT DISTINCT product_type,regist_date FROM product;
将product_type和regist_date同时重复的列合并。
SELECT每次选择都是选择一整列的数据,有些时候,我们并不需要每次都选择出所有的数据,大部分情况下都是取出满足“销售量大于500的商品”等某些条件的数据。这时候就需要WHERE语句来指定了,需说明的是,WHERE语句必须写在FROM句子之后,要不然会报错。
SELECT <列名> FROM <表名> WHERE <条件表达式>;
例如:从product中选择出商品种类为product_type为‘衣服’的记录。
SELECT * FROM product WHERE product_type="衣服";
说真的,我还真不会写注释,我还是介绍一下吧
一行注释
--书写在“--”之后,并且只能在同一行
多行注释
/*可
以
跨
多
行
*/
含义 | 运算符 |
---|---|
加法运算 | + |
减法运算 | - |
乘法运算 | * |
除法运算 | / |
需要注意的是NULL值和其他值的加减乘除运算的结果都是NULL
运算符 | 含义 |
---|---|
= | 和x相等 |
<> | 和x不等 |
>= | 大于等于x |
> | 大于x |
<= | 小于等于x |
< | 小于x |
例如:选择出销售单价大于1000日元的记录
SELECT product_name,product_type,sale_price
FROM product
WHERE sale_price>=1000;
SELECT product_name,product_type,regist_date FROM product WHERE regist_date <'2009-09-27';
说明一下,在SQL中,使用(>=)或者(<=)作为查询条件时,一定要注意(<,>)和(=)符号位置不能颠倒,
算数运算法和比较运算法可以一起使用。例如:获取sale_price比purchase_price高出500元的商品信息。
SELECT product_name,sale_price,purchase_price FROM product WHERE sale_price-purchase_price >=500;
我们先来创建一个表
--插入数据
CREATE TABLE Chars
(chr CHAR(3) NOT NULL,
PRIMARY KEY (chr));
--插入数据
START TRANSACTION;
INSERT INTO Chars VALUES ('1');
INSERT INTO Chars VALUES ('2');
INSERT INTO Chars VALUES ('3');
INSERT INTO Chars VALUES ('10');
INSERT INTO Chars VALUES ('11');
INSERT INTO Chars VALUES ('222');
COMMIT;
--选择出大于‘2’的数据SELECT语句
SELECT chr FROM Chars WHERE chr>'2';
是不是超级神奇,这里是对字符串进行比较,不是数据类型的数据,那么它们首先会对首字母进行比较,比如‘10’和‘11’它们首字母是‘1’都比2小,根据这些原理我们可以知道‘1-3’<‘1’ ‘3’>‘2-2’
我们product表中的purchase_price中存在空值,我们用比较运算法试一试
--选择出商品单价为2800的商品
SELECT product_name,purchase_price
FROM product
WHERE purchase_price=2800;
--选择出商品单价为不为2800的商品
SELECT product_name,purchase_price
FROM product
WHERE purchase_price <> 2800;
以上可知NULL类型都未被选中,可知NULL无法用比较运算法进行计算。如果需要选出NULL,需要用IS NULL或者IS NOT NULL
--选择为空的记录
SELECT product_name,purchase_price
FROM product
WHERE purchase_price IS NULL;
--选择不为空的记录
SELECT product_name,purchase_price
FROM product
WHERE purchase_price IS NOT NULL;
NOT不能单独使用,必须和其他查询条件组合起来使用。
--这里我们使用NOT选择进口价格小于或等于1000元的商品
SELECT product_name,purchase_price
FROM product
WHERE NOT purchase_price > 1000;
AND是逻辑与的意思,OR为逻辑或的意思
--获取进口价格大于1000并且商品类型为厨房用具为‘厨房用具’
SELECT product_name,purchase_price
FROM product
WHERE purchase_price > 1000 AND product_type="厨房用具";
--获取进口价格大于1000或者商品类型为厨房用具为‘厨房用具’
SELECT product_name,purchase_price
FROM product
WHERE purchase_price > 1000 OR product_type="厨房用具";
其实有很多情况不止有两个条件,还会有三个,四个甚至更多,这时我们就需要用括号来选择哪些条件是一起的,哪些条件是分开的。
--选择‘商品种类为办公用品’,并且‘登记日期为2009年9月11日或者2009年9年20日’的商品
SELECT product_name,product_type,regist_date
FROM product
WHERE product_type='办公用品' AND regist_date = '2009-09-11' OR regist_date = '2009-09-20';
发现结果错了,因为计算机中AND优先计算,然后在计算OR
所以我们需要加上括号
SELECT product_name,product_type,regist_date
FROM product
WHERE product_type='办公用品'
AND ( regist_date = '2009-09-11'
OR regist_date = '2009-09-20' ) ;
其实在逻辑运算中,不止有1和0还有一种UNKOWN的值,NULL值不属于TRUE 也不属于FALSE,一考虑到NULL情况就会多变,所以我们一般尽量不使用NULL
图书:《SQL基础教程》