MySQL 检索数据【总结】
1. 基本查询
// 检索单个列select prod_name from products; // 检索所有列select * from products; // 检索不同的行select distinct vend_id from products; // 限制结果select prod_name from products limit 4,5;
1.LIMIT :若有两个参数,则第一个参数为开始位置(从 0 行开始),第二个参数为返回结果的数量;若只有一个参数,则表示限制返回结果的数量。
2.除非确实需要表中的每个列,否则最好别使用 * 通配符,检索不需要的列会降低检索的性能。
2. 排序数据
// 对 `prod_name` 进行升序排序select prod_name from products order by prod_name; // 按多个列排序: 对 `prod_price` 降序排序,对 `prod_name` 升序排序 select prod_price, prod_name form products order by prod_price desc, prod_name;
如果没有明确规定排序顺序,MySQL 默认以数据添加到表中的顺序返回。
3.过滤数据
使用 WHERE 子句来指定搜索条件。
// 检查单个值,MySQL 在执行匹配时默认不区分大小写,因此 'jochen' 和 'Jochen' 都会匹配select prod_name, prod_price from products where prod_name = 'jochen'; // 不匹配检查select vend_id, prod_name from products where vend_id != 1000; // 范围检查select prod_name, prod_price from products where prod_price between 5 and 10; // 空值检查select cust_id from customers where cust_email is null; // AND 操作符select prod_id, prod_price from products where vend_id = 1003 and prod_price <=10; // OR 操作符select prod_name, prod_price from products where vend_id = 1002 or vend_id = 1003; // IN 操作符select prod_name, prod_price from products where vend_id in (1002, 1003); // NOT 操作符select prod_name, prod_price from products where vend_id not in (1002, 1003);
1.在同时使用 ORDER BY 和 WHERE 语句时,应该让 ORDER BY 位于 WHERE 之后,否则会报错
2.在 MySQL 中,AND 操作符的计算次序优先级高于 OR;可以使用圆括号()提高操作符的优先级。
4. 通配符过滤
MySQL 中有两种通配符来实现匹配值的一部分的特殊字符:
// `%` 通配符select prod_id, prod_name from products where prod_name like 'jo%'; // `_` 通配符select prod_id, prod_name from products where prod_name like '_ochen';
1.% 通配符表示任意字符出现任意次数;_ 通配符表示只匹配单个字符。
2.通配符搜索的处理一般要比普通搜索所花时间更长,因此不要过度使用通配符。
5. 正则表达式检索
正则表达式是用来匹配文本的特殊的串,通过使用 REGEXP 子句来实现。MySQL 中使用 POSIX 规范正则表达式。
select prod_name from products where prod_name regexp '1000|2000'; select prod_name from products where prod_name regexp '[123] Ton'; // 连续4位数字select prod_name from products where prod_name regexp '[[:digit:]]{4}';
6. 计算字段
应用程序所需要的数据往往并不存在于数据库表中,我们需要从数据库中检索并进行拼接、计算、转换或者格式化等处理而得到,这就是计算字段。计算字段并不实际存在于数据库表中,而是运行时由 SELECT 语句创建。
// 拼接select concat(vend_name, '(', vend_country, ')') as vend_title from vendors; // 算术计算select prod_id, quantity, item_price quantity*item_price as expanded_price from orderitems;
7. 分组数据
分组允许把数据分为多个逻辑组,以便对每个组进行聚集计算。
// 返回每个供应商提供的产品数目select vend_id, count(*) as num_prods from products group by vend_id; # 创建分组 // 返回至少有两个订单的所有顾客select cust_id, count(*) as orders from orders group by cust_id having count(*) >= 2; # 过滤分组 // 返回总计订单价格大于等于50的订单的订单号和总计订单价格,并按总计订单价格排序select order_num, sum(quantity*item_price) as ordertotal from orderitems group by order_num having sum(quantity*item_price) >= 50 order by ordertotal;
1.GROUP BY 子句指示 MySQL 分组数据,然后对每个组而不是整个结果集进行聚集。
2.GROUP BY 子句中列出的每个列必须是检索列或者有效的表达式(不能是聚集函数),同时不能使用别名。
3.HAVING 在数据分组之后进行过滤,WHERE 在数据分组之前进行过滤。
4.一般在使用 GROUP BY 子句时,应该也给好 'ORDER BY' 子句,这是保证数据正确排序的唯一方法。
8. 子查询
MySQL 允许创建子查询,即嵌套在其他查询中的查询,例如把一条 SELECT 语句返回的结果用于另一条 SELECT 语句的 WHERE 子句。
select cust_id from orders where order_num in (select order_num from ordreitems where prod_id = 'TNT2'); // 作为计算字段使用子查询select cust_name, cust_state, (select count(*) from orders where orders.cust_id = customers.cust_id) as orders from customers order by cust_name;
保证子查询中的 SELECT 语句具有与父查询中的 WHERE 子句有相同数目的列。
9. 联接表
关系表的设计就是要保证把信息分解成多个表,一类数据一个表,各表通过某些常用的值(即关系设计中的关系)互相关联。分解数据为多个表能更有效地存储,更方便地处理,并且具有更大的可伸缩性。如果数据存储在多个表中,怎样用单条 SELECT 语句检索出数据?答案是使用联接。简单地说,联接是一种机制,用来在一条 SELECT 语句中关联表,使用特殊的语法,可以联接多个表返回一组数据。
联接不是物理实体,它在实际的数据库表中不存在。
常用的联接类型有:
内部联接(INNER JOIN):两表执行笛卡尔积后,取列值符合查询条件的数据。
左外部联接(LEFT OUTER JOIN):指将左表的所有记录与右表符合条件的记录,返回的结果除内连接的结果,还有左表不符合条件的记录,并在右表相应列中填NULL。
右外部联接(RIGHT OUTER JOIN):
// 等值联接1select vend_name, prod_name, prod_price from vendors, products where vendors.id = products.vend_id order by vend_name, prod_name; // 等值联接2select vend_name, prod_name, prod_price from vendors inner join products on vendors.id = products.vend_id order by vend_name, prod_name;
1.应该保证所有联接都 SELECT 子句,否则 MySQL 将返回比想要的数据多得多的数据(笛卡尔积)。
2.MySQL 在运行时关联指定的每个表以及处理联接,这种处理可能时非常耗费资源的。
10. 复合查询
MySQL 允许执行多个查询(多条 SELECT 语句),并将结果作为单个查询结果集返回,这些组合查询称为复合查询。有两种情况下,需要使用复合查询:
在单个查询中从不同的表返回类似结果的数据;
对单个表执行多个查询,按单个查询返回数据。
// 返回价格小于等于5的所有物品、并且包括供应商1001和1002生产的所有物品 select vend_id, prod_id, prod_price from products where prod_price <=5 union select vend_id, prod_id, prod_price from products where vend_id in (1001, 1002);
1.UNION 中的每个查询必须包含相同的列、表达式或聚集函数。
2.在使用 UNION 复合查询是,只能使用一条 ORDER BY 子句,且必须在最后一条 SELECT 语句之后。
更多编程相关内容,请关注php中文网编程入门栏目!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

