MySql數據庫,《MYSQL必知必會》—3~9.使用MySQL、檢索數據列、排序檢索數據列、過濾數據(WHERE子句、組合WHERE子句、通配符、正則表達式)

 2023-12-09 阅读 21 评论 0

摘要:文章目錄1.如何用USE選擇數據庫2.如何用SHOW查看MySQL數據庫、表和內部信息3. 如何使用SELECT語句從表中檢索一個或多個數據列3.1 檢索單個列3.2 檢索多個列3.3 檢索所有列3.4 檢索不同的行—DISTINCT3.5 限制結果—LIMIT3.6 使用完全限定的表名4. 如何使用SELECT語句的ORDER

文章目錄

      • 1.如何用USE選擇數據庫
      • 2.如何用SHOW查看MySQL數據庫、表和內部信息
      • 3. 如何使用SELECT語句從表中檢索一個或多個數據列
        • 3.1 檢索單個列
        • 3.2 檢索多個列
        • 3.3 檢索所有列
        • 3.4 檢索不同的行—DISTINCT
        • 3.5 限制結果—LIMIT
        • 3.6 使用完全限定的表名
      • 4. 如何使用SELECT語句的ORDER BY子句,根據需要排序檢索出的數據
        • 4.1 排序數據
        • 4.2 按多個列排序
        • 4.3 指定排序方向—DESC與ASC
      • 5. 如何使用SELECT語句的WHERE子句過濾數據
        • 5.1 使用WHERE子句
        • 5.2 WHERE子句操作符
          • 5.2.1 檢查單個值
          • 5.2.2 不匹配檢查
          • 5.2.3 范圍檢查—BETWEEN
          • 5.2.4 空值檢查—IS NULL
      • 6.如何組合WHERE子句進行數據過濾以及如何使用NOT和IN操作符
        • 6.1 組合WHERE子句
          • 6.1.1 AND操作符
          • 6.1.2 OR操作符
          • 6.1.3 計算次序—圓括號
        • 6.2 IN操作符
        • 6.3 NOT操作符
      • 7.如何使用通配符以及怎樣使用LIKE操作符進行通配搜索,以便對數據進行復雜過濾
        • 7.1 LIKE操作符
          • 7.1.1 百分號(%)通配符
          • 7.1.2 下劃線(_)通配符
        • 7.2 使用通配符的技巧
      • 8. 如何在MySQL WHERE子句內使用正則表達式來更好地控制數據過濾
        • 8.1 使用MySQL正則表達式
          • 8.1.1 基本字符匹配—REGEXP
          • 8.1.2 進行OR匹配—|
          • 8.1.3 匹配幾個字符之一 — []
          • 8.1.4 匹配范圍— -
          • 8.1.5 匹配特殊字符
          • 8.1.6 匹配字符類
          • 8.1.7 匹配多個實例
          • 8.1.8 定位符

1.如何用USE選擇數據庫

  1. 使用USE打開數據庫,才能讀取其中的數據USE database_name;

2.如何用SHOW查看MySQL數據庫、表和內部信息

  1. MySql數據庫、MySQL的SHOW命令來顯示這些信息(MySQL從內部表中提取這些信息)。
    SHOW DATABASES;返回可用數據庫的一個列表。
    SHOW TABLES;返回當前選擇的數據庫內可用表的列表。
    SHOW COLUMNS要求給出一個表名,它對每個字段返回一行,行中包含字段名、數
    據類型、是否允許NULL、鍵信息、默認值以及其他信息(如字段cust_id的auto increment)。

    SHOW COLUMNS FROM customers;

    在這里插入圖片描述
    DESCRIBE customers;SHOW COLUMNS FROM customers;的一種快捷方式。
    SHOW STATUS;用于顯示廣泛的服務器狀態信息;
    SHOW CREATE DATABASE;SHOW CREATE TABLE;分別用來顯示創建特定數據庫或表的MySQL語句;
    SHOW GRANTS;用來顯示授予用戶(所有用戶或特定用戶)的安全權限;
    SHOW ERRORS;SHOW WARNINGS;用來顯示服務器錯誤或警告消息。

  2. 在mysq1命令行實用程序中,執行命令HELP SHOW;顯示允許的SHOW語句。

  3. MySQL索引的實現原理,MySQL 5的新增內容 INFORMATION SCHEMA;命令,可用它來獲得和過濾模式信息。

