基本 SQL 之增刪改查(一)

上篇文章,咱們介紹了數據的基本 DDL 語句,你應當具有基本的建立數據庫、數據表的 SQL 語句,以及表字段的基本數據類型的熟知。java

那麼本篇就來總結總結你們平常最頻繁接觸到的 DDM 語句,也就是基本的增刪改查 SQL。git

數據的修改

衆所周知的是,咱們的項目中,有百分之八十的操做都是在查詢,而僅有百分之二十的操做是作的數據修改。程序員

因此,關係型數據庫中對於數據的修改這塊並無什麼很複雜的門道,咱們優先介紹這一塊內容,而對於數據的查詢而言,它會複雜的多,各類排序、分組、子查詢以及多表鏈接查詢等等等等,就是旨在知足咱們多樣化的查詢需求以及提高查詢效率,這個咱們稍後會介紹。github

數據的修改包括,數據的插入、數據的修改以及數據的刪除。數據庫

一、插入數據bash

向表中插入一條數據的 SQL 語法以下:微信

INSERT INTO [TABLE_NAME] (column1, column2, column3,...columnN) 
VALUES (value1, value2, value3,...valueN);
複製代碼

那好,咱們具體來看一個例子吧。函數

先建立這麼一張 person 表,使用以下 SQL:學習

create table person(
   id int primary key,
   name varchar(16) not null,
   age int,
   phone varchar(11),
   address varchar(256)
);
複製代碼

接着,咱們插入一條數據:ui

insert into person(id,name,age,phone,address)
values (1,'yang',22,'123232323','中國上海');
複製代碼

因而你查詢 person 表,會看到

+----+------+------+-----------+--------------+
| id | name | age  | phone     | address      |
+----+------+------+-----------+--------------+
|  1 | yang |   22 | 123232323 | 中國上海     |
+----+------+------+-----------+--------------+
複製代碼

固然,若是你在插入數據時有些字段的值暫時不想傳入,或是該字段有默認值,insert 語句是容許你部分數據插入的,前提是不能違反一些非空、惟1、類型不匹配約束。

例如我只想插入一條數據,而我只知道這我的的名字,因而我也能夠插入一條記錄,但只賦值 name 字段。

insert into person(id,name)
values (2,'cao');
複製代碼

再次查詢 person 表:

+----+------+------+-----------+--------------+
| id | name | age  | phone     | address      |
+----+------+------+-----------+--------------+
|  1 | yang |   22 | 123232323 | 中國上海     |
|  2 | cao  | NULL | NULL      | NULL         |
+----+------+------+-----------+--------------+
複製代碼

關係型數據庫中,全部未賦值的字段都默認爲 NULL,固然這個默認值是能夠修改的,你能夠修改成空字符串或空格等等。

再說一個細節,當你想要插入一條數據時,而且但願爲該表的每個字段都賦值,那麼你能夠不用在表名後列舉全部字段名,例如如下兩條 insert 語句是等效的。

insert into person(id,name,age,phone,address)
values (1,'yang',22,'123232323','中國上海');
複製代碼
insert into person
values (1,'yang',22,'123232323','中國上海');
複製代碼

關於 insert,咱們暫時先說到這,後面介紹子查詢的時候還會提到它,接着咱們來看修改數據 update。

二、修改數據

SQL UPDATE 語句用於修改表中現有的記錄。基本格式以下:

UPDATE [table_name]
SET column1 = value1, column2 = value2...., columnN = valueN
複製代碼

舉個例子,這是 person 表如今的數據狀況:

+----+------+------+-----------+--------------+
| id | name | age  | phone     | address      |
+----+------+------+-----------+--------------+
|  1 | yang |   22 | 123232323 | 中國上海     |
|  2 | cao  | NULL | NULL      | NULL         |
+----+------+------+-----------+--------------+
複製代碼

咱們執行:

update person set address='浙江杭州';
複製代碼

再來看 person 表:

+----+------+------+-----------+--------------+
| id | name | age  | phone     | address      |
+----+------+------+-----------+--------------+
|  1 | yang |   22 | 123232323 | 浙江杭州     |
|  2 | cao  | NULL | NULL      | 浙江杭州     |
+----+------+------+-----------+--------------+
複製代碼