可以通過以下步驟打開 phpMyAdmin:1. 登錄網站控制面板;2. 找到並點擊 phpMyAdmin 圖標;3. 輸入 MySQL 憑據;4. 點擊 "登錄"。

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

Redis 使用單線程架構,以提供高性能、簡單性和一致性。它利用 I/O 多路復用、事件循環、非阻塞 I/O 和共享內存來提高並發性,但同時存在並發性受限、單點故障和不適合寫密集型工作負載的局限性。

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

MySQL在數據庫和編程中的地位非常重要,它是一個開源的關係型數據庫管理系統,廣泛應用於各種應用場景。 1)MySQL提供高效的數據存儲、組織和檢索功能,支持Web、移動和企業級系統。 2)它使用客戶端-服務器架構,支持多種存儲引擎和索引優化。 3)基本用法包括創建表和插入數據,高級用法涉及多表JOIN和復雜查詢。 4)常見問題如SQL語法錯誤和性能問題可以通過EXPLAIN命令和慢查詢日誌調試。 5)性能優化方法包括合理使用索引、優化查詢和使用緩存,最佳實踐包括使用事務和PreparedStatemen

直接從數據庫中恢復被刪除的行通常是不可能的,除非有備份或事務回滾機制。關鍵點:事務回滾:在事務未提交前執行ROLLBACK可恢復數據。備份:定期備份數據庫可用於快速恢復數據。數據庫快照:可創建數據庫只讀副本,在數據誤刪後恢復數據。慎用DELETE語句:仔細檢查條件,避免誤刪數據。使用WHERE子句:明確指定要刪除的數據。使用測試環境:在執行DELETE操作前進行測試。