3. 如何使用SELECT語句從表中檢索一個或多個數據列

??為了使用SELECT檢索表數據,必須至少給出兩條信息——想選擇什么,以及從什么地方選擇。

3.1 檢索單個列

SELECT prod_name FROM products;利用SELECT語句從products表中檢索一個名為prod_name的列。所需的列名在SELECT關鍵字之后給出,FROM關鍵字指出從其中檢索數據的表名。

3.2 檢索多個列

MySQL 查詢。SELECT prod_id, prod_name,prod_price FROM products;要想從一個表中檢索多個列,使用相同的SELECT語句。唯一的不同是必須在SELECT關鍵字后給出多個列名,列名之間必須以逗號分隔。

3.3 檢索所有列

SELECT * FROM products;如果給定一個通配符(*),則返回表中所有列。

檢索未知列是使用通配符有一個大優點。由于不明確指定列名((因為星號檢索每個列),所以能檢索出名字未知的列。

3.4 檢索不同的行—DISTINCT

SELECT返回所有匹配的行。但是,如果你不想要每個值每次都出現,怎么辦?使用DISTINCT關鍵字。此關鍵字指示MySQL只返回不同的值
SELECT DISTINCT vend_id FROM products;SELECT DISTINCT vend id告訴MySQL只返回不同(唯一)的vend id行。如果使用DISTINCT關鍵字,它必須直接放在列名的前面。

不能部分使用DISTINCT : DISTINCT關鍵字應用于所有列而不僅是前置它的列。如果給出SELECT DISTINCT vend_ id,prod price,除非指定的兩個列都不同,否則所有行都將被檢索出來。

3.5 限制結果—LIMIT

SELECT prod_name FROM products LIMIT 5;此語句使用SELECT語句檢索單個列。LIMIT 5指示MySQL返回不多于5行。
SELECT prod_name FROM products LIMIT 5,5;LIMIT 5,5指示MySQL返回從行5開始的5行。第一個數指定檢索的開始行,第二個數指定檢索的行數。

在行數不夠時 : LIMIT中指定要檢索的行數為檢索的最大行數。如果沒有足夠的行(例如,給出LIMIT 10,5,但只有13行),MySQL將只返回它能返回的那么多行。

或者

SELECT prod_name FROM products LIMIT 4 OFFSET 3  # 意為從行3開始取4行,是LIMIT3,4的替代語法

3.6 使用完全限定的表名

上述是通過列名引用列,還可以通過下面方式引用
SELECT products.prod_name FROM products;使用完全限定的名字來引用列(同時使用表名和列字)
SELECT products.prod_nameFROM crashcourse.products;表名也可以是完全限定的

4. 如何使用SELECT語句的ORDER BY子句,根據需要排序檢索出的數據

??為了明確地排序用SELECT語句檢索出的數據,可使用ORDER BY子句。ORDER BY子句取一個或多個列的名字,據此對輸出進行排序。默認,按照升序排序(A-Z)。ORDER BY子句必須是SELECT語句中的最后一條子句。可根據需要,利用它在一個或多個列上對數據進行排序。

4.1 排序數據

SELECT prod_name FROM products ORDER BY prod_name;利用SELECT語句從products表中檢索一個名為prod_name的列,并且以ORDER BY子句指示MySQL對prod_name列以字母順序排序數據

通過非選擇列進行排序通常,0RDER BY子句中使用的列將是為顯示所選擇的列。但是,實際上并不一定要這樣,用非檢索的列排序數據是完全合法的。

4.2 按多個列排序

SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price,prod_name;選擇三個列并按其中兩個列對結果進行排序,列名之間用逗號分開即可
在這里插入圖片描述
僅在多個行具有相同的prod price值時才對產品按prod name進行排序。如果prod price列中所有的值都是唯一的,則不會按prod_name排序。總結來說,先按第一個列進行排序,相同在對相同的行使用后面的列進行排序

4.3 指定排序方向—DESC與ASC

??數據排序不限于升序排序(從A到z)。這只是默認的排序順序,還可以使用ORDER BY子句以降序(從Z到A))順序排序。為了進行降序排序,必須指定DESC關鍵字。ASC(升序)是默認的關鍵字。

SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price DESC;以價格降序排序
SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price DESC,prod_name;DESC關鍵字只應用到直接位于其前面的列名。prod_price列指定DESC,對prod_name列不指定。因此,prod_price列以降序排序,而prod_name列(在每個價格內)仍然按標準的升序排序。

# 使用ORDER BY和LIMIT的組合,能夠找出一個列中最高或最低的值,這里是DESC關鍵字,降序排序,是最大值
SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;

ORDER BY子句的位置: 在給出ORDER BY子句時,應該保證它位于FROM子句之后。如果使用LIMIT,它必須位于ORDER BY之后。使用子句的次序不對將產生錯誤消息。

5. 如何使用SELECT語句的WHERE子句過濾數據

5.1 使用WHERE子句

??在SELECT語句中,數據根據WHERE子句中指定的搜索條件進行過濾。WHERE子句在表名(FROM子句)之后給出

# 從products表中檢索兩個列,但不返回所有行,只返回prod price值為2.50的行
SELECT prod_name, prod_price FROM products WHERE prod_price = 2.50;

WHERE子句的位置:在同時使用ORDER BY和WHERE子句時,應該讓ORDER BY位于WHERE之后,否則將會產生錯誤

5.2 WHERE子句操作符

在這里插入圖片描述
這些操作符皆可以用于WHERE子句中用于過濾數據

5.2.1 檢查單個值
# 單引號用來限定字符串
SELECT prod_name,prod_price FROM products WHERE prod_name = 'fuses';

在這里插入圖片描述

檢查WHERE prod _name='fuses’語句,它返回prod_name的值為Fuses的一行。MySQL在執行匹配時默認不區分大小寫,所以fuses與Fuses匹配

# 列出價格小于10美元的所有產品
SELECT prod_name,prod_price FROM products WHERE prod_price <10;

在這里插入圖片描述

5.2.2 不匹配檢查
# 列出不是由供應商1003制造的所有產品
SELECT vend_id,prod_name FROM products WHERE vend_id <> 1003;
5.2.3 范圍檢查—BETWEEN

??為了檢查某個范圍的值,可使用BETWEEN操作符。它需要兩個值,即范圍的開始值與結束值。BETWEEN匹配范圍中所有的值,包括指定的開始值和結束值。

# 檢索價格在5美元和10美元之間的所有產品
SELECT prod_name,prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;

在這里插入圖片描述

5.2.4 空值檢查—IS NULL

??在創建表時,表設計人員可以指定其中的列是否可以不包含值。在一個列不包含值時,稱其為包含空值NULL。SELECT語句有一個特殊的WHERE子句,可用來檢查具有NULL值的列。這個WHERE子句就是IS NULL子句。

SELECT prod_name FROM products WHERE prod_price IS NULL;

這條語句返回沒有價格(空prod_price字段,不是價格為0)的所有產品,由于表中沒有這樣的行,所以沒有返回數據。

NULL與不匹配
在通過過濾選擇出不具有特定值的行時,你可能希望返回具有NULL值的行。但是,不行。因為未知具有特殊的含義,數據庫不知道它們是否匹配,所以在匹配過濾或不匹配過濾時不返回它們。因此,在過濾數據時,一定要驗證返回數據中確實給出了被過濾列具有NULL的行。

