《SQL必知必会》万字精华
本文是《SQL必知必会》一书的精华总结,协助读者快速入门SQL或许MySQL,主要内容包括:
- 数据库基础知识
- 库表的相关操作
- 检索数据的方法
本文中带来的是第8产品批号是生产日期吗到13章,前面章节请参阅SQL必知必会总结1-第数据库体系概论第五版课后答案1到7章
汇总数据
集结函数
集结函数指的是对某些行运转的一个函数,并且回来一个值,常用的集结函数有:
函数 | 作用 |
---|---|
AVG() | 回来列的平均值 |
COUNT() | 回来列的函数 |
MAX() | 回来列的最大值 |
MIN() | 回来列的最小值 |
SUM() | 回来某列值之和 |
1、AVG()函笔记本电脑性价比排行2020数
SELECT AVG(prod_price) AS avg_price -- 求平均值
FROM Products;
上面求解的是悉数行各自的平均值,也能够指定某个特定的行来求解:
SELECT AVG(p数据库办理体系rod_price) AS avg_p笔记本cpu天梯图rice -- 求平均值
FROM Products
WHERE vend_id = 'DLLO1'; --产品密钥在哪里能找到 指定特定的行
笔记:AVG()函数会疏忽掉值NULL的行
2、COUNT()函数
COUNT()函数进行计数,能够运用它来确认表中的函数或许契合特定条件的行的数目,两种运用状况:
- count(*):不管是空值(NULL)还对错空值,都会核算进去
- count(column):对特定的列进行计数,会疏忽表该列数据库体系工程师的NULL值
SELECT COUNT(*) AS num_cust
FROM Customers笔记本电脑性价比排行2020;
num_cust
--------
5
SELECT CO数据库体系概论第五版课后答案UNT(cust_emai产品规划l) AS num_cust
FROM Customers;
num_cust
--------
3
笔记:假定指定列名mysql增修改查句子,则COUNT()函数会疏忽指定列的值为空的行,可是假定COUNT()函数运用的是星号,则笔记不会疏忽
3、MAX()/MIN()函数
回来指定列中的最大值或许最小值mysql面试题
SELECT MAX(prod_price) AS MAX_price -- 求最大值
SELECT MAX(prod_price) AS MIN产品质量法_price -- 求最小值
FRO笔记本cpu天梯图M Products;
笔记:上面的两个最值函数会主动疏忽掉值为NULL的行
4、SUM()函数
回来指定列值的和(总计)
SELECT SUM(qu笔记本电脑开机黑屏没反应怎样办antity) AS items_ordered
FROM OrderItems数据库体系
WHERE order_num = 20005;
SUM()函mysql增修改查句子数也可产品范畴的偏好以用来估计核算值:
SELECT SUM(item_price * quantity) AS total_price -- 回来悉数物品的价钱之和
FROM OrderItems
WHERE ormysql数据库der_num = 20005;
笔mysql优化记:SUM()笔记本电脑怎样连wifi函数会主动疏忽值为NULL的行
集结不同值
上面的5个集结函数都能够如下运用:
- 对悉数的行实施核算,mysql优化指定ALL参数或不指定参数(因为ALL是默许行为)产品批号是生产日期吗
- 只包括不同的值,指定DISTINCT参数,表明去重之后再进行核算
笔记:ALL参数不需求指定,是默许行为
SELECT AVG(数据库体系工程师DISTINCT prod_price) AS avg_p产品介绍rice -- 去重之后再求平均值
FROM Products
WH数据库办理体系ERE vend_id = 'DLLO1'; -- 指定特定的行
笔记:
1、DISTINCT不能用于COUNT(*);假定指定列名,则DISTINCT只能用于COUNT()
2、DISTINCT有必要笔记本cpu天梯图运用列名,不能用于核算或许表达式
3、DISTINCT用于MAX()和MIN()意义不大,因为最值不管是否考虑去重,都是相同的
组合集结产品介绍函数
在SELECT子句mysql数据库命令大全中是能够包括多个集结函数
SE产品运营LECT
AVG(prod_price) AS avg_笔记本电脑开不了机price -- 求平均值
,MAX(prod_price) AS ma数据库是什么x_price -- 求最大值
,MIN(prod_price) AS min_price -- 求最小值
,COUNT(*) AS num_items -- 物品的数目
FROM Products;
分组数据
分组运用的是两个子句:
- GROUP BY()
- HAVING()
创立分组
分组是运用S数据库规划ELECT子产品密钥在哪里能找到句的GROUP BY子句树立的,看个笔记比如:
SELECT
ve数据库是什么nd_id
,COUNT(*) AS num_prods
FROM Product数据库s
GROUP BY vend_id; -- 分组的列
GROUP BY子句运用时分的常见规定:
- GROUP BY子句能够包括任意数目的列,能够对分组进行嵌套
- GROUP BY子句中列出的每一列都是检索列或许有用的表达式(可是不能是集结函数)
- 假定在SELECT中运用表达式,则有必要在GROUP数据库办理体系 BY子句中运用相同的表达式,而不是运用别号
- 除了集结函数外,SELECT句子中的每列都有必要在GROUP BY子句中列出
- 假定分组mysql装置装备教程中数据库包括具有NULL的行,则NULL将作为一个分组回来;假定列笔记中出现多个N产品运营U笔记本电脑排名前十LL,它们将分红一个组
- GROU产品密钥在哪里能找到P BY子句有必要在WHERE子句之后,ORDER BY子句之前
- GROUP BY子句中产品范畴的偏好能够运用相对方位:GROUP BY 2, 1 表明先依据第二个列分组,再依据第一个列分组
过滤分组
在WHERE子句中指定过滤的是行而不是分组;实践MySQL上WHERE种并没有分组的概念。在SQL运用HAVING来结束过滤分组;
笔记:WHERE过滤行,HAVING过滤分组
SELECT
cust_id
,COU产品生命周期NT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2; -- 过笔记滤分组
WHERE和HAVING的差异:
- WHERE在数据过滤前分组,清扫的行不在分组核算中
- HAVING在数据分组后进行过滤
SELECT
vend数据库体系工程师_id
,COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 4 -- 分组前先实施,找出符笔记本电脑排名前十合条件的数据
GROUP BY vend_id
HAVING COUNT(*笔记本电脑开机黑屏没反应怎样办) >= 2; -- 分组后再实施,找出数目大于2的数据
分组和排序
OR笔记本电脑什么牌子好DER BY 和GROUP BY的差异:
ORDER BY | GROUP BY |
---|---|
对发生的输出排序 | 对行分组,但输出或许不是分组的次序 |
任意列都能够运用(非挑选的列也能够运用) | 只或许运用挑选列或许表达式列,并且有必要运用每个挑选列表达式 |
不一定需求 | 假定和集结函数一笔记本电脑什么牌子好同运用列,则有必要运用 |
SELECT
order_num
,COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT数据库体系概论(*) >= 3
ORDER BY items, order_num; -- 先数据库原理分组再过滤,毕竟排序输出
SELECT子句次序
在这里总结一下SELECT子句的相关次产品规划第:
子句 | 阐明 | 是否有必要运用 |
---|---|---|
SELECT | 要回来的列或许表达式 | 是 |
FROM | 从中检索数据的表 | 仅在从表挑选数据时运用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组阐明 | 仅在按照组核算集结时运用 |
HAVINGmysql装置 | 组级过滤 | 否 |
ORDER BY | 输出排序次序 | 否 |
运用子查询
任何SELECT句子都是查询,SQL还答mysql暗码忘记了怎样办应在查询中嵌套查询。
SELECT cust_id -- 再依据子查询中的order_num找出契合要求的cust_id
FROM Orders
WHERE order_num IN (SELECT order_num -- 先依据WHERE条件找出满足契合要求的order_num笔记本电脑性价比排行2020
FROM OrderItems
WHERE prod_id = 'RGAN01');
笔记:子查询总是从内向外处理
SE数据库体系概论第五版课后答案LECT Customers -- 毕竟依据找出的cust_idmysql索引查询Customemysql暗码忘记了怎样办rs
FROM cust_id IN(SEL产品范畴的偏好ECT cust_id -- 再依据子查询中的order_num找出契合要求的cust_id
F产品范畴的偏好ROM Orders
WHERE order_num IN (SELECT order_num -- 先依据WHERE条件找出满足契合要求的order_产品批号是生产日期吗num
FROM OrderItems
WHERE prod_id = 'RGAN01'));
作为核算字段运用子查询
运用子查询的另一个方法是创立核算字段
SELECT
cust_name
,cust_state
,(SELECT COUNT(*) -- 将子查询作为一个核算字段输出:核算每个c笔记本电脑什么牌子好ust_id的数量
FROM Orders
WHERE O产品规划rders.cust_id = Customers.cust_id) AS orders -- Orders.cust_id = Customers.cust_id 运用完全限制列名产品介绍来防止歧义
FROM Customers
ORDER BY cust产品规划_name;
联合表
SQL最健壮数据库是什么的功用就是数据查询的过程笔记本电脑性价比排行2020中运用联合表(join)。
创立联合
通过指定要联合的表和它们的联合方法即可创立联合。
SE产品介绍LECT
vend_nam产品规划e,
prod_name,
prod_price
FROM Vendors, Products
WHERE Vendors.mysql怎样读vend_id = Products.vend_id; -- 指定联合条件
假定上面的代码中没有WHERE子句来指定联合条件,则回来的是笛卡尔积,回来出来数的行就是第一个表中的行乘以第二个表中的行。
笔记:回来笛卡尔积的联合,也称做叉联合cross join
内联合inner join
运用最广泛的联合是等值联产品生命周期合,也称之为内联合inner join。结束上面句子的内联合代码:
SELECT
vend_name,
prod_name,
prod_pri数据库ce
FROM Vendormysql索引s
INNER J数据库是什么OIN Products -- 内联合
ON Vendors.vend_id = Products.vend_id; -- 指定联合条笔记件
联合多个表
SELECT
vend_namysql装置装备教程me,
prod_name,
promysql索引d_price
Fmysql怎样读ROM Order产品规划Items, Products,产品经理 Ven数据库体系的特色dors
WHERE Produc笔记本电脑怎样连wifits.vend_id = Vendors.vend_id -- 多个表的联合
AND Order数据库体系概论第五版课后答案Items.prod_id = Products.prod_id
AND order_num = 20007;
我们通过联合方法来结束子查询的作用:
-- 子查询
SELECT Customers -- 毕竟依据找出的cust_id查询Customers
FROM cust_id IN(SELECT cust_id -- 再依据子查询中的order_num找mysql数据库命令大全出契合要求的cust_id
FROM Orders
WHERE order_num IN (SELECT order_num -- 先依据WHERE条件找出满足契合要求的order_num
FROM OrderItems
WHERE prod_id = 'RGAN01笔记本电脑排名前十'));
-- 内联合
SELECT
cust_name,
cust_contact
FROM Customers, Ordermysql增修改查句子s, OrderItems
WHERE Customers.cust_id = Orde数据库体系rs.cust_id -- 多个表联合查询
AND OrderItems.order_num产品生命周期 =数据库体系工程师 Orders.order_num
AND prod_id = 'RGAN01'
创立高级联合
运用表别号
在SQL句子中能够给表取别号:
SELECT
cust_name,
cust_contact
FROM Customers AS C, Orders AS O, OrderItems AS OI -- 取别号,看上去更简练
WHERE C.cust_id = O.cust_id -- 多个表联合查询
AND OI.orde数据库体系的特色r_num =产品介绍 O.ordemysql装置装备教程r_num
ANDMySQL prodmysql装置_mysql怎样读id = 'RGAN01'
运用不同类型的联合
介数据库体系的特色绍3种不同的联合:
- 自联合s笔记本电脑排名前十elf join
- 天然联合natural join
- 外联合outer join
1、自联合self join
-- 子查询
SELECT cust_i笔记本cpu天梯图d,cust_name,cust_contact
FROM Customers
WHER数据库原理E cust_name = (SELECT cust_nam数据库体系概论第五版课后答案e
FROM Customers
WHERE cust_contact = 'Jim Jones');
-- 内联合
SELECT c1.cust_i数据库原理d, c2.cust_name, c1.cust_contact
FROM Cmysql增修改查句子ustommysql装置ers AS c1, Customers AS c2 -- 相同的表运用两次
WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = 'Jim Jones';
上面运用了Customers表两次,为了防止歧义,有必要运用不同的别号加以区别。
2、天然联合
不管何时对表进行联合,应该至少有一列不止出现在一个表中(被联合的列)。天然联合清扫多次出现,是每一列只回来一次。
SELECT
C.*
,O.order_num
,O.order_date
,OI.prod_id
,OI.quantity
,OI.item_price
FROM Customers AS C, Orders AS O, OrderItems AS OI
WHERE C.cust_id = O.cust_id -- 多个表联合查询
AND OI.order_num = O.order_num
AND prod_id = 'RGAN01'
3、外联合
有时分我mysql怎样读们需求将一个表中的行和另一个表中行相相关,可是产品介绍有产品范畴的偏好时分也需求包括那些没有相关行的行数据库体系工程师记载,比如下面的场景中:
- 对每个顾客下的订单数进行核算,包括那些至今没有下单的顾客
- 列出悉数产品以及订购数量,包括没有人订购的产品
- 核算平均出售规划,包括那些至今没有下订单的顾客
当联合中包笔记本电脑什么牌子好含了那些在相关表中没有相关行的行,这种联合称之为外联合mysql怎样读。比如:检索出包括没有订单顾客在内的悉数顾客。
SELECT
C.cust_id
,O.order_num
FROM Customers AS C
LEFT OUTER JOIN Orders AS O -- 外联接
ON Customers.cust_id = Orders.cust_id
上面的代码中表明包括左面悉数行笔记的记载;假定是右边,数据库体系概论第五版课后答案运用RIGHT OUTER。因此外联合实践上有两种方式,它们之间能够交换
- 左外联合
- 右外联合
还有一种比较特别的外联合,叫做全外联合full outer join,它检索的是两个表中的悉数行并相关那些能够相关的行。全外联合包括两个表的不mysql优化相关的行
SELECT
C.cust_id
,O.or笔记本der_num
FROM Custom笔记本电脑排名前十ers AS C
FULL OUTER JOI笔记本电脑开不了机N Orders AS O -- 外联接
ON Customermysql优化s.cusmysql优化t_id = Orders.cust_id
带有集结函数的联合
检索悉数顾客及每个顾客悉数的订单数:
SELECT
C.cust_id
,COUNT(O.order_num) AS num_ord -- 运用集结函数核算订笔记本电脑排名前十单数
FROM Customers AS C数据库是什么
INNER JOIN Orders
ON C.cust_id = O.cust_id -- 相关两个表
GROUP BY Customers.cust_id -- 分组
运用联合和联合条件
总结一mysql优化下联合和运用要害:
- 留意运用联合的类型:一般是运用内联合,有时格外联合有有用
- 要保证运用正确的联合条数据库规划件,否则会回来不正确的数据
- 记住供给联合条件,否则回来的是笛卡尔积
- 一个联合中能够包括多个表,乃至能够对不同的表运用不同的联合类型。要留意检验每个联合