你會發現 person 表的全部記錄的 address 字段全都修改成「浙江杭州」。

因此,通常來講,咱們的 update 語句都會結合 where 子句作一個數據篩選,只修改符合條件的記錄的 address 字段值。

例如:

update person set address='浙江杭州' where id = 1;
複製代碼

三、刪除數據

咱們使用 DELETE 語句對標數據進行刪除,基本格式語法以下:

DELETE FROM [table_name]
WHERE [condition];
複製代碼

一樣,不追加 where 子句作條件篩選會致使整張表的數據丟失。例如咱們刪除 id 爲 1 的那條數據記錄。

delete from person where id = 1;
複製代碼

數據的查詢

SQL SELECT 語句用於從數據庫的表中取回所需的數據,並以表的形式返回。返回的表被稱做結果集。

基本的查詢語法以下:

SELECT column1, column2, columnN FROM table_name;
複製代碼

若是須要查詢一條記錄中的全部的字段,能夠用符號「*」替代全體,例如:

SELECT * FROM person;
複製代碼

可查詢出 person 表全部的記錄:

+----+-------+------+-----------+--------------+
| id | name  | age  | phone     | address      |
+----+-------+------+-----------+--------------+
|  1 | yang  |   22 | 231232132 | 中國上海     |
|  2 | cao   | NULL | NULL      | 浙江杭州     |
|  3 | li    |   23 | 34567894  | 江蘇南京     |
|  4 | huang |   33 | 34567894  | 湖北武漢     |
|  5 | zhang |   30 | 4567890   | 中國北京     |
+----+-------+------+-----------+--------------+
複製代碼

這是最基本的查詢,沒有之一,接下來咱們將一點點的增長複雜度,更熟練的掌握查詢語句。

一、where 子句

where 子句又被稱爲條件子句,用於篩選查詢出來的數據集,指定的條件語句中可使用基本的算術、關係和邏輯運算,例如:>,<,=,!=,&&,||。

舉個例子吧,person 表如今有以下數據:

+----+-------+------+------------+--------------+
| id | name  | age  | phone      | address      |
+----+-------+------+------------+--------------+
|  1 | yang  |   22 | 231232132  | 中國上海     |
|  2 | cao   | NULL | NULL       | 浙江杭州     |
|  3 | li    |   23 | 34567894   | 江蘇南京     |
|  4 | huang |   33 | 34567894   | 湖北武漢     |
|  5 | zhang |   30 | 4567890    | 中國北京     |
|  6 | yang  |   24 | 2343435353 | 山東青島     |
+----+-------+------+------------+--------------+
複製代碼

咱們現須要查詢出,名字叫「yang」,年齡爲「22」的記錄,該怎麼寫呢?

select * from person
 where name='yang'&& age=22;
複製代碼

仍是很簡單的,雖然 where 子句很簡單,但它倒是咱們 SQL 查詢中最重要的一個關鍵字,基本上每一條 SQL 語句都離不開它。

在指定條件中,除了咱們以上說的可使用基本的邏輯算術運算符,子查詢也是須要依賴 where 的,咱們後面繼續說。

二、LIKE 子句

LIKE 子句,咱們通常用來作一些簡單的搜索查詢,或者說模糊匹配,表達式主要涉及到兩個符號:

  • 百分號 %:匹配任意多個字符
  • 下劃線 _:匹配固定一個字符

舉幾個例子吧,一樣以咱們的 person 表數據爲例。

查詢全部的數據,找到其中 name 字段以字符「ang」結尾的數據記錄集合:

select * from person
 where name like '%ang';
複製代碼

執行 SQL,返回結果:

+----+-------+------+------------+--------------+
| id | name  | age  | phone      | address      |
+----+-------+------+------------+--------------+
|  1 | yang  |   22 | 231232132  | 中國上海     |
|  4 | huang |   33 | 34567894   | 湖北武漢     |
|  5 | zhang |   30 | 4567890    | 中國北京     |
|  6 | yang  |   24 | 2343435353 | 山東青島     |
+----+-------+------+------------+--------------+
複製代碼

查詢全部的數據,找到其中 name 字段以字符「ang」結尾,而且前面還有一個任意字符的數據記錄集合