6.如何組合WHERE子句進行數據過濾以及如何使用NOT和IN操作符

6.1 組合WHERE子句

??在上一部分介紹的所有WHERE子句,在過濾數據時使用的都是單一的條件。為了進行更強的過濾控制,MySQL允許給出多個WHERE子句。這些子句可以兩種方式使用:以AND子句的方式或OR子句的方式使用。

6.1.1 AND操作符

??為了通過不止一個列進行過濾,可使用AND操作符給WHERE子句附加條件,AND操作符指示MySQL檢索匹配所有條件的行

SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;

此SQL語句檢索由供應商1003制造且價格小于等于10美元的所有產品的名稱和價格。這條SELECT語句中的WHERE子句包含兩個條件,并且用AND關鍵字聯結它們。AND指示DBMS只返回滿足所有給定條件的行。

上述例子中使用了只包含一個關鍵字AND的語句,把兩個過濾條件組合在一起。還可以添加多個過濾條件,每添加一條就要使用一個AND

6.1.2 OR操作符

??OR操作符指示MySQL檢索匹配任一條件的行

SELECT prod_name,prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003;

此SQL語句檢索由任一個指定供應商制造的所有產品的產品名和價格。OR操作符告訴DBMS匹配任一條件而不是同時匹配兩個條件。

6.1.3 計算次序—圓括號

??WHERE可包含任意數目的AND和OR操作符。允許兩者結合以進行復雜和高級的過濾。但是,組合AND和OR帶來了一個有趣的問題。SQL(像多數語言一樣)在處理0R操作符前,優先處理AND操作符

SELECT prod_name,prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003 AND prod_price >= 10;

在這里插入圖片描述
此SQL語句檢索由供應商1003制造的任何價格為10美元(含)以上的產品,或者由供應商1002制造的任何產品,而不管其價格如何。如果你想檢索價格為10美元(含)以上且由1002或1003制造的所有產品,就需要使用圓括號明確地分組相應的操作符。因為圓括號具有較AND或OR操作符高的計算次序

在WHERE子句中使用圓括號,任何時候使用具有AND和0R操作符的WHERE子句,都應該使用圓括號明確地分組操作符。不要過分依賴默認計算次序,即使它確實是你想要的東西也是如此。使用圓括號沒有什么壞處,它能消除歧義。

SELECT prod_name,prod_price FROM products WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;

在這里插入圖片描述

6.2 IN操作符

??IN操作符用來指定條件范圍,范圍中的每個條件都可以進行匹配。IN取合法值的由逗號分隔的清單,全都括在圓括號中。

# IN操作符完成與OR相同的功能
SELECT prod_name,prod_price FROM products WHERE vend_id IN (1002,1003) ORDER BY prod_name;SELECT prod_name,prod_price FROM products WHERE vend id=1002 OR vend_id = 1003 ORDER BY prod_name;

在這里插入圖片描述
此SELECT語句檢索供應商1002和1003制造的所有產品。IN操作符后跟由逗號分隔的合法值清單,整個清單必須括在圓括號中。

為什么要使用IN操作符?
其優點具體如下:

  1. 在使用長的合法選項清單時,IN操作符的語法更清楚且更直觀。
  2. 在使用IN時,計算的次序更容易管理(因為使用的操作符更少)
  3. IN操作符一般比OR操作符清單執行更快
  4. IN的最大優點是可以包含其他SELECT語句,使得能夠更動態地建立WHERE子句。

6.3 NOT操作符

??WHERE子句中的NOT操作符有且只有一個功能,那就是否定它之后所跟的任何條件

# 列出除1002和1003之外的所有供應商制造的產品
SELECT prod_name,prod_price FROM products WHERE vend_id NOT IN (1002,1003) ORDER BY prod_name;

在這里插入圖片描述

