博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
建表語句
後續所有內容建立在這些SQL語句上,數據根據需要自行補充
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT
);
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
product_name VARCHAR(50),
price DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES users(id)
);
INSERT INTO users (id, name, age) VALUES (1, 'Alice', 25);
INSERT INTO users (id, name, age) VALUES (2, 'Bob', 30);
INSERT INTO users (id, name, age) VALUES (3, 'Charlie', 35);
INSERT INTO orders (id, user_id, product_name, price) VALUES (1, 1, 'Product A', 10.99);
INSERT INTO orders (id, user_id, product_name, price) VALUES (2, 1, 'Product B', 15.99);
INSERT INTO orders (id, user_id, product_name, price) VALUES (3, 2, 'Product C', 20.99);
INSERT INTO orders (id, user_id, product_name, price) VALUES (4, 2, 'Product A', 10.99);
INSERT INTO orders (id, user_id, product_name, price) VALUES (5, 3, 'Product B', 15.99);
學習要點
知識點學習
查詢單個列的數據
SELECT column_name FROM table_name;
查詢多個列的數據
SELECT column1, column2 FROM table_name;
帶條件查詢數據
SELECT column1, column2 FROM table_name WHERE condition;
插入數據
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
更新數據
UPDATE table_name SET column1=value1, column2=value2, ... WHERE condition;
刪除數據
DELETE FROM table_name WHERE condition;
根據某列升序排序:
SELECT * FROM table_name ORDER BY column_name ASC;
根據某列降序排序:
SELECT * FROM table_name ORDER BY column_name DESC;
計算某列的總和:
SELECT SUM(column_name) FROM table_name;
計算某列的平均值:
SELECT AVG(column_name) FROM table_name;
按某列分組:
SELECT column_name, COUNT(column_name) FROM table_name GROUP BY column_name;
聯結
內連接是一種用於聯接兩個或多個表的方法。它只返回滿足連接條件的行,也就是兩個表中具有相同值的行。內連接使用關鍵字"INNER JOIN"來連接兩個或多個表,它可以包含一個或多個連接條件。
例如,假設有兩個表A和B,表A中有列a,表B中有列b。通過內連接在表A和表B之間進行連接,只會返回那些同時滿足"a = b"條件的行。內連接可以幫助我們從兩個或多個相關表中獲取相關數據。
SELECT table1.column1, table2.column2 FROM table1 INNER JOIN table2 ON table1.id = table2.id;
左外連接兩個表:
左外連接是一種用於聯接兩個或多個表的方法,在MySQL中使用"LEFT JOIN"關鍵字來實現。左外連接返回兩個表中滿足連接條件的所有行,以及左表中不滿足連接條件的行。
假設有兩個表A和B,通過左外連接在表A和表B之間進行連接,查詢將返回滿足連接條件的行以及左表A中不滿足連接條件的行。右表B中不滿足連接條件的行的值將被設置為NULL。
這個查詢將返回表A中所有行的a列的值,以及在表B中具有相同值的b列的值。如果在表B中沒有具有相同值的行,b列的值將為NULL。
左外連接適用於在兩個表中尋找關聯數據,即使在右表中沒有匹配的行時也可以返回左表的數據。這對於獲取主表所有數據以及與之關聯的次要表的數據很有用。
SELECT table1.column1, table2.column2 FROM table1 LEFT JOIN table2 ON table1.id = table2.id;
右外連接兩個表:
右外連接是一種用於聯接兩個或多個表的方法,在MySQL中使用"RIGHT JOIN"關鍵字來實現。右外連接返回右表中滿足連接條件的所有行,以及右表中不滿足連接條件的行。
假設有兩個表A和B,通過右外連接在表A和表B之間進行連接,查詢將返回滿足連接條件的行以及右表B中不滿足連接條件的行。左表A中不滿足連接條件的行的值將被設置為NULL。
以下是一個右外連接的示例查詢:
SELECT table1.column1, table2.column2 FROM table1 RIGHT JOIN table2 ON table1.id = table2.id;
這個查詢將返回表B中所有行的b列的值,以及在表A中具有相同值的a列的值。如果在表A中沒有具有相同值的行,a列的值將為NULL。
右外連接適用於在兩個表中尋找關聯數據,即使在左表中沒有匹配的行時也可以返回右表的數據。它可以用於獲取右表所有數據以及與之關聯的主表的數據。在實際應用中,左外連接更常見,而右外連接往往用左外連接完成同樣的任務。
子查詢
使用子查詢:
SELECT column_name1 FROM table_name WHERE column_name2 IN (SELECT column_name3 FROM table_name2 WHERE condition);
案例列舉
問題1: 統計每個用戶的訂單總數
需要統計每個用戶的訂單總數,以便瞭解用戶的購買情況。
SELECT users.id AS user_id, users.name AS user_name, COUNT(orders.id) AS order_count
FROM users
LEFT JOIN orders ON users.id = orders.user_id
GROUP BY users.id;
以上SQL語句中,首先通過左外連接將用戶表和訂單表關聯起來,然後使用GROUP BY子句按用戶進行分組,使用COUNT聚合函數統計每個用戶的訂單數量。
問題2: 查詢每個用戶的最高訂單金額
需要查詢每個用戶的最高訂單金額,以瞭解用戶的購買能力。
SELECT users.id AS user_id, users.name AS user_name, MAX(orders.price) AS max_order_amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id
GROUP BY users.id;
以上SQL語句中,通過左外連接將用戶表和訂單表關聯起來,然後使用GROUP BY子句按用戶進行分組,使用MAX聚合函數找到每個用戶的最高訂單金額。
問題3: 查詢訂單數量最多的用戶
需要找出訂單數量最多的用戶,以瞭解誰是最活躍的用戶。
SELECT users.id AS user_id, users.name AS user_name, COUNT(orders.id) AS order_count
FROM users
LEFT JOIN orders ON users.id = orders.user_id
GROUP BY users.id
ORDER BY order_count DESC
LIMIT 1;
以上SQL語句中,通過左外連接將用戶表和訂單表關聯起來,然後使用GROUP BY子句按用戶進行分組,並使用COUNT函數統計每個用戶的訂單數量。最後使用ORDER BY子句將結果按訂單數量降序排序,並使用LIMIT限制只返回第一條結果,即訂單數量最多的用戶。
問題4: 查詢最近一個月內的訂單數量
需要查詢最近一個月內的訂單數量,以瞭解近期的訂單情況。
SELECT COUNT(id) AS order_count
FROM orders
WHERE date >= DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH);
以上SQL語句中,使用COUNT函數統計最近一個月內的訂單數量。通過將當前日期減去一個月的時間間隔來計算出一個月前的日期,並使用WHERE子句篩選出指定日期範圍內的訂單。
問題5: 查詢購買最多的產品
需要查詢購買數量最多的產品,以瞭解最受歡迎的產品。
SELECT product_name, COUNT(id) AS sales_count
FROM orders
GROUP BY product_name
ORDER BY sales_count DESC
LIMIT 1;
以上SQL語句中,使用COUNT函數統計每個產品的銷售數量,並使用GROUP BY子句按產品名稱進行分組。最後使用ORDER BY子句將結果按銷售數量降序排序,並使用LIMIT限制只返回第一條結果,即銷售數量最多的產品。
問題6: 查詢每個用戶的平均訂單金額
需要查詢每個用戶的平均訂單金額,以瞭解用戶的平均消費水平。
SELECT users.id AS user_id, users.name AS user_name, AVG(orders.price) AS avg_order_amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id
GROUP BY users.id;
以上SQL語句中,通過左外連接將用戶表和訂單表關聯起來,然後使用GROUP BY子句按用戶進行分組,使用AVG聚合函數找到每個用戶的平均訂單金額。
問題7: 查詢未購買任何產品的用戶
需要查詢未購買任何產品的用戶,以瞭解哪些用戶還沒有進行購物。
SELECT users.id, users.name
FROM users
LEFT JOIN orders ON users.id = orders.user_id
WHERE orders.id IS NULL;
以上SQL語句中,通過左外連接將用戶表和訂單表關聯起來,然後使用WHERE子句篩選出未購買任何產品的用戶,即訂單ID為空的記錄。
問題8: 查詢訂單金額超過平均訂單金額的用戶
需要查詢訂單金額超過平均訂單金額的用戶,以瞭解哪些用戶的消費能力高於平均水平。
SELECT users.id AS user_id, users.name AS user_name, orders.price AS order_amount
FROM users
JOIN orders ON users.id = orders.user_id
WHERE orders.price > (SELECT AVG(price) FROM orders);
以上SQL語句中,使用子查詢找到訂單表中的平均訂單金額,然後通過JOIN將用戶表和訂單表連接起來,使用WHERE子句篩選出訂單金額超過平均訂單金額的用戶。
問題9: 查詢每個用戶的首次購買日期
需要查詢每個用戶的首次購買日期,以瞭解用戶的註冊後多久開始購物。
SELECT users.id AS user_id, users.name AS user_name, MIN(orders.date) AS first_purchase_date
FROM users
JOIN orders ON users.id = orders.user_id
GROUP BY users.id;
以上SQL語句中,通過JOIN將用戶表和訂單表連接起來,然後使用GROUP BY子句按用戶進行分組,使用MIN函數找到每個用戶的最早購買日期。
問題10: 查詢購買過某個產品的用戶
需要查詢購買過某個產品的用戶,以瞭解對於某個指定的產品,都有哪些用戶購買過。
SELECT users.id AS user_id, users.name AS user_name
FROM users
JOIN orders ON users.id = orders.user_id
WHERE orders.product_name = '指定產品名稱';
以上SQL語句中,通過JOIN將用戶表和訂單表連接起來,然後使用WHERE子句篩選出購買過指定產品的用戶,即產品名稱與指定名稱匹配的記錄。
在黑夜裡夢想著光,心中覆蓋悲傷,在悲傷里忍受孤獨,空守一絲溫暖。 我的淚水是無底深海,對你的愛已無言,相信無盡的力量,那是真愛永在。 我的信仰是無底深海,澎湃著心中火焰,燃燒無盡的力量,那是忠誠永在。