select * from person
 where name like '_ang';
複製代碼

執行 SQL,返回結果:

+----+------+------+------------+--------------+
| id | name | age  | phone      | address      |
+----+------+------+------------+--------------+
|  1 | yang |   22 | 231232132  | 中國上海     |
|  6 | yang |   24 | 2343435353 | 山東青島     |
+----+------+------+------------+--------------+
複製代碼

三、in 子句

in 關鍵字也是使用在 where 子句的條件表達式中,它限制的是一個集合,只要字段的值在集合中即符合條件,例如:

select * from person
where age in (22,30,23);
複製代碼

這個 SQL 語句能夠查詢出來全部年齡是 22,30,23 的人數據記錄。

你也可使用 not in 反向限制,例如:

select * from person
where age not in (22,30,23);
複製代碼

這個 SQL 則能夠查出全部年齡不是這三個值的數據記錄信息。

四、ORDER BY 子句

ORDER BY 子句根據一列或者多列的值,按照升序或者降序排列數據。某些數據庫就默認以升序排列查詢結果。

基本的 SQL 語法爲:

SELECT column
FROM table_name 
[WHERE condition] 
[ORDER BY column1, column2, .. columnN] [ASC | DESC];
複製代碼

ASC 表示數據結果集按升序排序,DESC 表示數據結果集按降序排序。

通常來講,咱們按某一列進行排序便可,固然,有時候一列排序並不能徹底解決問題,若是按多列排序,那麼當遇到某一列值相同的時候,就會參照第二個列參數將這些重複列值得數據記錄再一次排序。

舉個例子:

咱們將 person 表中的數據參照 id 列,倒序排序:

select * from person
order by id desc;
複製代碼

執行 SQL,查看結果:

+----+-------+------+------------+--------------+
| id | name  | age  | phone      | address      |
+----+-------+------+------------+--------------+
|  6 | yang  |   24 | 2343435353 | 山東青島     |
|  5 | zhang |   30 | 4567890    | 中國北京     |
|  4 | huang |   33 | 34567894   | 湖北武漢     |
|  3 | li    |   23 | 34567894   | 江蘇南京     |
|  2 | cao   | NULL | NULL       | 浙江杭州     |
|  1 | yang  |   22 | 231232132  | 中國上海     |
+----+-------+------+------------+--------------+
複製代碼

須要注意的是,對於數字類型的字段排序而言還相對容易理解些,對於非數字類型的排序,可能你不必定能看懂它爲何這樣排序。

其實每一個數據庫都預約義了不少的排序規則,不少數據的實現都默認使用 utf8_general_ci 排序規則,固然,若是你很熟悉各類排序規則,你也能夠在建立數據表的時候去主動指定使用哪一種排序規則,通常使用默認排序規則就行。

五、GROUP BY 子句

GROUP BY 子句用於將查詢返回的結果集進行一個分組,並展現各個分組中排在第一個的記錄,將分組中其他成員隱藏。

咱們爲 person 表添加幾條數據,用於演示:

+----+-------+------+------------+----------+
| id | name  | age  | phone      | address  |
+----+-------+------+------------+----------+
|  1 | yang  |   22 | 231232132  | 中國上海 |
|  2 | cao   |   30 | 456789     | 浙江杭州 |
|  3 | li    |   23 | 34567894   | 江蘇南京 |
|  4 | huang |   33 | 34567894   | 湖北武漢 |
|  5 | zhang |   30 | 4567890    | 中國北京 |
|  6 | yang  |   24 | 2343435353 | 山東青島 |
|  7 | cao   |   44 | 12312312   | 河南鄭州 |
|  8 | huang |   45 | 5677675    | 安徽合肥 |
|  9 | yang  |   80 | 3343738    | 江蘇南通 |
+----+-------+------+------------+----------+
複製代碼

注意觀察姓名列,有幾組重複的姓名。

咱們按照姓名對結果集進行分組,SQL 以下:

select * from person
group by name;
複製代碼

執行 SQL,獲得結果:

