MySQL必知必會1

来源:https://www.cnblogs.com/train99999/archive/2019/07/23/11234884.html
-Advertisement-
Play Games

MySQL必知必會 ​ 瞭解SQL 什麼是資料庫: 資料庫(database)保存有阻止的數據的容器,可以把資料庫想象成一個文件櫃。 什麼是表: 表(table) 某種特定類型結構的結構化清單,資料庫中的表的名字是唯一的。 什麼是列: 列(column)表中的一個欄位。所有表都是有一個或多個列組成的 ...


MySQL必知必會


瞭解SQL


什麼是資料庫:資料庫(database)保存有阻止的數據的容器,可以把資料庫想象成一個文件櫃。

什麼是表:表(table) 某種特定類型結構的結構化清單,資料庫中的表的名字是唯一的。

什麼是列:列(column)表中的一個欄位。所有表都是有一個或多個列組成的,理解列的最好辦法是將資料庫表想象為一個網格,網格中每一列存儲著一條特定信息。例如,編號,地址,郵政編碼。

什麼是行:行(row) 表中的數據是按行存儲的,所保存的每個記錄存儲在自己的行內,例如,每一行存儲一個顧客。

什麼是主鍵:主鍵(primary key ) 一列(或一組列)其值能夠唯一區分表中的每一行。唯一標識表中每行的這個列稱為主鍵。主鍵用來表示一個特定的行,沒有主鍵,更新或刪除特定的行很困難,因為沒有安全的方法保證只涉及相關的行。

什麼是SQL: SQL(發音為字母S-Q-L或sequel)是結構化查詢語言(Structured Query Language)的縮寫,SQL是一種專門用來與資料庫通信的語言。


檢索數據


SELECT語句:

檢索單個列:SELECT prod_name FROM products;

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

檢索多個列:SELECT prod_id,prod_name,prod_price FROM products;

分析:指定了3個列名,列名之間用逗號分隔,最後一個列名不加逗號

檢索所有列: SELECT * FROM products;

分析:如果給定了一個通配符(*),則返回表中的所有列。列的順序一般是列在表中定義出現的順序。但有時候並不是這樣的,表的模式的變化(如添加或刪除列),可能會導致順序變化

檢索不同的行:SELECT DISTINCT vend_id FROM products ;

分析:SELECT DISTINCT vend_id告訴MySQL只返回不同的vend_id行,如果使用DISTINCT關鍵字,必須放在列名的最前面

限制結果: SELECT pro_name FROM products LIMIT 5;

分析: 此語句使用SELECT語句檢索單個列,LIMIT 5指示MySQL返回不多於5行

為了得到下一個5行,可指定要檢索的開始行和行數: SELECT pro_name FROM products LIMIT 5 ,5

分析:LIMIT 5 , 5指示MySQL返回從行5開始的5行。第一個數為開始位置,第二個數為要檢索的行數。

註意:檢索從第0行開始

使用完全限定的表名:**完全限定(同時使用表名和列名)SELECT products.prod_name FROM products;


排序檢索數據


子句: SQL語句由子句構成,有些子句是必須的,而有的是可選的,

ORDER BY: SELECT prod_name FROM products ORDER BY prod_name

分析: 選擇prodects的prod_name列,對prod_name列按照字母升序

多個列排序: SELECT prod_id,pro_price,prod_name FROM products ORDER BY prod_price,prod_name;

分析: 僅在多個行具有相同的prod_price值時才對產品按prod_name進行排序。如果prod_price列中所有的值是唯一的,則不會按prod_name排序

指定排序方向: 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仍然按標準的升序排序

如果想在多個列進行降序排序,必須對每個列指定DESC關鍵字

升序:ASC,預設值


過濾數據


只檢索所需數據需要指定搜索條件,搜索條件也稱為過濾條件

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

輸入: SELECT prod_name,prod_price FROM products WHERE prod_price = 2.50;

分析: 這條語句從products表中檢索兩個列,但不返回所有行,只返回prod_price值為2.5的行

WHERE子句操作符

操作符 說明
= 等於
<> 不等於
!= 不等於
< 小於
<= 小於等於
> 大於
>= 大於等於
BETWEEN 在指定的兩個值之間

檢查單個值

輸入:SELECT prod_name,prod_price FROM products WHERE prod_name = 'fuses'

分析: 檢查WHERE prod_name='fuses'語句,他返回prod_name的值為Fuses的一行。MySQL在執行匹配時預設不區分大小寫

範圍值檢查

輸入: SELECT prod_name,prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;

分析: 在使用BETWEEN時,必須指定兩個值;所需範圍的低端值和高端值,這兩個值必須用AND關鍵字分隔,BETWEEN匹配範圍中所有的值,包括指定的開始和結束值。

空值檢查

在創建表時,表設計人員可以指定其中的列是否可以不包含值,一個列不包含值時,稱其為包含空值NULL

