Mysql基礎3-數據操作語言DML-數據查詢語言DQL
主要:
- 數據操作語言DML
- 數據查詢語言DQL
數據操作語言DML
DML: Data Mutipulation Language
插入數據(增)
一般插入數據形式
1)形式1: insert [into] 表名 [(字段名1,字段名2,....)] values(值表達式1, 值表達式2,.......),(.....),...;
以"行"為單位進行插入,可以一次插入多行數據,使用逗號分隔。
值列表與字段名列表一一對應。 值表達式可以是一個“直接值”, 或函數調用的結果,或變量
2)形式2: replace [into] 表名 [(字段名1,字段名2,....)] values(值表達式1, 值表達式2,.......),(.....),...;
與形式1的區別: 如果插入的數據的主鍵或唯一鍵有重復, 則此時就會變為“修改該行數據”。
既會先刪除原來的數據行,然後插入該數據。
3)形式3: insert [into] 表名 [(字段名1,字段名2,....)] select 字段名1,字段名2,..... from 其他表名;
將select語句查詢的結果都插入到指定的數據表中。註意:字段要對應,既select 結果字段與 插入表的字段要一一對應。
4) 形式4: insert [into] 表名 set 字段名1=值表達式1,字段名2=值表達式2,....;
一次只能插入一行語句
完整復制表(包括表結構和表數據): create table 新表名 select * from 舊表名;
字符串類型和時間類型的字面量需要用引號括起來。
#主鍵的作用: 保證每一行數據具有唯一性: create table tab_no_primary ( id int, name varchar(10) ); insert into tab_no_primary values(1,‘aa‘); insert into tab_no_primary values【點擊查看】插入數據Demo(1,‘aa‘); #對比表和對比數據 -- 主鍵與非主鍵表插入重復數據對比 create table tab_primary( id int, name varchar(10), primary key (id) ); insert into tab_primary values(1,‘aa‘); insert into tab_primary values(1,‘aa‘); #報錯 #replace into 語句 insert into tab_primary values(1,‘bb‘); # 會報錯 主鍵已經存在 replace into tab_primary values(1,‘bb‘); # 會將相同主鍵的數據給修改 #insert into ...... select ...語句 insert into tab_no_primary select * from tab_primary;
load 插入
載入文本數據:load data infile 完整數據路徑 into table 表名
適用於: 結構整齊的純文本數據
load操作可能會出現的錯誤: 請參看“Mysql錯誤積累001-load data導入文件數據出現1290錯誤”
刪除數據 (刪)
形式: delete from 表名 【where 條件】 【order by 排序】 【limit 限定行數】
以行為單位進行刪除。為了安全通常刪除都要帶where條件
常見使用形式: delete from 表名 where 條件
修改數據 (改)
形式: update 表名 set 字段1=值1,字段2=值2,.... 【where 條件】 【order by 排序】 【limit 限定行數】
update時一把需加where條件,否則會同時修改全部數據。
字符串或時間類型的值要加引號。
常見形式: update 表名 set 字段1=值1,字段2=值2,.... where條件
數據查詢語言DQL
形式:
select 【all | distinct】 字段或表達式列表 【from子句】 【where子句】 【group by子句】 【having子句】 【order by子句】【limit 子句】
【】可以省略, 如果出現,需要按上述順序書寫。
all 與 distinct
用於設定select出來的數據,是否消除“重復行”,可以不寫,默認是all
是否返回取得的數據中的重復行。
all 表示會返回重復行。
distinct表示不返回重復行。即重復的若幹行數據就只返回一行。
字段或表達式列表
字段,來自於“表”。 表達式類似這樣的一個內容: 8+3, now()
每“輸出項”(字段或表達式或結果),都可以給其設定一個別名(字段別名)。形式為: 字段表達式 as 別名
concat()函數是mysql中的系統函數,用於"連接"多個字符串
子句
1) from子句
情形1: from 表名;
情形2: from 表1,表2,表3,...
2) where子句
where子句就是對from子句中的“數據源”中的數據進行篩選的條件設定
常使用的運算符:
1. 算術運算符: + - * / %
2. 比較運算符: > >= < <= = <> ==(等於) !=(不等於)
3. 邏輯運算符: and or not 。也可以用 && || !
4. is運算符: 空值和布爾值的判斷
假值的4種情形: 0 0.0 null ‘‘
1) XX is null 判斷某個字段是"null"值---就是沒有值 2) XX is not null 判斷某個字段不是"null"值 3) XX is true 判斷某個字段為“真"(true) 4) XX is fasle 判斷某個字段為“假"(false)【點擊查看】is運算符的4種形式
5. between 運算符: 範圍判斷, 適用於數字類型
# 表示該字段的值在給定的兩個值之間,包含該兩值 形式1: 字段名 between 值1 and 值2 形式2: 字段名 not between 值1 and 值2 (相反含義) #如: where id between 1 and 5 , 則返回id≥1且id≤5的數據。 # 相當於 id≥1 and id≤5;【點擊查看】between使用形式
6. in運算符: 給定確定數據範圍的判斷
#找出字段值等於所給定的那些值之一的數據行。 一般是零散無規律的數據。 形式1: 字段名 in (值1,值2,.........) 形式2: 字段名 not in (值1,值2,.........). #如: where id in (5,7,8), 則會返回id等於5或7或8的數據行。 # where id not in(5,7,8),表示除了這3個的其他所有【點擊查看】where語句的使用
7. like運算符: 對字符串進行模糊查找
#從字符串中找出含有指定字符的數據--”模糊查找“ 字段名 like ‘要查找的內容‘ #要附上一些表示模糊性的特殊字符。 #依賴於以下2個特殊的”符號“ 1) %: 它代表”任何個數的任何字符“ 2) _: 下劃線它代表”一個任何字符“ #常見形式使用: 1) name like ‘%張%‘ : 表示name中含"張"這個字的所有數據行 2) name like ‘張%‘ : 表示name中以"張"開頭的所有數據行 3) name like ‘%張‘ : 表示name中以"張"這個字結尾的所有數據行 4) name like ‘張_‘ : 表示name中以"張"這個字開頭,並且只有2個字符的所有數據行 5) name like ‘_張‘ : 表示name中以"張"這個字結尾,並且只有2個字符的所有數據行 #要找某個字段中含”%“或”_“的行 => 轉義; 1) XX like "%\%%": 表示XX中含有%的多有行 2) \%: 代表%本身 \_: 代表下劃線本身【點擊查看】like使用
3)group by 子句
形式: group by 字段1 【desc | asc】,字段2 【desc | asc】,........
分組:就是多行數據,以某種標準(即指定的字段)來進行分類存放
#在select 語句中”輸出“(取出)部分,只應該出現”組的信息“ select 組信息1,組信息2,..... from 數據源 group by 字段; #應用中分組之後,一般只有如下可供查詢的“組信息”(即可以出現在select中的) 1) 分組依賴本身的信息,其實就是該分組依據的字段名。 2) 每一組的“數量信息”就是用count(*)獲得 3)原來數據中的“數值類型字段的聚合信息”,包括如下幾個: 最大值: max(字段名) 最小值: min(字段名) 平均值: avg(字段名) 總和值: sum(字段名)【點擊查看】分組信息查詢
4)having 子句
where對原始數據進行篩選,既原表中存在的字段數據
having 對查詢結果集的數據進行篩選,既查詢出的字段數據
5)order by 子句
形式: order by 字段1 【asc | desc】,字段2 【asc | desc】,......
對前面的結果數據以指定的一個或多個字段排序。多個字段的排序,都是在前一個字段排序基礎上,如果還有“想等值”,就繼續後續字段排序
6)limit 子句
將“前述取得的數據”,按指定的行取出來:從第幾行開始取出多少行。
形式:limit 起始行號,要取出的行數;
起始行號從0開始
簡略形式:limit 行數; 表示直接從第0行開始取出指定的行數,
1) 在形式上,select的很多子句都可以省略,只要出現他們必須按照順序寫出。 2) where子句依賴於from子句。即沒有from即不能有where 3) 各子句的“內部執行過程“,基本都是按照該順序進行的 即從from的數據源中獲得”所有權,然後使用where對這些數據進行篩選, 之後再使用group by子句對篩選出的數據進行分組, 接下來使用having對這些分組的數據進行篩選, 然後order by 和limit.【點擊查看】select查詢
連接查詢
概念:就是將2個或2個以上的表,”連接起來“,當作一個數據源,並從中去取得所需要的數據
連接的基本形式: 表1 [連接形式] join 表2 [on 連接條件] [連接形式] join 表3 [on 連接條件] ....
交叉連接cross join
概念: 沒有條件的連接. 也叫 笛卡爾積
連接的結果: 將表1的所有行與表2第1行連接,然後將表1的所有行與表2的第2行連接,....
表1(n1個字段,n2行),表2(m1個字段, m2行) 交叉連接的結果: 列數 n1+m1列 行數: n2*m2
select * from 表1,表2; select * from 表1 join 表2; select * from 表1 cross join 表2;無條件的連接形式
內連接 inner join
形式: select * from 表1 [inner] join 表2 on 連接條件
內連接的其他形式:
左(外)連接:left (outer) join
形式: 表1 left [outer] join 表2 on 連接條件
結果: 表1與表2內連接的結果,再加上左邊表的不符合 內連接所設定的條件的那些數據的結果
左表的數據全部取出, 右表不存在對應時,顯示為NULL
右(外)連接:right (outer) join
形式: 表1 right [outer] join 表2 on 連接條件
結果: 表1與表2內連接的結果,再加上右邊表的不符合 內連接所設定的條件的那些數據的結果
右表的數據全部取出, 左表不存在對應時,顯示為NULL
全連接: full (outer) join
形式: MySQL不支持
含義:將2個表的內連接的結果,加上左邊表的不符合內連接設定條件的數據,再加上右邊表的不符合 內連接所設定條件的數據
子查詢
基本含義:一個查詢語句(select語句) 中的內部, 又出現的“查詢語句”
主查詢與子查詢:子查詢為主查詢服務,通常都是子查詢獲得一定的結果數據之後,才去執行主查詢。
形式:select 字段或表達式或子查詢 [as 別名] from 表名或連接結果或子查詢 where 字段或表達式或子查詢的條件判斷
having也可以加子查詢
子查詢分類:
按結果分類:
表子查詢: 一個子查詢返回的結果理論上是 “多行多列”的時候。可以當做一個表來使用,通常放在from後
行子查詢: 一個子查詢返回的結果理論上是 “一行多列”的時候。可以當做一個行來使用
列子查詢:一個子查詢返回的結果理論上是 “多行一列”的時候。可以當做多個值來使用
標量子查詢:一個子查詢返回的結果理論上是 “一行一列”的時候。可以當做一個值來使用
按使用場合分類(位置):
作為主查詢的結果數據:select c1,(select f1 from tab2) as f11 from tab1;
作為主查詢的條件數據:select c1 from tab1 where c1 in (select f1 from tab2);
作為主查詢的來源數據:select c1 from (select f1 from tab2) as t2;
常見子查詢:
1)比較運算符中的子查詢
形式: 操作數 比較運算符 (標量子查詢)
例子: select .. from 表名 where price =(select max(price) from product);
2)使用in的子查詢
形式: XX in (列子查詢)
select * from product where id in (select id from 表 where xx)
3)使用any子查詢
形式: 操作數 比較運算符 any(列子查詢)
含義: 當某個字段對於該列子查詢中的任一個值都滿足該比較運算符,則滿足條件
select * from tab1 where id > any(select f1 from tab2); //只要tab1中id大於表tab2 中任意一行的f1就滿足條件
4)使用all的子查詢
形式: 操作數 比較運算符 all (列子查詢)
含義:當某個操作數(字段) 對於該列子查詢的所有數據值都滿足該運算符,則滿足條件。 ==》全滿足才算滿足
select * from tab2 where f1> all (select id from tab1); // 只有f1中f1大於表tab1中所有id 才會滿足要求
5) 使用some的子查詢
some是any的同義詞
使用exists子查詢
形式: where exists (子查詢)
含義: 該子查詢如果 有數據 則 exists的結果是true, 否則就是false
實際使用:這種子查詢。不能獨立存在,而必須跟主查詢一起石永紅
該子查詢的條件,應該設定為跟主查詢的某個字段有一定關聯性的判斷。
聯合查詢
基本概念:將兩個具有相同字段數量的查詢語句的結果,以“上下堆疊”的方式,合並為一個結果
語法形式:select 語句 union [all|distinct] select 語句2 union [all|distinct] select 語句3......;
實現全外連接: select * from 表1 left join 表2 on 條件 union select * from 表1 right join 表2 on 條件
註:1)select語句的查詢結果的字段數量必須一致,一般字段類型也一致。
2)默認會自動消除重復行,既默認選擇的是distinct。 要顯示包括重復行的所有數據,應選擇all .
3) 聯合查詢的結果默認使用第1個select語句中的字段名
4) 使用order by 和 limit子句 默認是對聯合之後的結果進行排序和數量限定。
5)如果第1個select語句中的列設置了別名, 則order by 子句中必須使用該別名
Mysql基礎3-數據操作語言DML-數據查詢語言DQL