+----+-------+------+-----------+----------+
| id | name  | age  | phone     | address  |
+----+-------+------+-----------+----------+
|  2 | cao   |   30 | 456789    | 浙江杭州 |
|  4 | huang |   33 | 34567894  | 湖北武漢 |
|  3 | li    |   23 | 34567894  | 江蘇南京 |
|  1 | yang  |   22 | 231232132 | 中國上海 |
|  5 | zhang |   30 | 4567890   | 中國北京 |
+----+-------+------+-----------+----------+
複製代碼

你看,分組以後,只展現每一個分組下排序第一的記錄,其他成員隱藏。

細心的同窗可能發現了,分組後的數據記錄排序怎麼亂了,怎麼不是默認的 id 升序排列了?

對,若是你沒有顯式執行排序方式的話,將默認以你用於分組參照的那個字段進行排序。

固然,咱們是能夠執行排序方式的,使用 order by 子句:

select * from person
group by name
order by id;
複製代碼

效果是這樣:

+----+-------+------+-----------+----------+
| id | name  | age  | phone     | address  |
+----+-------+------+-----------+----------+
|  1 | yang  |   22 | 231232132 | 中國上海 |
|  2 | cao   |   30 | 456789    | 浙江杭州 |
|  3 | li    |   23 | 34567894  | 江蘇南京 |
|  4 | huang |   33 | 34567894  | 湖北武漢 |
|  5 | zhang |   30 | 4567890   | 中國北京 |
+----+-------+------+-----------+----------+
複製代碼

這就是分組,可能會有同窗疑問,這樣的分組有什麼意義,分組是分完了,給我返回每一個分組的第一行記錄有什麼用?

實際上是這樣的,咱們之因此進行分組,就是爲了統計和估量每一個分組下的指標狀況,好比這組數據的平均年齡、最高薪水等等等等。

而當咱們只是 「select *」的時候,數據庫根本不知道你要幹什麼,換句話說就是你並無對每個分組中的數據進行任何的分析統計,因而給你返回該分組的第一行數據。

你要記住的是,每一個分組只能出來一個數據行,究竟讓什麼樣的數據出來取決於你。

好比咱們計算每一個分組下的平均年齡:

select avg(age) as '平均年齡' from person
group by name;
複製代碼

查詢結果:

+----------+
| 平均年齡 |
+----------+
|  37.0000 |
|  39.0000 |
|  23.0000 |
|  42.0000 |
|  30.0000 |
+----------+
複製代碼

這裏涉及了一個求平均數的函數 avg,咱們後續會介紹這些經常使用函數,這裏你體會下其意思就行。

六、HAVING 子句

HAVING 子句在我看來就是一個高配版的 where 子句,不管是咱們的分組或是排序,都是基於以返回的結果集,也就是說 where 子句的篩選已經結束。

那麼若是咱們對排序、分組後的數據集依然有篩選需求,就用到咱們的 HAVING 子句了。

例如:

select avg(age) as vage from person
group by name
having vage>23;
複製代碼

分組以後,咱們獲得每一個分組中數據的平均年齡,再者咱們經過 having 語句篩選出平均年齡大於 23 的數據記錄。

以上咱們介紹了六個子句的應用場景及其使用語法,可是若是須要同時用到這些子句,語法格式是什麼樣的?做用優先級是什麼樣的?

SELECT column1, column2
FROM table
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2
複製代碼

你們必定要記住這個模板,各個子句在 SQL 語句中的位置,能夠不出現,但不得越位,不然就會報語法錯誤。

首先是 from 語句,查出表的全部數據,接着是 select 取指定字段的數據列,而後是 where 進行條件篩選,獲得一個結果集。

接着 group by 分組該結果集並獲得分組後的數據集,having 再一次條件篩選,最後才輪到 order by 排序。

篇幅已經很長了,再也不繼續了,有關子查詢、鏈接查詢以及一些細節咱們放在下一篇,本篇的重點是理解上述模板中的各個子句,並記住他們之間的做用優先級。


關注公衆不迷路,一個愛分享的程序員。
公衆號回覆「1024」加做者微信一塊兒探討學習!
每篇文章用到的全部案例代碼素材都會上傳我我的 github
github.com/SingleYam/o…
歡迎來踩!

YangAM 公衆號
相關文章
相關標籤/搜索