mysql基礎知識(二)
多表查詢
多表查詢有如下幾種:
合併結果集;UNION 、 UNION ALL 瞭解
連接查詢
內連接 [INNER] JOIN ON
外連接 OUTER JOIN ON
左外連接 LEFT [OUTER] JOIN
右外連接 RIGHT [OUTER] JOIN
全外連接(MySQL不支持)FULL JOIN
自然連接 NATURAL JOIN
子查詢
外鍵中可以存在null
合併結果集
union(自動去重) union all (不會去重)
列數不同不行,類型不同也不行 。在合併結果集時,倆個表的字段個數和類型必須一致。
要求:被合併的兩個結果:列數、列類型必須相同。
連接查詢
連接查詢會產生笛卡爾積,假設集合A={a,b}B={0,1,2,2},則兩個集合的笛卡爾積爲。可以擴展到多個集合的情況。那麼多表查詢產生這樣的結果並不是我們想要的,那麼怎麼去除重複的,不想要的記錄呢,當然是通過條件過濾。通常要查詢的多個表之間都存在關聯關係,那麼就通過關聯關係去除笛卡爾積。
內連接
上面的連接語句就是內連接,但它不是SQL標準中的查詢方式,可以理解爲方言!SQL標準的內連接爲:
外連接
外連接的特點:查詢出的結果存在不滿足條件的可能。
左連接:
左外連接
左連接是先查詢出左表(即以左表爲主),然後查詢右表,右表中滿足條件的顯示出來,不滿足條件的顯示NULL。這麼說你可能不太明白,我們還是用上面的例子來說明。其中emp表中“張三”這條記錄中,部門編號爲50,而dept表中不存在部門編號爲50的記錄,所以“張三”這條記錄,不能滿足e.deptno=d.deptno這條件。但在左連接中,因爲emp表是左表,所以左表中的記錄都會查詢出來,即“張三”這條記錄也會查出,但相應的右表部分顯示NULL。
右外連接
右連接就是先把右表中所有記錄都查詢出來,然後左表滿足條件的顯示,不滿足顯示NULL。例如在dept表中的40部門並不存在員工,但在右連接中,如果dept表爲右表,那麼還是會查出40部門,但相應的員工信息爲NULL。
連接查詢心得:
連接不限與兩張表,連接查詢也可以是三張、四張,甚至N張表的連接查詢。通常連接查詢不可能需要整個笛卡爾積,而只是需要其中一部分,那麼這時就需要使用條件來去除不需要的記錄。這個條件大多數情況下都是使用主外鍵關係去除。兩張表的連接查詢一定有一個主外鍵關係,三張表的連接查詢就一定有兩個主外鍵關係,所以在大家不是很熟悉連接查詢時,首先要學會去除無用笛卡爾積,那麼就是用主外鍵關係作爲條件來處理。如果兩張表的查詢,那麼至少有一個主外鍵條件,三張表連接至少有兩個主外鍵條件。
全外連接
自然連接:自然連接 natural join 要有主外鍵,而且主外鍵的名字要相同,如果沒有主外鍵,他默認會找字段相同的所有字段進行比較,如果沒有字段相同的字段報錯
子查詢
– 連接查詢 笛卡爾積(避免)
– 可以使用主外鍵關係來去除無用信息
– 注意:
SELECT *,MAX(sal) FROM emp GROUP BY deptno
分組的信息是組內第一條信息,加函數沒用
select from 都是獨立的子句
函數
ADDTIME (date2 ,time_interval ) | 將time_interval加到date2 |
---|---|
CURRENT_DATE ( ) | 當前日期 |
CURRENT_TIME ( ) | 當前時間 |
CURRENT_TIMESTAMP ( ) | 當前時間戳 |
DATE (datetime ) | 返回datetime的日期部分** |
DATE_ADD (date2 , INTERVAL d_value d_type ) | 在date2中加上日期或時間 |
DATE_SUB (date2 , INTERVAL d_value d_type ) | 在date2上減去一個時間 |
DATEDIFF (date1 ,date2 ) | 兩個日期差 |
NOW ( ) | 當前時間 |
YEAR|Month|Day(datetime ) | 年月日 |
CHARSET(str) | 返回字串字符集 |
---|---|
CONCAT (string2 [,… ]) | 連接字串 |
INSTR (string ,substring ) | 返回substring在string中出現的位置,沒有返回0 |
UCASE (string2 ) | 轉換成大寫 |
LCASE (string2 ) | 轉換成小寫 |
LEFT (string2 ,length ) | 從string2中的左邊起取length個字符 |
LENGTH (string ) | string長度 |
REPLACE (str ,search_str ,replace_str ) | 在str中用replace_str替換search_str |
STRCMP (string1 ,string2 ) | 逐字符比較兩字串大小**,** |
SUBSTRING (str , position [,length ]) | 從str的position開始**,取length****個字符** |
LTRIM (string2 ) RTRIM (string2 ) trim | 去除前端空格或後端空格 |
ABS (number2 ) | 絕對值 |
---|---|
BIN (decimal_number ) | 十進制轉二進制 |
CEILING (number2 ) | 向上取整 |
CONV(number2,from_base,to_base) | 進制轉換 |
FLOOR (number2 ) | 向下取整 |
FORMAT (number,decimal_places ) | 保留小數位數 |
HEX (DecimalNumber ) | 轉十六進制 |
LEAST (number , number2 [,…]) | 求最小值 |
MOD (numerator ,denominator ) | 求餘 |
RAND([seed]) | RAND([seed]) |
生成SQL腳本 導出數據
在控制檯使用mysqldump命令可以用來生成指定數據庫的腳本文本,但要注意,腳本文本中只包含數據庫的內容,而不會存在創建數據庫的語句!所以在恢復數據時,還需要自已手動創建一個數據庫之後再去恢復數據。
mysqldump –u用戶名 –p密碼 數據庫名>生成的腳本文件路徑
現在可以在C盤下找到mydb1.sql文件了!
注意,mysqldump命令是在Windows控制檯下執行,無需登錄mysql!!!
2 執行SQL腳本 恢復數據
前提:必須先創建數據庫名
執行SQL腳本需要登錄****mysql,然後進入指定數據庫,纔可以執行SQL腳本!!!
執行SQL腳本不只是用來恢復數據庫,也可以在平時編寫SQL腳本,然後使用執行SQL 腳本來操作數據庫!大家都知道,在黑屏下編寫SQL語句時,就算髮現了錯誤,可能也不能修改了。所以我建議大家使用腳本文件來編寫SQL代碼,然後執行之!
SOURCE C:\mydb1.sql
注意,在執行腳本時需要先行覈查當前數據庫中的表是否與腳本文件中的語句有衝突!例如在腳本文件中存在create table a的語句,而當前數據庫中已經存在了a表,那麼就會出錯!
mysql
–u用戶名 –p密碼 數據庫<要執行腳本文件路徑
還可以通過下面的方式來執行腳本文件:
mysql -uroot -p123 mydb1<c:\mydb1.sql
這種方式無需登錄mysql!注意:在cmd 下不能加
在多表查詢中,在使用列時必須指定列所從屬的表,例如emp.deptno表示emp表的deptno列。
其中AS是可以省略的
INNER可以省略,MySQL默認的連接方式就是內連接
不使用WHERE,而是使用ON
OUTER可以省略
內連接
左連接
右連接
大於所有