輸入: SELECT prod_name FROM products WHERE prod_price IS NULL;

分析: 這條語句返回沒有價格的所有產品


數據過濾


AND操作符

為了通過不止一個列進行過濾,可以使用AND操作符給WHERE子句附加條件。下麵的代碼給出了一個例子:

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

分析:此sql語句檢索由供應商1003製造且價格小於等於10美元的所有產品的名稱和價格。

AND:用在WHERE子句中的關鍵字,用來指示檢索滿足所有給定條件的行

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

OR操作符

OR操作符與AND操作符不同,他指示MySQL檢索任一條件的行

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

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

計算次序

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

分析: 圓括弧具有敲AND或OR操作符高的計算次序,DBMS首先過濾圓括弧內的OR條件。

IN操作符

圓括弧在WHERE子句中還有另外一種用法。IN操作符用來指定條件範圍,範圍中的每個條件都可以進行匹配。IN取合法值的由逗號分隔的清單全都在圓括弧中。

輸入: SELECT prod_name,prod_price FROM products WHERE vend_id IN(1002,1003) ORDER BY prod_name;

分析: 此SELECT語句檢索供應商1002和1003製造的所有產品。操作符後跟由逗號分隔的合法值清單,整個清單必須在圓括弧中

IN操作符與OR具有相同的功能

NOT操作符

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

NOT WHERE子句中用來否定後跟條件的關鍵字。

輸入: SELECT prod_name,prod_price FROM products WHERE vend_id NOT IN(1002,1003) ORDER BY prod_name;

分析: 這裡的NOT否定跟在他之後的條件,因此MySQL不是匹配1002和1003的vend_id,而是匹配1002和1003之外的供應商的


用通配符進行過濾


百分號(%)通配符

最常用的通配符是百分號(%)。在搜索串中,%表示任何字元出現的任意次數。例如,為了找出所有以詞jet開頭的產品,可以使用一下SELECT語句:

輸入: 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 '%anvil%';

分析: 搜索模式'%anvil%' 表示匹配任何位置包含文本anvil的值,不論他之前或之後出現什麼字元

**下劃線(_)通配符**

另一個有用的通配符是下劃線(_).下劃線的用途與%一樣,但下劃線只匹配單個字元而不是多個字元

輸入: SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '_ ton anvil';

分析: 與%能匹配0個字元不一樣,_總是匹配一個字元,不能多不能少


用正則表達式進行搜索


使用MySQL正則表達式

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

基本字元匹配

輸入:SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;

分析: 除了關鍵字LIKE被REGEXP替代外,這條語句非常像使用LIKE語句,他告訴MySQL:REGEXP後所跟的東西作為正則表達式(與文字正文1000匹配的一個正則表達式)處理

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

分析: 這裡使用正則表達式.000 。.是正則表達式語言中一個特殊的 字元,他表示匹配任意一個字元。

示例:

mysql> SELECT NAME FROM account WHERE NAME REGEXP '.s' ORDER BY NAME;
+------+
| NAME |
+------+
| test |
| tsdf |
+------+

進行OR匹配

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

分析: 語句中使用正則表達式1000|2000為正則表達式的OR操作符,他表示匹配其中之一,相當於OR語句。

匹配幾個字元之一

匹配任何單一字元,但是,如果你只想匹配特定的字元,可以通過指定一組用[和]括起來的字元來完成

輸入: 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都可以匹配且返回(沒有3 ton)

示例:

mysql> SELECT NAME FROM account WHERE NAME REGEXP '[at]est' ORDER BY NAME;
+------+
| NAME |
+------+
| aest |
| test |
+------+

匹配範圍

集合可以用來定義要匹配的一個或多個字元,

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

分析: 這裡使用正則表達式[1-5] Ton [1-5]定義了一個範圍,這個表達式的意思是匹配1到5

示例:

mysql> SELECT NAME FROM account WHERE NAME REGEXP '[a-z]cc'  ORDER BY NAME;
+------+
| NAME |
+------+
| ccc  |
| ccc  |
+------+

匹配特殊字元

如何匹配 .、|、-等特殊字元

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

分析:

\\.匹配.,這種處理方式稱之為轉義

匹配多個實例

重覆元字元

元字元 說明
* 0個或者多個匹配
+ 1個或多個匹配(等於{1,})
? 0個或1個匹配(等於{0,1})
{n} 指定數目的匹配
{n,} 不少於指定數目的匹配
{n,m} 匹配數目的範圍(m不超過255)

輸入:

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

分析: sticks? 匹配stick和sticks,?表示0個或1個匹配

輸入:

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

分析: [:digit:]匹配任意數字 ,{4}:確切的要求他前面的字元(任意數字),出現4次,匹配prod_name文本中包含4個任意連在一起的數字

定位符

目前為止的所有例子都是匹配一個串中任意位置的文本,為了匹配特定位置的文本,需要使用定位符

