在操作數據庫中的表時,需要先使用該數據庫:
use database;
新增
創建表
先用 use
指定一個數據庫,然后使用 create
新增一個表
比如建立一個學生表
mysql> use goods;
mysql> create table student(-> name varchar(4),-> age int,-> grade decimal(3,1)-> );
通過desc + 表名
來查看表結構:
其中的 name、age、grade 就是列(MySQL中的列就是我們平時所說的行);Field、Type 等就是行,其中 Null
中的Yes 表示該列可以為空,如果是 NO 則不可為空,Default 表示該列的默認值
表中各行所表示的含義如下:
插入記錄
創建好表之后,使用 insert into 表名 values(列名 列名...)
來插入記錄:
mysql> insert into student values("張三",20,98.5);
這里我們把所有列名都插入了,我們也可以指定插入部分列名,只需在表名后面加上要插入的列名就 ok 了:
mysql> insert into student(name,grade) values("李四",90);
插入后查看表
可以看到 age 那里是 NULL
,它表示這條記錄的這一列為空
我們現在是一條一條地插入,其實也可以一次插入多條記錄:
mysql> insert into student values("王五",25,80),("趙六",24,85);
一次插入10個數據比一次插入一個數據,分10次完成的效率高
因為每條 sql 都會涉及到下面的交互過程:
-
如果分 10 條 sql 進行,那意味著在這個過程中,就會有10次網絡交互
數據庫服務器收到請求之后,也要進行 10 次對應的處理,比如檢查語法、數據校驗、把你要插入的數據的位置在硬盤上進行定位… -
如果只用 1 次完成,雖然單次消耗的時間會更長,但是網絡開銷、服務器檢查的開銷都是一份的,這個做法會更高效一些
查詢
查詢方式
可以通過 select * from 表名
查詢到表中所有數據,比如上面就是通過這條語句來查看數據的
也可以使用select 列名,列名 from 表名
來查看指定列的信息
注意:在公司的生產環境服務器上,不要
隨便敲select*
!!!因為數據量很大的話,這個操作會產生大量的硬盤IO和網絡IO,可能把硬盤或網卡的帶寬給吃滿了
而一旦帶寬吃滿,此時服務器就無法正常響應其他客戶端的請求(在其他客戶端的視野中,就會認為MySQL服務器是掛了)
除了上面兩種查詢方式,我們還可以使用表達式查詢
就是在查詢過程中,指定表達式,把查詢出來的每一行,都代入到表達式
中進行運算
比如下面的grade-10就是一個表達式
進行表達式查詢時,并沒有修改硬盤中存儲的數據,只是在查詢結果的基礎上進行運算,得到一份"臨時表"
,也就是說 select 進行的任何操作都不會修改數據本體
此時查詢出來的臨時表,為了保證數據的正確性,每個列的類型不再受限于原始表
比如給所有學生的成績加10
雖然 grade 限定位數為 3 ,但是為了使數據不會出錯,所以臨時表不會限制位數
查詢操作結束后,臨時表中的數據就會消散了
到這里我們介紹了三種查詢方式:
①查詢所有數據
②查詢指定列數據
③表達式查詢
還有四種查詢方式
④查詢時帶上別名
select 表達式 as 別名 from 表名;
比如現在有一個學生成績表,有語文、數學、英語三個科目,我想查詢某個學生成績的總和,可以這樣:
查詢結果的列就只有 sum,而不是 chinese+math+english,這樣可以使查詢結果更簡潔
⑤查詢時進行去重
select distinct 列名 from 表名
根據查詢出的列名進行去重,把列的值相同
的記錄合并為一個
比如現在有如下的表:
現在只查詢一個列,那如果同時查詢多個列并進行去重呢?
從上圖我們可以得出:查詢多個列時,只有兩個記錄多個列的值都相同,才算是重復
⑥查詢時進行排序
select 列名 from 表名 order by 列名
(注意前面用desc + 表名
來查看表結構;而這里是將desc放在后面排降序)
order by 也可以指定多個列進行排序,指定多個列時,帶有優先級,前面的列優先級高,后面的低。優先級高的列的值相同時,才會去比較優先級低的列
舉個例子:
⑦條件查詢
就是查詢時指定篩選條件,只有滿足條件的數據才會保留作為結果集(如果不滿足,那么這個數據會被跳過)
- 比較運算符
運算符 | 說明 |
---|---|
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于 |
<=> | 等于 |
!=, <> | 不等于 |
BETWEEN a0 AND a1 | 范圍匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN(option…) | 如果是 option 中的任意一個,返回 TRUE(1) |
IS NULL | 是NULL |
IS NOT NULL | 不是NULL |
LIKE | 模糊匹配。% 表示任意多個(包括 0 個)任意字符;_ 表示任意一個字符 |
我們重點來講兩個“等于”
對于 NULL = NULL ,它的結果是 false
而如果是 NULL <=> NULL,結果則為 true
- NULL表示某個單元格沒填,對于 =,它認為等號左右的 NULL 指的不是同一個單元格,
沒有可比性
,所以二者不相等 - 而對于 <=>,它只看內容,既然二者都沒有內容,那就都一樣
要使用條件查詢需要搭配關鍵字where
- 邏輯運算符
運算符 | 說明 |
---|---|
AND | 多個條件必須都為 TRUE(1),結果才是 TRUE(1) |
OR | 任意一個條件為 TRUE(1), 結果為 TRUE(1) |
NOT | 條件為 TRUE(1),結果為 FALSE(0) |
注意:
- WHERE條件可以使用表達式,但
不能
使用別名
- AND的優先級高于OR,在同時使用時,需要使用小括號()包裹優先執行的部分