基本 SQL 之增删改查
基本 SQL 之增刪改查(一)
總結(jié)大家日常最頻繁接觸到的 DML 語句和DQL語句,也就是基本的增刪改查 SQL。
1、插入數(shù)據(jù)
向表中插入一條數(shù)據(jù)的 SQL 語法如下:
INSERT INTO [TABLE_NAME] (column1, column2, column3,...columnN) VALUES (value1, value2, value3,...valueN);那好,我們具體來看一個(gè)例子吧。
先創(chuàng)建這么一張 person 表,使用如下 SQL:
接著,我們插入一條數(shù)據(jù):
insert into person(id,name,age,phone,address) values (1,'ayan',22,'123232323','中國上海');于是你查詢 person 表,會看到
+----+------+------+-----------+--------------+ | id | name | age | phone | address | +----+------+------+-----------+--------------+ | 1 | ayan| 22 | 123232323 | 中國上海 | +----+------+------+-----------+--------------+當(dāng)然,如果你在插入數(shù)據(jù)時(shí)有些字段的值暫時(shí)不想傳入,或是該字段有默認(rèn)值,insert 語句是允許你部分?jǐn)?shù)據(jù)插入的,前提是不能違反一些非空、唯一、類型不匹配約束。
例如我只想插入一條數(shù)據(jù),而我只知道這個(gè)人的名字,于是我也可以插入一條記錄,但只賦值 name 字段。
insert into person(id,name) values (2,'cao');再次查詢 person 表:
+----+------+------+-----------+--------------+ | id | name | age | phone | address | +----+------+------+-----------+--------------+ | 1 | ayan| 22 | 123232323 | 中國上海 | | 2 | cao | NULL | NULL | NULL | +----+------+------+-----------+--------------+關(guān)系型數(shù)據(jù)庫中,所有未賦值的字段都默認(rèn)為 NULL,當(dāng)然這個(gè)默認(rèn)值是可以修改的,你可以修改為空字符串或空格等等。
再說一個(gè)細(xì)節(jié),當(dāng)你想要插入一條數(shù)據(jù)時(shí),并且希望為該表的每一個(gè)字段都賦值,那么你可以不用在表名后列舉所有字段名,例如以下兩條 insert 語句是等效的。
insert into person(id,name,age,phone,address) values (1,'ayan',22,'123232323','中國上海'); insert into person values (1,'ayan',22,'123232323','中國上海');關(guān)于 insert,我們暫時(shí)先說到這,后面介紹子查詢的時(shí)候還會提到它,接著我們來看修改數(shù)據(jù) update。
2、修改數(shù)據(jù)
SQL UPDATE 語句用于修改表中現(xiàn)有的記錄。基本格式如下:
UPDATE [table_name] SET column1 = value1, column2 = value2...., columnN = valueN舉個(gè)例子,這是 person 表現(xiàn)在的數(shù)據(jù)情況:
+----+------+------+-----------+--------------+ | id | name | age | phone | address | +----+------+------+-----------+--------------+ | 1 | ayan| 22 | 123232323 | 中國上海 | | 2 | cao | NULL | NULL | NULL | +----+------+------+-----------+--------------+我們執(zhí)行:
update person set address='浙江杭州';再來看 person 表:
+----+------+------+-----------+--------------+ | id | name | age | phone | address | +----+------+------+-----------+--------------+ | 1 | ayan| 22 | 123232323 | 浙江杭州 | | 2 | cao | NULL | NULL | 浙江杭州 | +----+------+------+-----------+--------------+你會發(fā)現(xiàn) person 表的所有記錄的 address 字段全都修改為「浙江杭州」。
所以,一般來說,我們的 update 語句都會結(jié)合 where 子句做一個(gè)數(shù)據(jù)篩選,只修改符合條件的記錄的 address 字段值。
例如:
update person set address='浙江杭州' where id = 1;3、刪除數(shù)據(jù)
我們使用 DELETE 語句對標(biāo)數(shù)據(jù)進(jìn)行刪除,基本格式語法如下:
DELETE FROM [table_name] WHERE [condition];同樣,不追加 where 子句做條件篩選會導(dǎo)致整張表的數(shù)據(jù)丟失。例如我們刪除 id 為 1 的那條數(shù)據(jù)記錄。
delete from person where id = 1;4、查詢數(shù)據(jù)
SQL SELECT 語句用于從數(shù)據(jù)庫的表中取回所需的數(shù)據(jù),并以表的形式返回。返回的表被稱作結(jié)果集。
基本的查詢語法如下:
SELECT column1, column2, columnN FROM table_name;如果需要查詢一條記錄中的所有的字段,可以用符號「*」替代全體,例如:
SELECT * FROM person;可查詢出 person 表所有的記錄:
+----+-------+------+-----------+--------------+ | id | name | age | phone | address | +----+-------+------+-----------+--------------+ | 1 | ayan| 22 | 231232132 | 中國上海 | | 2 | cao | NULL | NULL | 浙江杭州 | | 3 | li | 23 | 34567894 | 江蘇南京 | | 4 | huang | 33 | 34567894 | 湖北武漢 | | 5 | zhang | 30 | 4567890 | 中國北京 | +----+-------+------+-----------+--------------+這是最基本的查詢,沒有之一,接下來我們將一點(diǎn)點(diǎn)的增加復(fù)雜度,更熟練的掌握查詢語句。
1、where 子句
where 子句又被稱為條件子句,用于篩選查詢出來的數(shù)據(jù)集,指定的條件語句中可以使用基本的算術(shù)、關(guān)系和邏輯運(yùn)算,例如:>,<,=,!=,&&,||。
舉個(gè)例子吧,person 表現(xiàn)在有如下數(shù)據(jù):
+----+-------+------+------------+--------------+ | id | name | age | phone | address | +----+-------+------+------------+--------------+ | 1 | ayan| 22 | 231232132 | 中國上海 | | 2 | cao | NULL | NULL | 浙江杭州 | | 3 | li | 23 | 34567894 | 江蘇南京 | | 4 | huang | 33 | 34567894 | 湖北武漢 | | 5 | zhang | 30 | 4567890 | 中國北京 | | 6 | yang | 24 | 2343435353 | 山東青島 | +----+-------+------+------------+--------------+我們現(xiàn)需要查詢出,名字叫「ayan」,年齡為「22」的記錄,該怎么寫呢?
select * from personwhere name='ayan'&& age=22;還是很簡單的,雖然 where 子句很簡單,但它卻是我們 SQL 查詢中最重要的一個(gè)關(guān)鍵字,基本上每一條 SQL 語句都離不開它。
在指定條件中,除了我們以上說的可以使用基本的邏輯算術(shù)運(yùn)算符,子查詢也是需要依賴 where 的,我們后面繼續(xù)說。
2、LIKE 子句
LIKE 子句,我們一般用來做一些簡單的搜索查詢,或者說模糊匹配,表達(dá)式主要涉及到兩個(gè)符號:
百分號 %:匹配任意多個(gè)字符
下劃線 _: 匹配固定一個(gè)字符
舉幾個(gè)例子吧,同樣以我們的 person 表數(shù)據(jù)為例。
查詢所有的數(shù)據(jù),找到其中 name 字段以字符「ang」結(jié)尾的數(shù)據(jù)記錄集合:
select * from personwhere name like '%ang';執(zhí)行 SQL,返回結(jié)果:
+----+-------+------+------------+--------------+ | id | name | age | phone | address | +----+-------+------+------------+--------------+ | 4 | huang | 33 | 34567894 | 湖北武漢 | | 5 | zhang | 30 | 4567890 | 中國北京 | | 6 | yang | 24 | 2343435353 | 山東青島 | +----+-------+------+------------+--------------+查詢所有的數(shù)據(jù),找到其中 name 字段以字符「ang」結(jié)尾,并且前面還有一個(gè)任意字符的數(shù)據(jù)記錄集合:
select * from personwhere name like '_ang';執(zhí)行 SQL,返回結(jié)果:
+----+------+------+------------+--------------+ | id | name | age | phone | address | +----+------+------+------------+--------------+ | 6 | yang | 24 | 2343435353 | 山東青島 | +----+------+------+------------+--------------+3、in 子句
in 關(guān)鍵字也是使用在 where 子句的條件表達(dá)式中,它限制的是一個(gè)集合,只要字段的值在集合中即符合條件,例如:
select * from person where age in (22,30,23);這個(gè) SQL 語句可以查詢出來所有年齡是 22,30,23 的人數(shù)據(jù)記錄。
你也可以使用 not in 反向限制,例如:
select * from person where age not in (22,30,23);這個(gè) SQL 則可以查出所有年齡不是這三個(gè)值的數(shù)據(jù)記錄信息。
4、ORDER BY 子句
ORDER BY 子句根據(jù)一列或者多列的值,按照升序或者降序排列數(shù)據(jù)。某些數(shù)據(jù)庫就默認(rèn)以升序排列查詢結(jié)果。
基本的 SQL 語法為:
SELECT column FROM table_name WHERE condition ORDER BY column1, column2, .. columnN [ASC | DESC];ASC 表示數(shù)據(jù)結(jié)果集按升序排序,DESC 表示數(shù)據(jù)結(jié)果集按降序排序。
一般來說,我們按某一列進(jìn)行排序即可,當(dāng)然,有時(shí)候一列排序并不能完全解決問題,如果按多列排序,那么當(dāng)遇到某一列值相同的時(shí)候,就會參照第二個(gè)列參數(shù)將這些重復(fù)列值得數(shù)據(jù)記錄再一次排序。
舉個(gè)例子:
我們將 person 表中的數(shù)據(jù)參照 id 列,倒序排序:
select * from person order by id desc;執(zhí)行 SQL,查看結(jié)果:
+----+-------+------+------------+--------------+ | 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 | ayan | 22 | 231232132 | 中國上海 | +----+-------+------+------------+--------------+5、GROUP BY 子句
GROUP BY 子句用于將查詢返回的結(jié)果集進(jìn)行一個(gè)分組,并展示各個(gè)分組中排在第一個(gè)的記錄,將分組中其余成員隱藏。
我們?yōu)?person 表添加幾條數(shù)據(jù),用于演示:
+----+-------+------+------------+----------+ | id | name | age | phone | address | +----+-------+------+------------+----------+ | 1 | ayan | 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 | 江蘇南通 | +----+-------+------+------------+----------+注意觀察姓名列,有幾組重復(fù)的姓名。
我們按照姓名對結(jié)果集進(jìn)行分組,SQL 如下:
select * from person group by name;執(zhí)行 SQL,得到結(jié)果:
+----+-------+------+-----------+----------+ | id | name | age | phone | address | +----+-------+------+-----------+----------+ | 1 | ayan | 22 | 231232132 | 中國上海 | | 2 | cao | 30 | 456789 | 浙江杭州 | | 4 | huang | 33 | 34567894 | 湖北武漢 | | 3 | li | 23 | 34567894 | 江蘇南京 | | 6 | yang | 24 | 2343435353 | 山東青島 | | 5 | zhang | 30 | 4567890 | 中國北京 | +----+-------+------+-----------+----------+你看,分組之后,只展示每個(gè)分組下排序第一的記錄,其余成員隱藏。
細(xì)心的同學(xué)可能發(fā)現(xiàn)了,分組后的數(shù)據(jù)記錄排序怎么亂了,怎么不是默認(rèn)的 id 升序排列了?
對,如果你沒有顯式執(zhí)行排序方式的話,將默認(rèn)以你用于分組參照的那個(gè)字段進(jìn)行排序。
當(dāng)然,我們是可以執(zhí)行排序方式的,使用 order by 子句:
select * from person group by name order by id;效果是這樣:
+----+-------+------+-----------+----------+ | id | name | age | phone | address | +----+-------+------+-----------+----------+ | 1 | ayan | 22 | 231232132 | 中國上海 | | 2 | cao | 30 | 456789 | 浙江杭州 | | 3 | li | 23 | 34567894 | 江蘇南京 | | 4 | huang | 33 | 34567894 | 湖北武漢 | | 5 | zhang | 30 | 4567890 | 中國北京 | | 6 | yang | 24 | 2343435353 | 山東青島 | +----+-------+------+-----------+----------+這就是分組,可能會有同學(xué)疑問,這樣的分組有什么意義,分組是分完了,給我返回每個(gè)分組的第一行記錄有什么用?
其實(shí)是這樣的,我們之所以進(jìn)行分組,就是為了統(tǒng)計(jì)和估量每個(gè)分組下的指標(biāo)情況,比如這組數(shù)據(jù)的平均年齡、最高薪水等等等等。
而當(dāng)我們只是 「select *」的時(shí)候,數(shù)據(jù)庫根本不知道你要干什么,換句話說就是你并沒有對每一個(gè)分組中的數(shù)據(jù)進(jìn)行任何的分析統(tǒng)計(jì),于是給你返回該分組的第一行數(shù)據(jù)。
你要記住的是,每個(gè)分組只能出來一個(gè)數(shù)據(jù)行,究竟讓什么樣的數(shù)據(jù)出來取決于你。
比如我們計(jì)算每個(gè)分組下的平均年齡:
select avg(age) as '平均年齡' from person group by name;查詢結(jié)果:
+----------+ | 平均年齡 | +----------+ | 37.0000 | | 39.0000 | | 23.0000 | | 42.0000 | | 30.0000 | +----------+6、HAVING 子句
HAVING 子句在我看來就是一個(gè)高配版的 where 子句,無論是我們的分組或是排序,都是基于以返回的結(jié)果集,也就是說 where 子句的篩選已經(jīng)結(jié)束。
那么如果我們對排序、分組后的數(shù)據(jù)集依然有篩選需求,就用到我們的 HAVING 子句了。
例如:
select avg(age) as vage from person group by name having vage>23;分組之后,我們得到每個(gè)分組中數(shù)據(jù)的平均年齡,再者我們通過 having 語句篩選出平均年齡大于 23 的數(shù)據(jù)記錄。
以上我們介紹了六個(gè)子句的應(yīng)用場景及其使用語法,但是如果需要同時(shí)用到這些子句,語法格式是什么樣的?作用優(yōu)先級是什么樣的?
SELECT column1, column2 FROM table WHERE [ conditions ] GROUP BY column1, column2 HAVING [ conditions ] ORDER BY column1, column2大家一定要記住這個(gè)模板,各個(gè)子句在 SQL 語句中的位置,可以不出現(xiàn),但不得越
位,否則就會報(bào)語法錯誤。
首先是 from 語句,查出表的所有數(shù)據(jù),接著是 select 取指定字段的數(shù)據(jù)列, 然后是 where 進(jìn)行條件篩選,得到一個(gè)結(jié)果集。 接著 group by 分組該結(jié)果集并得到分組后的數(shù)據(jù)集, having 再一次條件篩選,最后才輪到 order by 排序。總結(jié)
以上是生活随笔為你收集整理的基本 SQL 之增删改查的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 空间数据索引RTree完全解析及Java
- 下一篇: c#2.0的新特性--泛型