Day 35 (MySQL)

1.抓资料 > 汇入

CREATE DATABASE 后汇入
https://github.com/bradchao/MySQL2021/blob/master/MySQLTutor/northwind_brad.sql

http://img2.58codes.com/2024/20137684ZD6DySy29E.png


2.汇入错误 wrpracti_northwind

建资料库后才能放TABLE

3.语法 (抓资料)

伺服器: localhost:3306 »资料库: northwind_v2 »资料表: employees

(1)查看职称, FirstName, LastName 依照职称排序, 再依照 FirstName 反向排序

SELECT Title,FirstName ,LastName FROM `employees`ORDER BY Title ,FirstName DESC

ORDER:排序
DESC:反向
ESC:正向(不常用,预设)

(2)哪些员工不是业务代表 'Sales Representative'

SELECT Title, FirstName, LastName FROM EmployeesWHERE Title <> 'Sales Representative'

WHERE:塞选(条件)

(3)哪些员工其 Region 资料为IS(或不为 IS NOT ) NULL

SELECT Title,FirstName ,LastName ,Region FROM `employees` WHERE Region IS NULL
SELECT Title,FirstName ,LastName ,Region FROM `employees` WHERE Region IS NOT NULL

WHERE:塞选(条件)

(4)英文资料适用,塞选N之后的资料

SELECT LastName FROM `employees` WHERE LastName >= 'n'ORDER BY LastName

ORDER:排序
WHERE:塞选(条件)

LastName >= 'N' 是什么意思吗? => 78
NA, P...

(5)显示商品名称, 库存量(UnitsInStock), 订单量(UnitsOnOrder), 安全库存量(ReorderLevel)

SELECT ProductName, UnitsInStock ,UnitsOnOrder ,ReorderLevel FROM `products`

(6)显示商品名称, 库存量(UnitsInStock)少于安全库存量(ReorderLevel)

(该进货了)

SELECT ProductName, UnitsInStock ,UnitsOnOrder ,ReorderLevel FROM `products`WHERE UnitsInStock <= ReorderLevel

WHERE:塞选(条件)

(7)显示商品名称, 库存量(UnitsInStock)-订单量(UnitsOnOrder)少于安全库存量(ReorderLevel)

(该进货了)

SELECT ProductName, UnitsInStock ,UnitsOnOrder ,ReorderLevel FROM `products`WHERE UnitsInStock - UnitsOnOrder <= ReorderLevel
SELECT Discount FROM `orderdetails` WHERE Discount > 0

WHERE:塞选(条件)

伺服器: localhost:3306 »资料库: northwind_v2 »资料表: orders

(8)订单中显示出:超过需求日期才寄出的订单 RequiredDate(需求日)ShippedDate(寄出日)

(谁晚寄)

SELECT EmployeeID, OrderID, CustomerID, RequiredDate, ShippedDate FROM `Orders`WHERE ShippedDate > RequiredDate

日期比对似字串比对
原始资料结构:datetime:只会有日期,不会有时分秒
WHERE:塞选(条件)

(9)两个以上栏位资料相加形成一个栏位资料(字串相加,中文比较常用到)

SELECT concat(FirstName,'',LastName) FROM `employees`

concat:字串相加

伺服器: localhost:3306 »资料库: northwind_v2 »资料表: orders

(10)计算(有先乘除后加减)

10-1

SELECT OrderID, Freight, Freight*1.1 FROM `orders`

Freight, Freightx1.1:运费、运费计算x10%(手续费)

10-2

SELECT OrderID, Freight, Freight*1.1 AS FreightTotal FROM `orders`;

FreightTotal:运费+运费计算x10%(手续费)
(AS可略)

10-3

SELECT OrderID, Freight, Freight*1.1 AS FreightTotal FROM OrdersWHERE Freight*1.1 >= 500

WHERE:塞选(条件)

(11)算出优惠价格

SELECT UnitPrice, Quantity ,UnitPrice*Quantity*(100-Discount)/100 AS Price FROM `orderdetails`

(100-Discount)/100:折扣

伺服器: localhost:3306 »资料库: northwind_v2 »资料表: orderdetails

(12)SUM:加总

SELECT OrderID ,ProductID ,Quantity FROM `orderdetails`WHERE ProductID = 3 ;

总销售量

SELECT SUM(Quantity) totalQty FROM `orderdetails`WHERE ProductID = 3 ;

SUM:加总

伺服器: localhost:3306 »资料库: northwind_v2 »资料表: employees

(13)统计各城市的员工数量(群组后统计)

SELECT City, COUNT(EmployeeID) FROM `employees` GROUP BY City

等同

SELECT City, COUNT(EmployeeID) AS NumsEmployee FROM `employees` GROUP BY City

GROUP:群组(与ORDER不同,ORDER只是排序)
COUNT:各自有几个

