增刪改查基本語法學習
?
增 :?insert?
Insert?3 問 :?
1:? 插入哪張表 ??
2:? 插入哪幾列 ?
3:? 這幾列分別插入什么值 ?
?
Insert?into? TableName
( 列 1, 列 2....? 列 n)
Values
( 值 1, 值 2,.... 值 n)
?
值?與?列 , 按順序 , 一一對應
?
?
特殊 :?insert 語句?允不允許不寫列名
答 :? 允許 .
如果沒有聲明列明 , 則默認插入所有列 .
因此 , 值應該與全部列 , 按順序一一對應 .
?
例 : 建一張工資登記表

2: 插入部分列

注: 文中的 set?names?gbk; 是為了告訴服務器 , 客戶端用的 GBK 編碼 , 防止亂碼 .
4: 插入所有的列的簡單寫法 .

insert 中數字不需要加單引號,會降低解析速度,字符竄必須加單引號,不然會報錯!
改 :?Update? 語句?
Update?4 問
改哪張表 ?
改哪幾列的值 ?
分別改為什么值 ?
在哪些行生效 ?
?
語法 :
Update? 表名?
Set?
列 1?=? 新值? 1,
列 2?=? 新值 2,
列 n?=? 新值 n.....
Where??expr

刪除 :?delete
Delete?2 問
從哪張表刪除數據 ?
要刪除哪些行 ?
?
語法 :
Delete?from? 表名? where??expr

查 :?select?
查詢 3 問
1: 查哪張表的數據 ?
2: 查哪些列的數據 ?
3: 查哪些行的數據 ?
?
語法 :
Select? 列 1,? 列 2,? 列 3,... 列 n
From? 表名
Where?expr;
排序:
磁盤里的數據可能排好序,也可能沒排序,就需要到內存里面進行排序,這就比較浪費時間了。
當最終結果集出來后 , 可以進行排序 .
排序的語法 :
Order?by? 結果集中的列名? desc/asc
?
例 :order?by?shop_price?desc?, 按價格降序排列
Order?by?add_time?asc?, 按發布時間升序排列 .
?
多字段排序也很容易
Order?by? 列 1?desc/asc? ,?列 2?desc/asc?? ,?列 3?desc,asc
Limit? 在語句的最后 ,? 起到限制條目的作用,在分頁類中發揮很大作用 ?
Limit?[offset,]?N
Offset:? 偏移量 ,---- 跳過幾行
N:? 取出條目
Offset, 如果不寫 , 則相當于?? limit?0,N
子查詢
Where 型子查詢 :? 指把內層查詢的結果作為外層查詢的比較條件 .
典型題 : 查詢最大商品 , 最貴商品
?
Where 型子查詢
如果? where? 列 =( 內層 sql), 則內層 sql 返回的必是單行單列 , 單個值
如果? where? 列? in?( 內層 sql),? 則內層 sql 只返回單列 , 可以多行 .
?
From? 型子查詢 :? 把內層的查詢結果當成臨時表 , 供外層 sql 再次查詢
典型題 : 查詢每個欄目下的最新 / 最貴商品
Exists 子查詢? :? 把外層的查詢結果 , 拿到內層 , 看內層的查詢是否成立 .
典型題 :? 查詢有商品的欄目
模糊查詢 :
案例 : 想查找 " 諾基亞 " 開頭的所有商品
Like-> 像
?
%?-->? 通配任意字符
'_'?-->? 單個字符
查詢模型 ( 重要 )
列就是變量 , 在每一行上 , 列的值都在變化 .
Where 條件是表達式 , 在哪一行上表達式為真 ,
哪一行就取出來
比如下面的條件 ,?shop_price 在不同的行 , 有不同的值 .
在哪一行時 ,shop_price>5000 如果為真 , 則這行取出來 .
?
?
查詢結果集
--
在結構上可以當成表看
select?count(*)?from?
表名
,?
查詢的就是絕對的行數
,
哪怕某一行所有字段全為
NULL,
也計算在內
.
而 select?couht( 列名 )?from? 表名 ,
查詢的是該列不為 null 的所有行的行數 .
?
用 count(*),count(1), 誰好呢 ?
其實 , 對于 myisam 引擎的表 , 沒有區別的 .
這種引擎內部有一計數器在維護著行數 .
Innodb 的表 , 用 count(*) 直接讀行數 , 效率很低 , 因為 innodb 真的要去數一遍 .

