mysql curd_mysql 基础之CURD
原文:mysql 基礎之CURD
增刪改查基本語法學習
增:?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?/rightjoin的關系
答: 內連接是左右連接的交集
主持人說:所有男生/女生,走上舞臺.
有配偶的,帶著配偶;
沒配偶的,拿牌子寫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
總結
以上是生活随笔為你收集整理的mysql curd_mysql 基础之CURD的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CS231n 学习笔记(2)——神经网络
- 下一篇: (2)LR实战之——登录脚本