从零开始学习SQL,在这里分享自己的笔记,主要通过自己看的、做的例题映射知识点。入门级SQL 应知应会Key Point与例题。虽然这个笔记不是最全面深入的,但一定必含小白入门必懂基础要点(非常基础),还有常常不小心就会踩的坑都在这里了,主要针对知识点在实际应用中的理解。数据练习可以自己找其他做比如SQLZOO。
可乐:SQL ZOO习题笔记
由于这里有些语句打出来无法突出,采取截图,层次展现更直观清晰。 刚开始看的内容有限,待学习完后,希望能分享出系统的笔记,会在这里持续更新。
PART 1 查询基础
2.字符串日期 使用 ' ' ;数字无需单引号,直接书写
3.数据库创建 CREATE DATABASE Shop;
4.SELECT
常数查询(可理解为赋值)
选择记录:WHERE
可以不选取出作为查询条件的列
2.算术运算符 :+ — * /
-- 所有包含 NULL 的计算,结果肯定是 NULL 。
3.比较运算符: <>
- 思考:如下对字符串使用大于等于或者小于等于不等号时会得到什么样的结果?(字典顺序)
- 不能对 含 NULL 列 使用比较运算符(用IS NOT NULL)
4.逻辑运算符
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中的逻辑运算是包含对真、假和不确定(UNKNOW)进行运算的三值逻辑。
含有 NULL 时的真值:
part2 聚合&排序
聚合?指将多行汇聚成一行
- 聚合函数会将 NULL 排除在外。但 COUNT (*)例外,并不会排除 NULL 。
- COUNT(*) 会得到含 NULL 的数据行数,而 COUNT (列名) 会得到 NULL 外的数据行数。
- 聚合函数只能跟在SELECT子句后
聚合函数:
COUNT : 计算表中的记录数(行数)
SELECT COUNT(*), COUNT(col_1)
FROM NullTbl;
SUM/AVG:不用于字符串类型数据
SELECT SUM(sale_price), SUM(purchase_price)
FROM Product;
MAX/MIN:适用于任何数据类型的列。即只要是能够排序的数据,就肯定有最大值和最小值。
part 3
1.表
表的创建 (表名不能重复,名称必须以英文开头)
CREATE TABLE Product
(product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
sale_price INTEGER DEFAULT 0,
regist_date DATE ,
PRIMARY KEY (product_id));
表的删除与更新
2.表中数据
向表中插入数据:INSERT INTO VALUES
INSERT INTO Product (product_id, product_name, sale_price, regist_date) VALUES ('0005', ' 锅 ', DEFAULT, '2009-01-15');
-- 对表进行全列 INSERT 时,可以省略表名后的列清单。即INSERT INTO Product VALUES( );
Duplicate data:INSERT INTO SELECT FROM
-- 将商品表中的数据生成新列复制到商品复制表中
INSERT INTO ProductType (product_type, sum_sale_price, sum_purchase_price)
SELECT product_type, SUM(sale_price), SUM(purchase_price)
FROM Product
GROUP BY product_type;
--INSERT 语句的 SELECT 语句中,可以使用 WHERE 子句或 GROUP BY 子句等任何SQL语法 (但使用 ORDER BY 子句并不会产生任何效果,因为无法保证表内部记录的排列顺序)
对查询结果数据进行排序 :ORDER BY
▲子句的书写顺序
1. SELECT 子句 → 2. FROM 子句 → 3. WHERE 子句 → 4. GROUP BY 子句 →5. HAVING 子句 → 6. ORDER BY 子句
降序(默认升序ASC):SELECT *
FROM Product
ORDER BY regist_date DESC, sale_price;
辨: ORDER BY 子句中可使用 SELECT 子句中定义的别名
ORDER BY 子句中可使用 SELECT 子句中未使用的列和聚合函数。
排序键中包含 NULL 时,会在开头或末尾进行汇总。
对数据进行分组:GROUP BY(切蛋糕的刀)
GROUP BY 聚合键(分组列)
聚合键中包含 NULL 时,在结果中会以“不确定”行(空行)的形式表现出来。
▲GROUP BY 和 WHERE 并用时 SELECT 语句的执行顺序
FROM → WHERE → GROUP BY → SELECT
使用聚合函数时, SELECT 子句中只能存在以下三种元素。
● 常数:数字 123,或者字符串 ' 测试 ' 这样写在 SQL 语句中的固定值
● 聚合函数
● GROUP BY 子句中指定的列名(也就是聚合键)
NOTE:把聚合键之外的列名书写在 SELECT 子句之中.X
GROUP BY 子句时, SELECT 子句中不能出现聚合键之外的列名。
GROUP BY 子句的结果随机排序
-- 用WHERE 子句指定条件时不能跟聚合函数,HAVING出现。
辨:“想要删除选择结果中的重复记录”时使用 DISTINCT ,
“想要计算汇总结果”时使用 GROUP BY 。
辨析HAVING 与WHERE
HAVING 子句的构成要素:常数、聚合函数、聚合键
SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type
HAVING COUNT(*) = 2;
辨:聚合键所对应的条件不应写在 HAVING 子句当中,而应写在 WHERE 子句当中。
数据的删除 : DROP; DELETE FROM
① DROP TABLE 语句可以将表完全删除
② DELETE 保留数据表,仅删除全部数据行
DELETE FROM Product
WHERE sale_price >= 4000;
-- 确认删除后的结果
SELECT * FROM Product;
NOTE:① DELETE 语句中不能用 GROUP BY 、HAVING 和 ORDER BY 三类子句,只能用 WHERE 子 句。 (理解:删除后条件查询、排序等失效)
② 只能删除表中全部数据的 TRUNCATE Product;
数据重复行的删除:SELECT DINSTINCT FROM
-- DISTINCT 关键字只能用在第一个列名之前。不能写成 r _ date , DISTINCT p _type 。
可使用聚合函数删除重复值
SELECT SUM(DISTINCT sale_price)
FROM Product;
数据的更改(更新):UPDATE SET WHERE
UPDATE Product
SET sale_price = sale_price * 10,
purchase_price = purchase_price / 2
WHERE product_type = ' 厨房用具 ';
-- 确认更新内容
SELECT * FROM Product ORDER BY product_id;
使用 NULL 进行更新
UPDATE Product
SET regist_date = NULL
WHERE product_id = '0008';
NOTE:使用 UPDATE 语句可以将值清空为 NULL (但只限于未设置 NOT NULL 约束的列)。
PART 4 视图 (CREATE VIEW AS )与复杂查询
表:通过 INSERT 语句将数据保存到数据库之中,而数据库中的数据实际上会被保存到计算机的存储设备(通常是硬盘)中。
视图保存的是从表中取出数据所使用的 SELECT 语句(了解,不用区分)
1 创建视图
视图的限制:
① ——定义视图时不能使用 ORDER BY 子句
② 视图和表需要同时进行更新,因此通过汇总得到的视图无法进行更新。
2 子查询:一次性视图( SELECT 语句)
根据商品种类统计商品数量的视图:
标量子查询:必须而且只能返回表中某一行的某一列的值
标量子查询的书写位置并不仅仅局限于 WHERE 子句中,通常任何可
以使用单一值的位置都可以使用。也就是说,能够使用常数或者列名的
地方,无论是 SELECT 子句、 GROUP BY 子句、 HAVING 子句,还是
ORDER BY 子句,几乎所有的地方都可以使用。
在 WHERE 子句中使用子查询时,该子查询的结果必须是单一的。
关联子查询:(细切分的组内进行比较时使用)
关联子查询按照商品种类对平均销售单价进行比较
Question编写一条 SQL 语句,创建一幅包含如下数据的视图(名称为 AvgPriceByType )。
answer
PART 5函数 谓词
谓词:LIKE、OR 、IN 、BETWEEN 、EXISTS(记录)
谓词的作用就是“判断是否存在满足某种条件的记录”。如果存在这样的记录就返回真( TRUE ),如果不存在就返回假( FALSE )。
IN 谓词—— OR 的简便用法
eg:
通常指定关联子查询作为 EXIST 的参数。
作为 EXIST 参数的子查询中经常会使用 SELECT * 。
case
CASE 表达式可进行行列转换
PART6 表的加减法与联结
1,加减法:以行方向为单位进行操作,即增加记录行数
SELECT product_id, product_name
FROM Product
UNION
SELECT product_id, product_name
FROM Product2
ORDER BY product_id;
-- UNION 等集合运算符通常都会除去重复的记录。使用UNION ALL 选项,可以保留重复行。
-- 选取表中公共部分—— INTERSECT(交集) ;
--减法运算(注意被减数与减数位置) EXCEPT (差集)
条件:列数必须相同,列的类型必须一致, ORDER BY 子句只能在最后使用一次
2 联结:以列为单位对表进行联结
内联结:eg
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 SP.shop_id = '000A';
3张表联结:
--进行联结时需要在 FROM 子句中使用多张表。
ON (联结键),要书写在 FROM 和 WHERE 之间。
SELECT 子句中的列需要按照“ < 表的别名 > . < 列名 > ”的格式进行书写。
外联结 ——选取出单张表中全部的信息
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price
FROM ShopProduct AS SP RIGHT OUTER JOIN Product AS P
ON SP.product_id = P.product_id;
--指定主表的关键字是 LEFT 和 RIGHT