SQL 練習/電腦商店
外觀
< SQL 練習
請注意,給定的資料型別是 SQLite 資料型別。
PK 和 FK 分別代表主鍵和外部索引鍵。
1. 選擇商店中所有產品的名稱。
點選檢視解決方案
SELECT Name FROM Products;
2. 選擇商店中所有產品的名稱和價格。
點選檢視解決方案
SELECT Name, Price FROM Products;
3. 選擇價格小於或等於 $200 的產品的名稱。
點選檢視解決方案
SELECT Name FROM Products WHERE Price <= 200;
4. 選擇價格在 $60 到 $120 之間的產品。
點選檢視解決方案
/* With AND */
SELECT * FROM Products
WHERE Price >= 60 AND Price <= 120;
/* With BETWEEN */
SELECT * FROM Products
WHERE Price BETWEEN 60 AND 120;
5. 以美分顯示名稱和價格(即,價格必須乘以 100)。
點選檢視解決方案
/* Without AS */
SELECT Name, Price * 100 FROM Products;
/* With AS */
SELECT Name, Price * 100 AS PriceCents FROM Products;
6. 計算所有產品的平均價格。
點選檢視解決方案
SELECT AVG(Price) FROM Products;
7. 計算製造商程式碼等於 2 的所有產品的平均價格。
點選檢視解決方案
SELECT AVG(Price) FROM Products WHERE Manufacturer=2;
8. 計算價格大於或等於 $180 的產品數量。
點選檢視解決方案
SELECT COUNT(*) FROM Products WHERE Price >= 180;
9. 選擇所有價格大於或等於 $180 的產品名稱和價格,並首先按價格(降序),然後按名稱(升序)排序。
點選檢視解決方案
SELECT Name, Price
FROM Products
WHERE Price >= 180
ORDER BY Price DESC, Name;
10. 選擇產品的所有資料,包括每個產品的製造商的所有資料。
點選檢視解決方案
/* Without LEFT JOIN */
SELECT * FROM Products, Manufacturers
WHERE Products.Manufacturer = Manufacturers.Code;
/* With LEFT JOIN */
SELECT *
FROM Products LEFT JOIN Manufacturers
ON Products.Manufacturer = Manufacturers.Code;
11. 選擇所有產品的產品名稱、價格和製造商名稱。
點選檢視解決方案
/* Without INNER JOIN */
SELECT Products.Name, Price, Manufacturers.Name
FROM Products, Manufacturers
WHERE Products.Manufacturer = Manufacturers.Code;
/* With INNER JOIN */
SELECT Products.Name, Price, Manufacturers.Name
FROM Products INNER JOIN Manufacturers
ON Products.Manufacturer = Manufacturers.Code;
12. 選擇每個製造商產品的平均價格,僅顯示製造商的程式碼。
點選檢視解決方案
SELECT AVG(Price), Manufacturer
FROM Products
GROUP BY Manufacturer;
13. 選擇每個製造商產品的平均價格,顯示製造商的名稱。
點選檢視解決方案
/* Without INNER JOIN */
SELECT AVG(Price), Manufacturers.Name
FROM Products, Manufacturers
WHERE Products.Manufacturer = Manufacturers.Code
GROUP BY Manufacturers.Name;
/* With INNER JOIN */
SELECT AVG(Price), Manufacturers.Name
FROM Products INNER JOIN Manufacturers
ON Products.Manufacturer = Manufacturers.Code
GROUP BY Manufacturers.Name;
14. 選擇其產品平均價格大於或等於 $150 的製造商的名稱。
點選檢視解決方案
/* Without INNER JOIN */
SELECT AVG(Price), Manufacturers.Name
FROM Products, Manufacturers
WHERE Products.Manufacturer = Manufacturers.Code
GROUP BY Manufacturers.Name
HAVING AVG(Price) >= 150;
/* With INNER JOIN */
SELECT AVG(Price), Manufacturers.Name
FROM Products INNER JOIN Manufacturers
ON Products.Manufacturer = Manufacturers.Code
GROUP BY Manufacturers.Name
HAVING AVG(Price) >= 150;
15. 選擇最便宜產品的名稱和價格。
點選檢視解決方案
SELECT name,price
FROM Products
ORDER BY price ASC
LIMIT 1
/* With a nested SELECT */
/* WARNING: If there is more than one item with the cheapest price it will select them both */
SELECT Name, Price
FROM Products
WHERE Price = (SELECT MIN(Price) FROM Products);
16. 選擇每個製造商的名稱,以及其最昂貴產品的名稱和價格。
點選檢視解決方案
/* With a nested SELECT and without INNER JOIN */
SELECT A.Name, A.Price, F.Name
FROM Products A, Manufacturers F
WHERE A.Manufacturer = F.Code
AND A.Price =
(
SELECT MAX(A.Price)
FROM Products A
WHERE A.Manufacturer = F.Code
);
/* With a nested SELECT and an INNER JOIN */
SELECT A.Name, A.Price, F.Name
FROM Products A INNER JOIN Manufacturers F
ON A.Manufacturer = F.Code
AND A.Price =
(
SELECT MAX(A.Price)
FROM Products A
WHERE A.Manufacturer = F.Code
);
17. 選擇每個平均價格高於 $145 且包含至少 2 種不同產品的製造商的名稱。
點選檢視解決方案
Select m.Name, Avg(p.price) as p_price, COUNT(p.Manufacturer) as m_count
FROM Manufacturers m, Products p
WHERE p.Manufacturer = m.code
GROUP BY m.Name , p.Manufacturer
HAVING Avg(p.price) >= 150 and COUNT(p.Manufacturer) >= 2;
18. 新增一個新產品:揚聲器,$70,製造商 2。
點選檢視解決方案
INSERT INTO Products( Code, Name , Price , Manufacturer)
VALUES ( 11, 'Loudspeakers' , 70 , 2 );
19. 將產品 8 的名稱更新為“雷射印表機”。
點選檢視解決方案
UPDATE Products
SET Name = 'Laser Printer'
WHERE Code = 8;
20. 對所有產品應用 10% 的折扣。
點選檢視解決方案
UPDATE Products
SET Price = Price - (Price * 0.1);
21. 對價格大於或等於 $120 的所有產品應用 10% 的折扣。
點選檢視解決方案
UPDATE Products
SET Price = Price - (Price * 0.1)
WHERE Price >= 120;
CREATE TABLE Manufacturers ( Code INTEGER PRIMARY KEY NOT NULL, Name CHAR(50) NOT NULL ); CREATE TABLE Products ( Code INTEGER PRIMARY KEY NOT NULL, Name CHAR(50) NOT NULL , Price REAL NOT NULL , Manufacturer INTEGER NOT NULL CONSTRAINT fk_Manufacturers_Code REFERENCES Manufacturers(Code) );
請注意,此處提供的語法適用於 SQLite 系統。作者已在 sqlite3 上對其進行了測試。
該程式碼也在 SQL Server 2017 上進行了測試。
另請注意,主鍵欄位上的 NOT NULL 約束在語義上是冗餘的,但在 SQLite 中是語法上的必要條件。
點選檢視 MySQL 語法。
CREATE TABLE Manufacturers ( Code INTEGER, Name VARCHAR(255) NOT NULL, PRIMARY KEY (Code) ); CREATE TABLE Products ( Code INTEGER, Name VARCHAR(255) NOT NULL , Price DECIMAL NOT NULL , Manufacturer INTEGER NOT NULL, PRIMARY KEY (Code), FOREIGN KEY (Manufacturer) REFERENCES Manufacturers(Code) ) ENGINE=INNODB;
INSERT INTO Manufacturers(Code,Name) VALUES (1,'Sony'),(2,'Creative Labs'),(3,'Hewlett-Packard'),(4,'Iomega'),(5,'Fujitsu'),(6,'Winchester');
INSERT INTO Products(Code,Name,Price,Manufacturer) VALUES(1,'Hard drive',240,5),(2,'Memory',120,6),(3,'ZIP drive',150,4),(4,'Floppy disk',5,6),(5,'Monitor',240,1), (6,'DVD drive',180,2),(7,'CD drive',90,2),(8,'Printer',270,3),(9,'Toner cartridge',66,3),(10,'DVD burner',180,2);