元字元 說明
^ 文本的開始
$ 文本的結尾
[[:<:]] 詞的開始
[[:>:"]] 詞的結尾

示例

mysql> SELECT NAME FROM account WHERE NAME REGEXP '[[:<:]]t'  ORDER BY NAME;
+------+
| NAME |
+------+
| t57L |
| test |
| tsdf |

創建計算欄位


拼接欄位

vendors表包含供應商和位置信息。假如要生成一個供應商報表,需要在供應商的名字中按照name(location)這樣的格式列出供應商的位置

解決辦法是把兩個列拼接起來,在MySQL的SELECT語句中,可以使用Concat()函數拼接兩個列

輸入: SELECT Concat(vend_name,'(',vend_country,')') FROM vendors ORDER BY vend_name;

分析: Concat()拼接串,既把多個串連接起來形成一個較長的串

示例:

mysql> SELECT CONCAT(RTRIM(NAME),'(',RTRIM(money),')') FROM account ORDER BY NAME;
+------------------------------------------+
| CONCAT(RTRIM(NAME),'(',RTRIM(money),')') |
+------------------------------------------+
| aaa(500)                                 |
| NULL                                     |
| bbb(1500)                                |
| ccc(1000)                                |
| ccc(1000)                                |
| ddd(13240)                               |
| ddd(13240)                               |
| t57L(1452)                               |
| test(66666)                              |
| tsdf(14520)                              |
+------------------------------------------+

Trim函數:去除空格

使用別名

從前面的輸出中可以看到,SELECT語句拼接地址欄位工作得很好,但此新計算列的名字是什麼呢?實際上他沒有名字,他只是一個值,如果僅在SQL查詢工具查看一下結果,這樣沒有什麼不好,但是,一個未命名的列不能用於客戶機應用中,因為客戶機沒有辦法引用他。

解決辦法是,使用別名(alias),別名是一個欄位或者的替換名

輸入: SELECT CONCAT(RTRIM(NAME), '(',RTRIM(money),')') AS vend_title FROM account ORDER BY NAME;

分析: 他指示SQL創建一個包含指定計算的名為vend_title的計算欄位

執行算數計算

輸入:

SELECT prod_id,

quantity,

item_price,

quantity*item_price AS expanded_price

FROM orderitems

WHERE order_num = 20005;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • grep:文本過濾工具(找到要找的文本) print lines matching a pattern例: 列印 行 匹配 一個 模式/樣式[root@oldboyedu /opt]# grep "oldboy" oldboy.txt Welcome to oldboy training.grep ...
  • 前言:方法為上傳本地jdk壓縮包文件到遠程linux系統 <<< 驗證系統位數 >>> 在安裝之前,先驗證Linux系統的位數。 運行結果如下,結果顯示當前系統為64位 <<< 官網下載jdk壓縮包 >>> 選擇箭頭指向的壓縮包 <<< 上傳壓縮包 >>> 首先通過在xshell上傳壓縮包 效果圖如 ...
  • 如何選擇適合自己的Linux版本: 1.Linux桌面系統,首選Ubuntu; 2.伺服器端的Linux系統,首選RHEL或CentOS,這兩種中首選CentOS,如果公司有錢,不在乎成本也可以選擇RHEL; 3.如果對安全要求很高,可選擇Debian或FreeBSD; 4.如果需要使用資料庫高級服 ...
  • [toc] 進程的優先順序 那麼在系統中如何給進程配置優先順序 在啟動進程時,為不同的進程使用不同的調度策略。 nice值越高:表示優先順序越低,例如19,該進程容易將CPU使用量讓給其他進程。 nice值越低:表示優先順序越高,例如 20,該進程更不傾向於讓出CPU。 遠程連接不上操作步驟 網路 埠 用 ...
  • 轉自:https://blog.csdn.net/maxsky/article/details/44905003 大家都知道在 Linux 下,執行 su 命令後輸入密碼即可切換到 root 用戶執行各類操作 但是 Mac 下,這樣行不通,只會返回你一句 Sorry! 解決方法很簡單,首先打開終端 ...
  • 1.查找/var目錄下不屬於root、lp、gdm的所有文件。find /var -not \ (-user root -o -user lp -user gdm) -ls 2.統計/etc/init.d/functions文件中的每個單詞出現次數,併排序,用grep和sed兩種方法實現。 sed方 ...
  • #!/bin/bash #History: #2019/07/23 Fsq #This Program will check Permissions on dir PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/ ...
  • MySQL的sql_mode合理設置 sql_mode是個很容易被忽視的變數,預設值是空值,在這種設置下是可以允許一些非法操作的,比如允許一些非法數據的插入。在生產環境必須將這個值設置為嚴格模式,所以開發、測試環境的資料庫也必須要設置,這樣在開發測試階段就可以發現問題. sql model 常用來解 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...