查询
一般我们以关键字
SELECT 列名 FROM 表名 WHERE 条件。
来进行查询该表的数据。还有其他关键字,将在下面开始介绍。
首先我们创建表
CREATE TABLE product
(product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER ,
purchase_price INTEGER ,
regist_date DATE ,
PRIMARY KEY (product_id));
接下来往表里加入数据
INSERT INTO product VALUES('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');
INSERT INTO product VALUES('0002', '打孔器', '办公用品', 500, 320, '2009-09-11');
INSERT INTO product VALUES('0003', '运动T恤', '衣服', 4000, 2800, NULL);
INSERT INTO product VALUES('0004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20');
INSERT INTO product VALUES('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
INSERT INTO product VALUES('0006', '叉子', '厨房用具', 500, NULL, '2009-09-20');
INSERT INTO product VALUES('0007', '擦菜板', '厨房用具', 880, 790, '2008-04-28');
INSERT INTO product VALUES('0008', '圆珠笔', '办公用品', 100, NULL, '2009-11-11');
我们查看已经加入的数据:
先了解一些规则
- 星号(*)代表全部列的意思。
- SQL中可以随意使用换行符,不影响语句执行(但不可插入空行)。
- 设定汉语别名时需要使用双引号(")括起来。
- 在SELECT语句中使用DISTINCT可以删除重复行。
- 注释是SQL语句中用来标识说明或者注意事项的部分。分为1行注释"-- “和多行注释两种”/* */"。
运算符 | 含义 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
= | 和~相等 |
<> | 和~不相等 |
>= | 大于等于~ |
> | 大于~ |
<= | 小于等于~ |
< | 小于~ |
现在开始,我们可以进行基本的语法进行操作数据表了!!!
- 首先我们将需要找的列用关键字 AS 起别名;
SELECT product_id AS id,
product_name AS name,
purchase_price AS "进货单价"
FROM product;
- 用关键字 DISTINCT 消除某列相同的数据;
SELECT DISTINCT product_type
FROM product;
- 需知道 SELECT 和 WHERE 都可以使用常数或表达式;
SELECT product_name, sale_price, sale_price * 2 AS "sale_price x2"
FROM product
WHERE sale_price-purchase_price >= 500;
- 用逻辑运算符 NOT、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');
练习题
编写一条SQL语句,从 product
(商品) 表中选取出“登记日期(regist
)在2009年4月28日之后”的商品,查询结果要包含 product name
和 regist_date
两列。
SELECT product_name, regist_date
FROM product
WHERE regist_date > '2009-4-28';
请说出对 product 表执行如下3条SELECT语句时的返回结果。
①
SELECT *
FROM product
WHERE purchase_price = NULL;
False!!!
②
SELECT *
FROM product
WHERE purchase_price <> NULL;
False!!!
③
SELECT *
FROM product
WHERE product_name > NULL;
False!!!
都是错的!!!
代码清单2-22(2-2节)中的SELECT语句能够从product表中取出“销售单价(saleprice)比进货单价(purchase price)高出500日元以上”的商品。请写出两条可以得到相同结果的SELECT语句。执行结果如下所示。
product_name | sale_price | purchase_price
-------------+------------+------------
T恤衫 | 1000 | 500
运动T恤 | 4000 | 2800
高压锅 | 6800 | 5000
第一种方法:
SELECT product_name, sale_price, purchase_price
FROM product
WHERE sale_price - purchase_price > 500
ORDER BY sale_price;
第二种方法:
SELECT product_name, sale_price, purchase_price
FROM product
WHERE NOT sale_price - purchase_price <= 500
ORDER BY sale_price;
请写出一条SELECT语句,从product表中选取出满足“销售单价打九折之后利润高于100日元的办公用品和厨房用具”条件的记录。查询结果要包括product_name列、product_type列以及销售单价打九折之后的利润(别名设定为profit)。
提示:销售单价打九折,可以通过saleprice列的值乘以0.9获得,利润可以通过该值减去purchase_price列的值获得。
SELECT product_name, product_type, sale_price * 0.9 AS profit
FROM product
WHERE (product_type = '办公用品' OR product_type = '厨房用具')
AND ((sale_price * 0.9 - purchase_price ) > 100);
- 聚合函数 COUNT、SUM、AVG、MAX、MIN 的使用;
SELECT SUM(sale_price), SUM(DISTINCT sale_price)
FROM product;
- 分组函数 GROUP BY;
SELECT product_type, COUNT(*)
FROM product
GROUP BY product_type;
- HAVING 与 WHERE 类似,用于对分组进行过滤;
SELECT product_type, COUNT(*)
FROM product
GROUP BY product_type
HAVING COUNT(*) = 2;
!!!
GROUP BY的子句书写顺序有严格要求,不按要求会导致SQL无法正常执行,目前出现过的子句顺序为:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。
排序
使用 ORDER BY 可对搜索结果进行排序。
默认为升序
SELECT product_id, product_name, sale_price, purchase_price
FROM product
ORDER BY sale_price ASC;
降序
SELECT product_id, product_name, sale_price, purchase_price
FROM product
ORDER BY sale_price DESC;