左連接的語法 :
?
假設 A 表在左 , 不動 ,B 表在 A 表的右邊滑動 .
A 表與 B 表通過一個關系來篩選 B 表的行 .
語法 :
A?left?join?B?on? 條件??條件為真 , 則 B 表對應的行 , 取出
?
A?left?join?B?on? 條件 ?
這一塊 , 形成的也是一個結果集 , 可以看成一張表?設為 C
既如此 , 可以對 C 表作查詢 , 自然 where,group?,having?,order?by?,limit? 照常使用
?
問 :C 表的可以查詢的列有哪些列 ?
答 :?A?B 的列都可以查
/*
左連接?右連接 , 內連接的區別在哪兒 ?
?
*/

主持人大聲說 :
所有的男士 , 站到舞臺上 , 帶上自己的配偶 ,( 沒有的拿塊牌子 ,? 上寫 NULL)
思考 : 張三上不上舞臺呢 ?
答 : 上 ,
問 : 張三沒有對應的行怎么辦 ?
答 : 用 NULL 補齊
結果如下

這種情況就是??男生?? left?join? 女生 .
?
主持人說 : 所有女生請上舞臺 , 有配偶的帶著 ,? 沒有的 , 寫個 NULL 補齊 .
Select? 女生? left?join? 男生? on? 條件
?
?
左右連接是可以互換的
A?left?join?B,? 就等價于? B?right?join?A
?
注意:既然左右連接可以互換,盡量用左連接,出于移植時兼容性方面的考慮.
內連接的特點
主持人說: 所有有配偶的男生/女生,走到舞臺上來
這種情況下: 屌絲和寶釵都出局

如果從集合的角度
A?inner?join?B
和 left?join?/right join 的關系
答: 內連接是左右連接的交集
主持人說:所有男生/女生,走上舞臺.
有配偶的,帶著配偶;
沒配偶的,拿牌子寫NULL
即:結果是左右連接的并集
?
這種叫做外連接,但是,在 mysql 中不支持外連接
Union: 合并 2 條或多條語句的結果
語法 :
Sql1?union?sql2
?
?
能否從 2 張表查詢再 union 呢 ?
答 : 可以 ,union? 合并的是 " 結果集 ", 不區分在自于哪一張表 .
?
問 : 取自于 2 張表 , 通過 " 別名 " 讓 2 個結果集的列一致 .
那么 , 如果取出的結果集 , 列名字不一樣 , 還能否 union.
答 : 可以 , 如下圖 , 而且取出的最終列名 , 以第 1 條 sql 為準?

問:union 滿足什么條件就可以用了 ?
答 : 只要結果集中的列數一致就可以 .
問 :?union 后結果集 , 可否再排序呢 ?
答 : 可以的 .
Sql1?union?sql2?order?by? 字段
注意 :?order?by? 是針對合并后的結果集排的序 .
思考如下語句:
(SELECT?goods_id,cat_id,goods_name,shop_price?FROM?goods?WHERE?cat_id?=?4?ORDER?BY?shop_price?DESC)
UNION
(SELECT?goods_id,cat_id,goods_name,shop_price?FROM?goods?WHERE?cat_id?=?5?ORDER?BY?shop_price?DESC)
order?by?shop_price?asc;
?
外層語句還要對最終結果 , 再次排序 .
因此 , 內層的語句的排序 , 就沒有意義 .
?
因此 : 內層的 order?by? 語句單獨使用 , 不會影響結果集 , 僅排序 ,
在執行期間 , 就被 Mysql 的代碼分析器給優化掉了 .
內層的 order?by? 必須能夠影響結果集時 , 才有意義 .

這一次 : 內層的 order?by? 發揮了作用 , 因為有 limit?,order? 會實際影響結果集 , 有意義 .
?
如果 Union 后的結果有重復 ( 即某 2 行 , 或 N 行 , 所有的列 , 值都一樣 ), 怎么辦 ?
答 : 這種情況是比較常見的 , 默認會去重 .
?
問 : 如果不想去重怎么辦 ?
答 :?union?all
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