MySQL中的NOT MySQL支持使用NOT 對IN、 BETWEEN和EXISTS子句取反,這與多數其他DBMS允許使用NOT對各種條件取反有很大的差別。

7.如何使用通配符以及怎樣使用LIKE操作符進行通配搜索,以便對數據進行復雜過濾

7.1 LIKE操作符

??前面介紹的所有操作符都是針對已知值進行過濾的。不管是匹配一個還是多個值,測試大于還是小于已知值,或者檢查某個范圍的值,共同點是過濾中使用的值都是已知的。但是,這種過濾方法并不是任何時候都好用。例如,怎樣搜索產品名中包含文本anvil的所有產品?用簡單的比較操作符肯定不行,必須使用通配符利用通配符可以創建比較特定數據的搜索模式。在這個例子中,如果你想找出名稱包含anvil的所有產品,可構造一個通配符搜索模式,找出產品名中任何位置出現anvil的產品。

通配符(wildcard):用來匹配值的一部分的特殊字符
搜索模式(search pattern):由字面值、通配符或兩者組合構成的搜索條件

為在搜索子句中使用通配符,必須使用LIKE操作符。LIKE指示MySQL后跟的搜索模式利用通配符匹配而不是直接相等匹配進行比較。

7.1.1 百分號(%)通配符

??在搜索串中,%表示任何字符出現任意次數

除了一個或多個字符外,%還能匹配0個字符。%代表搜索模式中給定位置的0個、1個或多個字符。

# 找出所有以詞jet起頭的產品,使用了搜索模式'jet%'。
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE 'jet%';

在這里插入圖片描述

此例子使用了搜索模式'jet%'。在執行這條子句時,將檢索任意以jet起頭的詞。%告訴MySQL接受jet之后的任意字符,不管它有多少字符。
??通配符可在搜索模式中任意位置使用,并且可以使用多個通配符。下面使用兩個通配符,它們位于模式的兩端。

SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '%anvi1%';

在這里插入圖片描述
搜索模式'%anvi1%'表示匹配任何位置包含文本anvil的值,而不論它之前或之后出現什么字符。

注意NULL
雖然似乎%通配符可以匹配任何東西,但有個例外,即NULL。即使是WHERE prod name LIKE '%'也不能匹配用值NULL作為產品名的行。

7.1.2 下劃線(_)通配符

??下劃線的用途與%一樣,但下劃線只匹配單個字符而不是多個字符。下面進行對比:

SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '_ ton anvi1';

在這里插入圖片描述

SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '% ton anvi1';

在這里插入圖片描述

7.2 使用通配符的技巧

??MySQL的通配符很有用。但這種功能是有代價的:通配符搜索的處理一般要比前面討論的其他搜索所花時間更長

使用通配符要記住的技巧:

  1. 不要過度使用通配符。如果其他操作符能達到相同的目的,應該使用其他操作符。
  2. 在確實需要使用通配符時,除非絕對有必要,否則不要把它們用在搜索模式的開始處。把通配符置于搜索模式的開始處,搜索起來是最慢的。
  3. 仔細注意通配符的位置。如果放錯地方,可能不會返回想要的數

8. 如何在MySQL WHERE子句內使用正則表達式來更好地控制數據過濾

8.1 使用MySQL正則表達式

??正則表達式的作用是匹配文本,將一個模式(正則表達式)與一個文本串進行比較。MySQL用WHERE子句對正則表達式提供了初步的支持,允許你指定正則表達式,過濾SELECT檢索出的數據。

8.1.1 基本字符匹配—REGEXP
# 檢索列prod_name包含文本1000的所有行
SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;

在這里插入圖片描述

SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;

在這里插入圖片描述
這里使用了正則表達式.000。.是正則表達式語言中一個特殊的字符。它表示匹配任意一個字符,因此,1000和2000都匹配且返回。

匹配不區分大小寫
MySQL中的正則表達式匹配(自版本3.23.4后)不區分大小寫(即大寫和小寫都匹配)。
區分大小寫,可使用BINARY關鍵字,如WHERE prod name REGEXPBINARY ‘JetPack .000’.