(14)只列出>1的城市

SELECT City, COUNT(EmployeeID) AS NumsEmployee FROM `employees` GROUP BY CityHAVING COUNT(EmployeeID) > 1

HAVING:用在GROUP BY后的筛选
COUNT:各自有几个

(15)业务代表 'Sales Representative' 中各个城市员工数量小于 3

SELECT City, COUNT(EmployeeID) AS NumsOfEmployee FROM `employees` WHERE Title = 'Sales Representative'GROUP BY CityHAVING NumsOfEmployee < 3

WHERE:条件式
COUNT:各自有几个
HAVING:用在GROUP BY后的筛选

(16)列出员工表中的城市, 不重複

SELECT DISTINCT City FROM Employees ORDER BY City

显示出员工表中有几个City

SELECT COUNT(DISTINCT City) FROM Employees

COUNT:各自有几个
DISTINCT:不同的

(17)OrderDetail 各个商品的总销售量

SELECT ProductID, SUM(Quantity) AS TotalQty FROM OrderDetailsGROUP BY ProductID

SUM:加总
GROUP:群组(与ORDER不同,ORDER只是排序)
TotalQty:自订

(18)OrderDetail 各个商品的总销售量 小于 200 单位

SELECT ProductID, SUM(Quantity) AS TotalQty FROM OrderDetails GROUP BY ProductID HAVING SUM(Quantity) < 200

HAVING SUM(Quantity) < 200:群组化后的筛选 后相加 < 200

(19)统计各个商品的平均单价

SELECT ProductID, AVG(UnitPrice) AS AvgPrice FROM OrderDetailsGROUP BY ProductIDHAVING AVG(UnitPrice) > 70ORDER BY AvgPrice

AVG:平均
AvgPrice:自订
HAVING:用在GROUP BY后的筛选

伺服器: localhost:3306 »资料库: northwind_v2 »资料表: orders

(20)统计各个客户的订单数

SELECT CustomerID, COUNT(OrderID) AS Nums FROM Orders GROUP BY CustomerID HAVING COUNT(OrderID) > 15ORDER BY Nums DESCLIMIT 5

COUNT:各自有几个
LIMIT:只显示几个
Nums:自订
DESC:反向

(21)运费取小数点一位并四捨五入

SELECT Freight, ROUND(Freight, 1) AS F2, ROUND(Freight, 2) AS F3 FROM Orders
SELECT Freight, ROUND(Freight, 1) AS F2, ROUND(Freight, 2) AS F3,  ROUND(Freight, 0) AS F4,ROUND(Freight, -1) AS F5FROM Orders

原始资料结构:decimal(10,4)小数点后第四位
ROUND(Freight, 1):小数点第一位
ROUND(Freight, -1):取十位数(个位数0)
F2、F3:自订

(22)

员工入职年龄_V1

SELECT LastName, BirthDate ,BirthDate,YEAR(HireDate)-YEAR(BirthDate) AS HireDate FROM `employees`

YEAR:年

员工入职年龄_V2

SELECT LastName, BirthDate, HireDate,YEAR(HireDate) - YEAR(BirthDate) AS HireAge1,ROUND(DATEDIFF(HireDate,BirthDate)/365,0) AS HireAge2 FROM Employees

DATEDIFF:几日
ROUBND四捨五入(,0)第几位

(23)算几天

SELECT DATEDIFF ('2021-03-01','2021-02-01')

DATEDIFF:几日

(24)员工几月生日

SELECT MONTH(BirthDate), DATE_FORMAT(BirthDate,'%m-%d-%Y') FROM Employees
SELECT FirstName, LastName,MONTH(BirthDate) AS M1, DATE_FORMAT(BirthDate,'%m') AS M2FROM EmployeesORDER BY M2
SELECT FirstName, LastName,BirthDate,EXTRACT(YEAR FROM BirthDate)FROM EmployeesORDER BY EXTRACT(MONTH FROM BirthDate)

DATE_FORMAT:格式化
'%m-%d-%Y':月日年
EXTRACT:萃取

(25)子查询 (FROM需大写)

// Orders 中 OrderID = 10280 中的 CustomerID = ?

SELECT CustomerID FROM OrdersWHERE OrderID = 10280

// COMMI
// Customers 中 CustomerID = 'COMMI' 的公司名称为?

// 合成以下

SELECT CompanyName FROM Customers       //查询最终目标WHERE CustomerID = (SELECT CustomerID FROM Orders   //子查询WHERE被塞进去条件WHERE OrderID = 10280)

Customers内的CustomerID 与
Orders CustomerID 有关 并从里面抓 OrderID =10280

// 合成以下_v2

SELECT CompanyName FROM Customers        //查询最终目标WHERE CustomerID IN (                    //多个用INSELECT CustomerID FROM OrdersWHERE OrderID = 10280 OR OrderID = 10270 OR OrderID = 10290)

