...
代码块 | ||||
---|---|---|---|---|
| ||||
-- 查询出所有的列 SELECT * FROM Product; -- 从表中查询出需要的列 SELECT product_id, product_name, purchase_price FROM Product; -- 为列设定别名(AS) SELECT product_id AS id, product_name AS name, purchase_price AS “价格” FROM Product; -- 将查询出的一列指定为常数 SELECT '2009-02-24' AS date, product_id, product_name FROM Product; -- 从查询结果中删除重复行(DISTINCT) SELECT DISTINCT product_type FROM Product; |
查询条件(WHERE)
代码块 | ||||
---|---|---|---|---|
| ||||
SELECT product_name, product_type FROM Product; WHERE product_type = '衣服'; |
算数运算符
- 加 +
- 减 -
- 乘 *
- 除 /
代码块 | ||||
---|---|---|---|---|
| ||||
SELECT product_name, sale_price, sale_price * 2 AS "sale_price_x2" |
...
FROM Product; |
比较运算符
- 等于 =
- 不等于 <>
- 大于 >
- 大于等于 >=
- 小于 <
小于等于 <=
代码块 | ||||
---|---|---|---|---|
| ||||
SELECT product_name, product_type, regist_date FROM Product WHERE regist_date < '2009-09-27'; -- 将算数运算符和比较运算符结合使用 SELECT product_name, sale_price, purchase_price FROM Product WHERE sale_price - purchase_price >= 500; -- 不能对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
(也就是sale_price<1000)
代码块 | ||||
---|---|---|---|---|
| ||||
SELECT product_name, product_type, sale_price FROM Product WHERE NOT sale_price >= 1000; |
- AND AND运算符在其两侧的查询条件都成立时整个查询条件才成立,其意思相当于“并且”。
AND运算符在其两侧的查询条件都成立时整个查询条件才成立,其意思相当于“并且”。
代码块 | ||||
---|---|---|---|---|
| ||||
SELECT product_name, purchase_price FROM Product WHERE product_type = '厨房用具' AND sale_price >= 3000 |
...
;
|
- OR
运算符在其两侧的查询条件有一个成立时整个查询条件都成立,其意思相当于“或者”。
代码块 | ||||
---|---|---|---|---|
| ||||
SELECT product_name, purchase_price FROM Product WHERE product_type = '厨房用具' OR sale_price >= 3000; |
分组聚合(GROUP BY)
- 常用的五个聚合函数:
- COUNT: 计算表中的记录数(行数)
- SUM: 计算表中数值列中数据的合计值
- AVG: 计算表中数值列中数据的平均值
- MAX: 求出表中任意列中数据的最大值
- MIN: 求出表中任意列中数据的最小值
代码块 | ||||
---|---|---|---|---|
| ||||
SELECT product_type, COUNT(*) FROM Product GROUP BY product_type; -- 计算某一列的行数(不包含NULL) SELECT COUNT(purchase_price) FROM Product; -- 计算删除重复数据后的行数 SELECT COUNT(DISTINCT product_type) FROM Product; -- SUM/AVG函数只能对数值类型的列使用,而MAX/MIN函数原则上可以适用于任何数据类型的列 SELECT MAX(regist_date), MIN(regist_date) FROM Product; |
...
GROUP BY和WHERE并用时SELECT语句的执行顺序: |
...
FROM → WHERE → GROUP BY → SELECT |
...
SELECT purchase_price, COUNT(*) FROM Product WHERE product_type = '衣服' GROUP BY purchase_price; |
...
为聚合结果指定条件(HAVING) |
...
SELECT product_type, COUNT(*) FROM Product GROUP BY product_type HAVING COUNT(*) = 2; |
数据排序(ORDER BY)
子句的书写顺序
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
- 子句的执行顺序: FROM
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
...
代码块 | ||||
---|---|---|---|---|
| ||||
SELECT product_id, product_name, sale_price, purchase_price FROM Product ORDER BY sale_price; |
...
- 升序(ASC)或降序(DESC) 注意:默认升序
...
代码块 | ||||
---|---|---|---|---|
| ||||
SELECT product_id, product_name, sale_price, purchase_price FROM Product ORDER BY sale_price DESC; |
数据插入(INSERT)
代码块 | ||||
---|---|---|---|---|
| ||||
-- 包含列清单 INSERT INTO Product (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20'); -- 省略列清单 START TRANSACTION; 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'); COMMIT; -- 从其他表中复制数据 INSERT INTO ProductCopy (product_id, product_name, product_type,sale_price, purchase_price, regist_date) SELECT product_id, product_name, product_type, sale_price, purchase_price, regist_date FROM Product; |
数据删除(DELETE)
代码块 | ||||
---|---|---|---|---|
| ||||
-- 清空表 DELETE FROM Product; -- 指定删除对象(搜索型DELETE) DELETE FROM Product WHERE sale_price >= 4000; |
数据更新(UPDATE)
代码块 | ||||
---|---|---|---|---|
| ||||
-- 更新整列 UPDATE Product SET regist_date = '2009-10-10'; -- 指定条件的更新(搜索型UPDATE) UPDATE Product SET sale_price = sale_price * 10 WHERE product_type = '厨房用具'; -- 多列更新 UPDATE Product SET sale_price = sale_price * 10, purchase_price = purchase_price / 2 WHERE product_type = '厨房用具'; |
...
进阶语句
视图
注意:定义视图时不能使用ORDER BY子句BY子句
代码块 | ||||
---|---|---|---|---|
| ||||
-- 创建视图(CREATE VIEW) CREATE VIEW ProductSum (product_type, cnt_product) AS SELECT product_type, COUNT(*) FROM Product GROUP BY product_type; -- 使用视图 SELECT product_type, cnt_product FROM ProductSum; -- 删除视图(DROP VIEW) DROP VIEW ProductSum; |
...
子查询(一次性视图)
代码块 | ||||
---|---|---|---|---|
| ||||
-- 在FROM子句中直接书写定义视图的SELECT语句 SELECT product_type, cnt_product FROM ( SELECT product_type, COUNT(*) AS cnt_product FROM Product GROUP BY product_type ) AS ProductSum; -- 在WHERE子句中使用标量子查询 SELECT product_id, product_name, sale_price FROM Product WHERE sale_price > (SELECT AVG(sale_price) FROM Product); -- 关联子查询 SELECT product_type, product_name, sale_price FROM Product AS P1 WHERE sale_price > (SELECT AVG(sale_price) FROM Product AS P2 WHERE P1.product_type = P2.product_type GROUP BY product_type); |
...
注意:
- 能够使用常数或者列名的地方,无论是SELECT 子句、GROUP BY 子句、HAVING 子句,还是ORDER BY 子句,几乎所有的地方都可以使用标量子查询。
- 这里起到关键作用的就是在子查询中添加的WHERE 子句的条件。该条件的意思就是,在同一商品种类中对各商品的销售单价和平均单价进行比较。
...
LIKE
BETWEEN
IS NULL和IS NOT NULL
EXIST和NOT EXIST
IN和 NOT IN
注意:在使用IN 和NOT IN 时是无法选取出NULL 数据的。
CASE表达式
代码块 | ||||
---|---|---|---|---|
| ||||
SELECT product_name, CASE WHEN product_type = '衣服' THEN CONCAT('A:', product_type) WHEN product_type = '办公用品' THEN CONCAT('B:', product_type) WHEN product_type = '厨房用具' THEN CONCAT('C:',product_type) ELSE NULL END AS abc_product_type FROM Product; |
表的加减法
- 表的加法(UNION)
代码块 | ||||
---|---|---|---|---|
| ||||
SELECT product_id, product_name FROM Product UNION SELECT product_id, product_name FROM Product2; |
通过UNION 进行并集运算时可以使用任何形式的SELECT 语句,WHERE、GROUP BY、HAVING 等子句都可以使用,但是ORDER BY 只能在最后使用一次。
...
MySQL不支持EXCEPT
以列为单位对表进行联结(JOIN)
- 内联结(INNER JOIN)
...
代码块 | ||||
---|---|---|---|---|
| ||||
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price FROM ShopProduct AS SP INNER JOIN Product AS P ON SP.product_id = P.product_id; |
...
像这样使用联结运算将满足相同规则的表联结起来时,WHERE、GROUP BY、HAVING、ORDER BY 等工具都可以正常使用.
- 外联结(OUTER JOIN)
...
- JOIN)
代码块 | ||||
---|---|---|---|---|
| ||||
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price FROM ShopProduct AS SP LEFT OUTER JOIN Product AS P ON SP.product_id = P.product_id; |
...
- 三张以上的表的联结
- 三张以上的表的联结
代码块 | ||||
---|---|---|---|---|
| ||||
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price,IP.inventory_quantity FROM ShopProduct AS SP INNER JOIN Product AS P ON SP.product_id = P.product_id INNER JOIN InventoryProduct AS IP ON SP.product_id = IP.product_id WHERE IP.inventory_id = 'P001'; |
DCL(Data Control Language,数据控制语言)
创建事务(START TRANSACTION) - 提交处理(COMMIT)
代码块 | ||||
---|---|---|---|---|
| ||||
START TRANSACTION; -- 将运动T恤的销售单价降低1000日元 UPDATE Product SET sale_price = sale_price - 1000 WHERE product_name = '运动T恤'; -- 将T恤衫的销售单价上浮1000日元 UPDATE Product SET sale_price = sale_price + 1000 WHERE product_name = 'T恤衫'; COMMIT; |
取消处理(ROLLBACK)
代码块 | ||||
---|---|---|---|---|
| ||||
START TRANSACTION; -- 将运动T恤的销售单价降低1000日元 UPDATE Product SET sale_price = sale_price - 1000 WHERE product_name = '运动T恤'; -- 将T恤衫的销售单价上浮1000日元 UPDATE Product SET sale_price = sale_price + 1000 WHERE product_name = 'T恤衫'; ROLLBACK; |