MySQL基本表查詢操作匯總之單表查詢+多表操作大全
干貨分享,感謝您的閱讀!介紹MySQL的單表查詢和多表操作,從基本概念到具體實(shí)例,幫助讀者全面理解和掌握這些關(guān)鍵技術(shù)。通過閱讀本文,您將了解如何構(gòu)建高效的查詢語句、如何利用索引和外鍵優(yōu)化查詢性能,以及如何在復(fù)雜數(shù)據(jù)關(guān)系中靈活運(yùn)用連接查詢和子查詢。同時(shí),我們還將分享一些實(shí)用的建議和注意事項(xiàng),以助您在實(shí)際應(yīng)用中規(guī)避常見問題,提高數(shù)據(jù)庫操作的安全性和可靠性。
無論您是初學(xué)者還是有經(jīng)驗(yàn)的開發(fā)者,這篇文章都將為您提供有價(jià)值的參考和指導(dǎo),幫助您在數(shù)據(jù)庫操作中更加游刃有余。

一、單表查詢整合
主要內(nèi)容:簡單查詢+條件查詢+高級(jí)查詢+表和字段取別名(以及簡單的mapper寫法)
(一)通用模版展示
以下是MySQL單表查詢的通用寫法舉例:
- 簡單查詢:最基本的查詢方式,它用于獲取表中所有數(shù)據(jù)。
SELECT * FROM table_name;
- 條件查詢:根據(jù)特定的條件獲取數(shù)據(jù)的方式,它使用WHERE子句來指定條件。
SELECT * FROM table_name WHERE column_name = 'value';
- 高級(jí)查詢:使用聚合函數(shù)、分組、排序等方式來獲取數(shù)據(jù)的方式。
SELECT AVG(column_name) AS average_value, COUNT(*) AS total_rows FROM table_name GROUP BY column_name ORDER BY average_value DESC;
- 表和字段取別名:可以使查詢語句更加簡潔明了,也可以防止字段名或表名與SQL關(guān)鍵字重名的問題。
SELECT t.column_name AS alias_name FROM table_name AS t WHERE t.column_name > 10;
需要注意的是,在編寫查詢語句時(shí),應(yīng)該根據(jù)實(shí)際情況和需求來選擇合適的查詢方式和語法,以提高查詢效率和數(shù)據(jù)質(zhì)量。同時(shí),還應(yīng)該考慮SQL注入等安全問題,使用預(yù)處理語句等方式來增強(qiáng)安全性。
(二)舉例說明
假設(shè)有一個(gè)名為students的表,其中包含以下字段:id, name, age, gender, major, score,現(xiàn)在我們以該表為例,演示MySQL單表查詢的操作。
- 簡單查詢:獲取students表中所有數(shù)據(jù):
SELECT * FROM students;
- 條件查詢:獲取students表中名字為Tom的學(xué)生數(shù)據(jù):
SELECT * FROM students WHERE name = 'Tom';
- 高級(jí)查詢:獲取students表中每個(gè)專業(yè)學(xué)生的平均成績,并按平均成績從高到低排序:
SELECT major, AVG(score) AS average_score FROM students GROUP BY major ORDER BY average_score DESC;
- 表和字段取別名:獲取students表中年齡大于20歲的學(xué)生的姓名和年齡,并將年齡字段取別名為age_value:
SELECT name, age AS age_value FROM students WHERE age > 20;
以上是針對(duì)students表的MySQL單表查詢的具體例子,可根據(jù)實(shí)際情況和需求進(jìn)行調(diào)整和優(yōu)化。
(三)注意事項(xiàng)
在使用MySQL進(jìn)行單表查詢時(shí),需要注意以下事項(xiàng):
- 選擇合適的查詢方式和語法,以提高查詢效率和數(shù)據(jù)質(zhì)量。
- 注意SQL注入等安全問題,使用預(yù)處理語句等方式來增強(qiáng)安全性。
- 盡量避免使用SELECT *等通配符查詢,而是應(yīng)該只查詢需要的字段,以提高查詢效率。
- 使用表和字段的別名時(shí),應(yīng)該使用有意義的別名,使查詢語句更加清晰明了。
- 在使用GROUP BY和ORDER BY等聚合函數(shù)和排序語法時(shí),應(yīng)該確保語法正確且沒有歧義,以避免數(shù)據(jù)誤差和查詢錯(cuò)誤。
- 對(duì)于大型數(shù)據(jù)表,可以使用LIMIT語法來限制返回的行數(shù),以減少查詢時(shí)間和網(wǎng)絡(luò)帶寬的消耗。
- 使用EXPLAIN語法可以幫助了解查詢的執(zhí)行計(jì)劃和性能,以優(yōu)化查詢效率。
MySQL單表查詢需要注意以上事項(xiàng),以獲得更好的查詢效果和數(shù)據(jù)質(zhì)量。
(四)Mapper簡單舉例
針對(duì)上面提到的單表查詢的例子,下面給出對(duì)應(yīng)的MyBatis Mapper的優(yōu)秀寫法:
簡單查詢
獲取students表中所有數(shù)據(jù):
<select id="selectAllStudents" resultType="Student"> SELECT * FROM students </select>
條件查詢
獲取students表中名字為Tom的學(xué)生數(shù)據(jù):
<select id="selectStudentByName" parameterType="String" resultType="Student">
SELECT * FROM students WHERE name = #{name}
</select>高級(jí)查詢
獲取students表中每個(gè)專業(yè)學(xué)生的平均成績,并按平均成績從高到低排序:
<select id="selectAvgScoreByMajor" resultType="ScoreByMajor"> SELECT major, AVG(score) AS average_score FROM students GROUP BY major ORDER BY average_score DESC </select>
其中,ScoreByMajor是一個(gè)自定義的結(jié)果映射類,用于將查詢結(jié)果封裝為一個(gè)對(duì)象。
表和字段取別名
獲取students表中年齡大于20歲的學(xué)生的姓名和年齡,并將年齡字段取別名為age_value:
<select id="selectNameAndAgeByAge" parameterType="int" resultType="Student">
SELECT name, age AS age_value FROM students WHERE age > #{age}
</select>需要注意的是,以上是一些簡單的查詢示例,實(shí)際情況下可能會(huì)涉及到更復(fù)雜的查詢,需要根據(jù)具體的業(yè)務(wù)需求和數(shù)據(jù)結(jié)構(gòu)來調(diào)整查詢語句和Mapper的寫法。另外,在使用Mapper時(shí)也需要注意SQL注入等安全問題,以及使用緩存等技術(shù)來提高查詢效率和性能。
二、多表操作說明
主要內(nèi)容:外鍵+操作關(guān)聯(lián)表+連接查詢+子查詢
(一)多表操作的基本模版展示
結(jié)合具體的例子,給出多表操作的通用模版,并分析每個(gè)模版的作用。
外鍵約束模版
CREATE TABLE table1 ( id INT PRIMARY KEY, ... ) ENGINE=InnoDB; CREATE TABLE table2 ( id INT PRIMARY KEY, table1_id INT, ... FOREIGN KEY (table1_id) REFERENCES table1(id) ) ENGINE=InnoDB;
外鍵約束模版中,我們可以定義一個(gè)外鍵,將一個(gè)表的某個(gè)字段設(shè)置為另一個(gè)表的主鍵。這樣,當(dāng)我們?cè)诟禄騽h除一張表的記錄時(shí),會(huì)自動(dòng)對(duì)應(yīng)更新或刪除另一張表中的相關(guān)記錄。在創(chuàng)建表時(shí),我們需要注意兩點(diǎn):
- 必須將引擎設(shè)置為 InnoDB,才能使用外鍵約束。
- 外鍵所在表(table2)的字段必須是另一張表(table1)的主鍵。
操作關(guān)聯(lián)表模版
SELECT t1.column1, t2.column2 FROM table1 t1, table2 t2 WHERE t1.id = t2.table1_id;
操作關(guān)聯(lián)表模版中,我們需要用到 JOIN 關(guān)鍵字,將兩張表的記錄連接起來。常見的 JOIN 類型有 INNER JOIN、LEFT JOIN、RIGHT JOIN 等。上面的模版使用的是 INNER JOIN,它只返回兩張表中都存在的記錄。在實(shí)際應(yīng)用中,我們需要根據(jù)具體的業(yè)務(wù)需求來選擇合適的 JOIN 類型。
連接查詢模版
SELECT t1.column1, t2.column2 FROM table1 t1 JOIN table2 t2 ON t1.id = t2.table1_id;
連接查詢模版和操作關(guān)聯(lián)表模版類似,但是它使用了 ON 關(guān)鍵字來指定連接條件,更加清晰明了。在實(shí)際應(yīng)用中,我們可以根據(jù)實(shí)際情況選擇操作關(guān)聯(lián)表模版或連接查詢模版。
子查詢模版
SELECT column1, column2, ... FROM table1 WHERE column1 IN (SELECT column1 FROM table2 WHERE ...);
子查詢模版中,我們?cè)?WHERE 子句中使用了一個(gè)子查詢來獲取 table2 表中符合條件的數(shù)據(jù),并將其作為查詢條件之一。子查詢可以用在 SELECT、INSERT、UPDATE 和 DELETE 等語句中,是一種非常強(qiáng)大的查詢手段。
(二)簡單案例展示
兩張表情況
假設(shè)我們有兩個(gè)表,一個(gè)是用戶表(user),另一個(gè)是訂單表(order),其中訂單表中包含了用戶id的外鍵(user_id)。
我們需要查詢出所有已完成的訂單及對(duì)應(yīng)的用戶名和手機(jī)號(hào)??梢允褂眠B接查詢來實(shí)現(xiàn):
SELECT o.order_id, u.user_name, u.phone_number FROM `order` o INNER JOIN `user` u ON o.user_id = u.user_id WHERE o.order_status = 'completed';
在上面的查詢中,我們使用了 INNER JOIN 將訂單表和用戶表連接起來,連接條件是訂單表的 user_id 字段與用戶表的 user_id 字段相等。在 SELECT 子句中,我們指定了要查詢的字段,注意使用了別名來區(qū)分兩個(gè)表中相同字段名的情況。在 WHERE 子句中,我們過濾出訂單狀態(tài)為已完成的記錄。
如果我們需要查詢某個(gè)用戶的訂單及對(duì)應(yīng)的用戶名和手機(jī)號(hào),可以使用子查詢來實(shí)現(xiàn):
SELECT o.order_id, u.user_name, u.phone_number
FROM `order` o
INNER JOIN (
SELECT user_id, user_name, phone_number
FROM `user`
WHERE user_id = 123
) u ON o.user_id = u.user_id
WHERE o.order_status = 'completed';在上面的查詢中,我們使用了子查詢來獲取指定用戶的用戶名和手機(jī)號(hào),并將其命名為 u 表。在連接查詢中,我們使用了 u 表來代替用戶表,以此來獲取指定用戶的訂單信息。
現(xiàn)在我們想查詢每個(gè)用戶的訂單總數(shù),并按照訂單總數(shù)從高到低進(jìn)行排序。我們可以使用以下SQL查詢:
SELECT u.name, COUNT(o.id) as order_count FROM users u LEFT JOIN orders o ON u.id = o.user_id GROUP BY u.id ORDER BY order_count DESC;
在這個(gè)查詢中,我們使用了LEFT JOIN將users表和orders表關(guān)聯(lián)起來。然后我們使用了COUNT函數(shù)來計(jì)算每個(gè)用戶的訂單數(shù)量,并將其重命名為order_count。最后,我們使用GROUP BY對(duì)用戶進(jìn)行分組,并使用ORDER BY按訂單總數(shù)從高到低排序。
這個(gè)查詢可以幫助我們了解哪些用戶下單最頻繁,并根據(jù)這些數(shù)據(jù)做出更明智的業(yè)務(wù)決策。
三張表情況
假設(shè)我們有三個(gè)表,一個(gè)是訂單表(orders),另一個(gè)是商品表(products),第三個(gè)是訂單商品關(guān)聯(lián)表(order_products),用來記錄每個(gè)訂單中包含了哪些商品,其結(jié)構(gòu)如下:
orders:
Field | Type | Null | Key | Default | Extra |
order_id | int | NO | PRI | NULL | auto_increment |
user_id | int | NO | NULL | ||
order_date | datetime | NO | NULL | ||
status | varchar(20) | NO | NULL |
products:
Field | Type | Null | Key | Default | Extra |
product_id | int | NO | PRI | NULL | auto_increment |
name | varchar(50) | NO | NULL | ||
description | text | NO | NULL | ||
price | decimal(10,2) | NO | NULL |
order_products:
Field | Type | Null | Key | Default | Extra |
order_id | int | NO | MUL | NULL | |
product_id | int | NO | MUL | NULL | |
quantity | int | NO | NULL | ||
unit_price | decimal(10,2) | NO | NULL |
現(xiàn)在我們需要查詢用戶最近一個(gè)月的訂單中,包含哪些商品,以及每個(gè)商品的銷售數(shù)量、單價(jià)和總價(jià)??梢允褂靡韵?SQL 語句來實(shí)現(xiàn):
SELECT op.product_id, p.name, op.unit_price, SUM(op.quantity) AS sales_volume, SUM(op.quantity * op.unit_price) AS sales_amount FROM orders o INNER JOIN order_products op ON o.order_id = op.order_id INNER JOIN products p ON op.product_id = p.product_id WHERE o.user_id = 123 AND o.order_date >= DATE_SUB(NOW(), INTERVAL 1 MONTH) GROUP BY op.product_id, p.name, op.unit_price;
在上面的查詢中,我們使用了三個(gè)表的連接查詢。在 WHERE 子句中,我們過濾出了用戶最近一個(gè)月的訂單記錄,并指定了用戶id為123。在 SELECT 子句中,我們指定了要查詢的字段,其中 SUM 函數(shù)用來計(jì)算每個(gè)商品的銷售數(shù)量和銷售金額,GROUP BY 子句用來分組計(jì)算。
注意,在使用 GROUP BY 子句時(shí),必須將所有非聚合字段都列出來,否則會(huì)報(bào)錯(cuò)。在本例中,我們需要將商品名稱和單價(jià)列出來。
多表情況(三張以上)
當(dāng)涉及到5個(gè)或更多的表時(shí),通常會(huì)使用更高級(jí)的查詢技術(shù),例如子查詢和嵌套查詢。以下是一個(gè)類似的示例,假設(shè)我們有6個(gè)表:users、orders、order_items、products、categories和suppliers,每個(gè)表的結(jié)構(gòu)如下:
- users: id, name, email, password
- orders: id, user_id, created_at
- order_items: id, order_id, product_id, quantity, price
- products: id, name, category_id, supplier_id
- categories: id, name
- suppliers: id, name, email, phone
現(xiàn)在,我們想要查找所有已下訂單的用戶的姓名、訂單號(hào)、訂單創(chuàng)建時(shí)間、訂單中的產(chǎn)品名稱、產(chǎn)品所屬類別、產(chǎn)品供應(yīng)商名稱、產(chǎn)品數(shù)量和價(jià)格。
這個(gè)查詢涉及了6個(gè)表,我們需要使用多個(gè)JOIN子句來將它們連接起來,同時(shí)使用子查詢和嵌套查詢來過濾結(jié)果。
SELECT u.name AS user_name, o.id AS order_id, o.created_at AS order_created_at, p.name AS product_name, c.name AS category_name, s.name AS supplier_name, oi.quantity AS product_quantity, oi.price AS product_price FROM users u JOIN orders o ON u.id = o.user_id JOIN order_items oi ON o.id = oi.order_id JOIN products p ON oi.product_id = p.id JOIN categories c ON p.category_id = c.id JOIN suppliers s ON p.supplier_id = s.id WHERE o.created_at BETWEEN '2022-01-01' AND '2022-12-31' AND u.id IN (SELECT user_id FROM orders WHERE created_at BETWEEN '2022-01-01' AND '2022-12-31') ORDER BY u.name, o.created_at;
這個(gè)查詢使用了多個(gè)JOIN子句,將6個(gè)表連接起來。我們還使用了一個(gè)子查詢來獲取在指定時(shí)間范圍內(nèi)下單的用戶的ID,并使用IN運(yùn)算符將其與外部查詢中的用戶ID進(jìn)行匹配。我們還使用了WHERE子句來過濾指定時(shí)間范圍內(nèi)下單的訂單,并使用ORDER BY將結(jié)果按用戶姓名和訂單創(chuàng)建時(shí)間進(jìn)行排序。
當(dāng)涉及到多個(gè)表時(shí),保持代碼的可讀性和可維護(hù)性非常重要。使用良好的命名約定和注釋,以及遵循最佳實(shí)踐和代碼風(fēng)格指南,可以使代碼更易于理解和維護(hù)。
(三)注意事項(xiàng)
在進(jìn)行多表操作時(shí),需要注意以下幾點(diǎn):
- 多表連接可能會(huì)產(chǎn)生笛卡爾積,需要注意去重或限制返回結(jié)果數(shù)量。
- 在進(jìn)行關(guān)聯(lián)查詢時(shí),盡量使用索引字段作為關(guān)聯(lián)條件,以提高查詢效率。
- 多表查詢涉及到數(shù)據(jù)的讀寫,為了保證數(shù)據(jù)的一致性,應(yīng)該使用事務(wù)進(jìn)行處理。
- 在多表關(guān)聯(lián)查詢中,使用子查詢時(shí)要注意子查詢的效率,盡量使用連接查詢代替子查詢。
- 多表操作可能會(huì)涉及到數(shù)據(jù)的修改和刪除,因此需要謹(jǐn)慎處理,避免誤操作導(dǎo)致數(shù)據(jù)的丟失。
- 在進(jìn)行多表查詢時(shí),應(yīng)該選擇適當(dāng)?shù)牟樵兎绞胶驼Z句結(jié)構(gòu),以提高查詢效率。同時(shí),還需要根據(jù)實(shí)際情況進(jìn)行調(diào)整和優(yōu)化。
三、總結(jié)
MySQL單表查詢和多表操作是數(shù)據(jù)庫管理中常見且重要的任務(wù)。通過掌握簡單查詢、條件查詢、高級(jí)查詢、表和字段取別名等單表查詢技巧,可以有效地獲取和操作單表數(shù)據(jù)。而在多表操作中,理解外鍵約束、操作關(guān)聯(lián)表、連接查詢和子查詢等技術(shù),可以實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)關(guān)聯(lián)和查詢需求。
在實(shí)際應(yīng)用中,選擇合適的查詢方式和語法至關(guān)重要,既能提高查詢效率,又能保證數(shù)據(jù)的質(zhì)量和安全性。特別是在多表操作中,使用索引、優(yōu)化查詢語句和使用事務(wù)等手段,可以顯著提升查詢性能和數(shù)據(jù)一致性。
通過本文的介紹,相信讀者能夠?qū)ySQL的單表查詢和多表操作有更深入的理解,并能在實(shí)際工作中靈活運(yùn)用這些技術(shù),提高數(shù)據(jù)管理和處理的效率。
到此這篇關(guān)于MySQL基本表查詢操作匯總之單表查詢+多表操作大全的文章就介紹到這了,更多相關(guān)mysql表查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL?中?Varchar(50)?和?varchar(500)?區(qū)別介紹
網(wǎng)上說Varchar(50)和varchar(500)存儲(chǔ)空間上是一樣的,真的是這樣嗎,基于性能考慮,是因?yàn)檫^長的字段會(huì)影響到查詢性能,本文我將帶著這兩個(gè)問題探討驗(yàn)證一下,需要的朋友可以參考下2024-08-08
MySQL實(shí)現(xiàn)兩張表數(shù)據(jù)的同步
本文將介紹mysql 觸發(fā)器實(shí)現(xiàn)兩個(gè)表的數(shù)據(jù)同步,需要學(xué)習(xí)MySQL的童鞋可以參考。2016-10-10
MySQL Binlog 日志查看方法及查看內(nèi)容解析
本文介紹了MySQL Binlog日志的作用及查看方法,涵蓋開啟配置、使用工具和命令查看日志,解析Format_desc、Query等事件類型,用于數(shù)據(jù)恢復(fù)、主從復(fù)制和審計(jì),感興趣的朋友跟隨小編一起看看吧2025-06-06

