1. 程式人生 > >Mysql基礎3-數據操作語言DML-數據查詢語言DQL

Mysql基礎3-數據操作語言DML-數據查詢語言DQL

mut -- 字符串 交叉 分組 har 變量 tween sed

主要:

  1. 數據操作語言DML
  2. 數據查詢語言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
(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;
【點擊查看】插入數據Demo

  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