//_v2错误

SELECT CompanyName FROM Customers     //查询最终目标WHERE CustomerID = (      //此处的=、is 都只能有一个,多个用INSELECT CustomerID FROM OrdersWHERE OrderID = 10280 OR OrderID = 10270 OR OrderID = 10290)

(26)子查询:1997 年中有下订单的客户公司名称列出来

思考:1997 有订单的客户 => Group By

SELECT CompanyName FROM Customers WHERE CustomerID IN (    SELECT CustomerID FROM Orders    WHERE OrderDate BETWEEN '1997-01-01' AND '1997-12-31'    GROUP BY CustomerID   )

BETWEEN...AND:介于

(27)子查询:供应商Tokyo Traders, Mayumi's, Svensk Sjfda的公司ID及供应哪些商品

公司ID

SELECT SupplierID FROM `suppliers` WHERE `CompanyName` IN ('Tokyo Traders',"Mayumi's",'Svensk Sjfda AB')

''=""

SupplierID(供应哪些商品)

SELECT productName, SupplierID FROM products WHERE `SupplierID` IN (    SELECT SupplierID FROM `suppliers`     WHERE CompanyName IN     ('Tokyo Traders',"Mayumi's",'Svensk Sjfda AB'))

(28)子查询:Seafood => ?

SELECT Suppliers.CompanyName FROM Suppliers WHERE SupplierID IN (    SELECT SupplierID FROM Products    WHERE CategoryID IN (        SELECT CategoryID FROM Categories        WHERE Categories.CategoryName = 'Seafood'    ))

CompanyName在Suppliers抓
1.连接
SupplierID Suppliers
SupplierID Products
2.再连接
CategoryID Categories

(29)Join => 所有订单的员工名字(表单内有同样抬头才能这样抓)

SELECT Employees.EmployeeID, Employees.FirstName, Orders.OrderID, Orders.OrderDateFROM Orders JOIN Employees ON (Employees.EmployeeID = Orders.EmployeeID)ORDER BY Orders.OrderDate

表别名的方式:

SELECT e.EmployeeID, e.FirstName, o.OrderID, o.OrderDateFROM Orders o JOIN Employees e ON (e.EmployeeID = o.EmployeeID)ORDER BY o.OrderDate

JOIN ON:表合併


4.如果未来就业DBA 有需要甚么证照吗?类似MCTS或者ORACLE OCA证照吗?

重点是写考古题,证照顺便去考就好


5.查询语法的处理顺序,为何要强调这些语法的排序?文法、语法

SELECT ... FROMWHEREGROUP BY ... HAVING(群组化后的筛选)ORDER BYLIMIT

6.SUM跟COUNT差异

Sum => 数值加总
Count => 笔数加总
1 => 38
2 => 44
SELECT ProductID, COUNT(OrderID), SUM(UnitPrice), AVG(UnitPrice) FROM OrderDetails
GROUP BY ProductID
HAVING ProductID <= 2


7.w3school上面navbar还有一个SQL 跟现在在看的这边的MySQL有差别吗?

https://www.w3schools.com/sql/
还是有差异,SQL是统称
https://www.w3schools.com/sql/sql_autoincrement.asp


8.作业

(1)哪些公司的总销售额是>10000=>

SELECT c.CompanyName, SUM(od.UnitPrice * od.Quantity) AS sumPriceFROM customers c     JOIN orders o ON(c.CustomerID = o.CustomerID)     JOIN orderdetails od ON ( o.OrderID = od.OrderID)GROUP BY c.CustomerIDHAVING sumPrice > 10000ORDER BY sumPrice DESC

customers = c
orderdetails = od
orders = o

JOIN ON一样才能抓再一起
c.CustomerID = o.CustomerID抓在一起
o.OrderID = od.OrderID 抓在一起

(2)哪些公司的单一商品销售额是>10000=>

SELECT c.CompanyName,o.OrderID,od.UnitPrice * od.QuantityFROM customers c     JOIN orders o ON(c.CustomerID = o.CustomerID)     JOIN orderdetails od ON ( o.OrderID = od.OrderID)WHERE od.UnitPrice * od.Quantity >10000

(3)哪些公司的单一订单销售额是>10000=

SELECT c.CompanyName, o.OrderID , SUM(od.UnitPrice * od.Quantity) AS sumPriceFROM customers c     JOIN orders o ON(c.CustomerID = o.CustomerID)     JOIN orderdetails od ON ( o.OrderID = od.OrderID)GROUP BY c.CustomerID , o.OrderIDHAVING sumPrice > 10000ORDER BY sumPrice DESC

9.GROUP BY使用时机

SUM()、AVG()、COUNT(),计算都要+()


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章