8.1.2 進行OR匹配—|

??|為正則表達式的OR操作符。它表示匹配其中之一

SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;

在這里插入圖片描述
此SQL語句中使用了正則表達式1000 | 2000。|為正則表達式的OR操作符。它表示匹配其中之一,因此1000和2000都匹配并返回。

8.1.3 匹配幾個字符之一 — []

??匹配任何單一字符。可通過指定一組用[]括起來的字符來完成

SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;

在這里插入圖片描述
這里,使用了正則表達式[ 123] Ton。[ 123]定義一組字符,它的意思是匹配1或2或3,因此,1 ton和2 ton都匹配且返回
??這里舉例以明確需要用[]來定義OR語句查找什么。

SELECT prod_name FROM products WHERE prod_name REGEXP '1|2|3 Ton' ORDER BY prod_name;

在這里插入圖片描述
這個輸出不是期望中的輸出,這是因為除非把字符|括在一個集合中,否則它將應用于整個串。

字符集合也可以被否定,即它們將匹配除指定字符外的任何東西。
為否定一個字符集,在集合的開始處放置一個^即可。因此,盡管[123]匹配字符1、2或3,但[ ^123]卻匹配除這些字符外的任何東西。

8.1.4 匹配范圍— -

??集合可用來定義要匹配的一個或多個字符。[0-9]匹配0到9內數字,[a-z]匹配任意字母字符等

SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;

在這里插入圖片描述

8.1.5 匹配特殊字符

??正則表達式語言由具有特定含義的特殊字符構成。如果你需要匹配這些字符,
應該怎么辦?為了匹配特殊字符,必須用\為前導。\\-表示查找-\\.表示查找.。這種操作就是轉義。

SELECT vend_name FROM vendors WHERE vend_name REGEXP '\\.' ORDER BY vend_name;

在這里插入圖片描述

8.1.6 匹配字符類

??存在找出你自己經常使用的數字、所有字母字符或所有數字字母字符等的匹配。為更方便工作,可以使用預定義的字符集,稱為字符類
在這里插入圖片描述

8.1.7 匹配多個實例

??正則表達式重復元字符
在這里插入圖片描述

SELECT prod_name FROM products WHERE prod_name REGEXP '\\([O-9] sticks?\\()' ORDER BY prod_name;

在這里插入圖片描述
正則表達式\\([0-9] sticks?\\)解析:
\\(匹配(,[0-9]匹配任意數字(這個例子中為1和5),sticks?匹配stick和sticks (s后的?使s可選,因為?匹配它前面的任何字符的0次或1次出現),\\)匹配)。沒有?,匹配stick和sticks會非常困難。

SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit: ]]{4}' ORDER BY prod_name;

在這里插入圖片描述
[[ :digit: ]]{4}匹配連在一起的任意4位數字

與下方等價

SELECT prod_name FROM products WHERE prod_name REGEXP ' [O-9][O-9][0-9][O-9]' ORDER BY prod_name;
8.1.8 定位符

??為了匹配特定位置的文本,需要使用定位元字符
在這里插入圖片描述

# 尋找以數字開始的所有產品
SELECT prod_name FROM products WHERE prod_name REGEXP '^[O-9\\.]' ORDER BY prod_name;

在這里插入圖片描述
^匹配串的開始。因此,^[0-9\\.]只在.或任意數字為串中第一個字符時才匹配它們。

使REGEXP起類似LIKE的作用:
LIKE 和REGEXP的不同在于,LIKE匹配整個串而REGEXP匹配子串。利用定位符,通過用^開始每個表達式,用$結束每個表達式,可以使REGEXP的作用與LIKE一樣。


如果對您有幫助,麻煩點贊關注,這真的對我很重要!!!如果需要互關,請評論或者私信!
在這里插入圖片描述


版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/193602.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息