您好,登錄后才能下訂單哦!
這篇文章主要講解了“MySQL數(shù)據(jù)庫中數(shù)據(jù)表的基本操作有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“MySQL數(shù)據(jù)庫中數(shù)據(jù)表的基本操作有哪些”吧!
前言:
庫名、表名、列名等等不能和關(guān)鍵字相同,如果一定要用關(guān)鍵字為名,則可以通過反引號把名字引起來
對表進(jìn)行操作之前,要先選中數(shù)據(jù)庫
MySQL 中支持以下幾種注釋:
-- 注釋內(nèi)容:單行注釋,要注意 “–” 和注釋內(nèi)容之間需要有空格
#注釋內(nèi)容:單行注釋
/*注釋內(nèi)容*/:多行注釋
注意:字段或列的注釋可以用屬性 comment 來添加,例如在建表語句中使用
SQL 中單引號和雙引號都能表示字符串
語法:
show tables;
示例:
語法:
create table [if not exists] 表名(列名 列類型, 列名 列類型, ..., 列名 列類型);
示例:
語法:
desc 表名;
注意:
desc 是 describe 的縮寫,也可以使用 describe 表名 來查看表結(jié)構(gòu)
示例:
語法:
drop table [if exists] 表名 [, 表名 ...];
示例:
注意:
刪表操作也是一個極具風(fēng)險的操作,甚至要比刪庫操作還危險。因為一旦刪除,程序第一時間就掛了,還能及時搶救。但是刪表的話,程序不一定第一時間顯示異常,那么不能及時處理則會出現(xiàn)更大的風(fēng)險。
語法:
insert [into] 表名 [(列名1, 列名2, ...,列名n)] values (第一行的:值1, 值2, ...,值n) [, ..., (第n行的:值1, 值2, ...,值n)]
補(bǔ)充:
上述語句列名不寫的話就代表全列都要進(jìn)行新增數(shù)據(jù)
每行插入的值要與每行要插入的列名的順序一一對應(yīng)
如果插入時,某列沒有進(jìn)行插入,這個列就為默認(rèn)值 NULL
實例1: 全列插入一行
結(jié)果為:
id name 1 張三
示例2: 全列插入多行
結(jié)果為:
id name 1 張三 2 李四 3 王五
示例3: 指定某些列來插入
結(jié)果為:
id name 1 張三 2 李四 3 王五 4 NULL
注意: 一般認(rèn)為,一條語句,一次插入多個記錄,效率要比多個語句,每個語句插入一個記錄高的多
我們知道 MySQL 是一個“客戶端—服務(wù)器”結(jié)構(gòu)的程序。用戶在客戶端輸入的 SQL 都會通過網(wǎng)絡(luò)傳輸給服務(wù)器,然后由服務(wù)器進(jìn)行具體的操作。下面我們來分析下上述兩者的差別
一條語句,一次插入多個記錄:
多個語句,每個語句插入一個記錄:
又由于計算機(jī)對寄存器的訪問速度 >>> 對內(nèi)存的訪問速度 >>> 對IO設(shè)備(網(wǎng)絡(luò)上傳輸數(shù)據(jù),對于計算機(jī)來講叫做 IO 操作)的訪問的速度。因此,一般認(rèn)為,一條語句,一次插入多個記錄,效率要比多個語句,每個語句插入一個記錄高的多
語法:
selstc [distinct] {* | 列名1 [, ..., 列名n]} from 表名 [where] [order by 列名1 [ASC | DESC] [, ...,[列名n [ASC | DESC]]] limit
補(bǔ)充:
查詢結(jié)果是一個類似于“表”的結(jié)構(gòu),但這個表是一個“臨時表”,僅僅是在內(nèi)存中存了一下,在打印完之后就沒了,不會持久化存儲。
select
不會修改磁盤數(shù)據(jù),尤其是不會影響到服務(wù)器的原始磁盤上的數(shù)據(jù)
為了方便下面介紹示例,所以已經(jīng)在數(shù)據(jù)庫中創(chuàng)建了如下的一個數(shù)據(jù)表:
示例:
注意:
在生產(chǎn)環(huán)境中,謹(jǐn)慎使用上述語句,因為返回的數(shù)據(jù)可能超大的。如果數(shù)據(jù)很大的話,就可能把服務(wù)器的網(wǎng)絡(luò)帶寬吃滿,從而導(dǎo)致服務(wù)器無法正常工作。
示例:
注意:
指定列的順序不需要按照定義表時的順序查詢
示例:
注意:
上述 chinese+math+english 就是一個表達(dá)式,結(jié)果就是它們的值相加。但是相加的值不受原來的列的數(shù)據(jù)類型限制
表達(dá)式是進(jìn)行列與列之間的運(yùn)算,與行無關(guān)
表達(dá)式計算不影響原來的數(shù)據(jù),查詢的結(jié)果是一個臨時表
select
時給某個列指定一個常量,此時常量就會作為一個表達(dá)式在每行中出現(xiàn)
示例1:
示例2:
示例:
使用關(guān)鍵字 distinct
可以把某列相同的值的記錄給去重
示例1: 針對某個列去重
示例2: 針對多個列去重(要求: distinct 要放在所有列的前面,且當(dāng)每行的每列的值都有其他行的每列的值都相同時,才視為是一個重復(fù)的記錄)
如果我們的查詢操作沒有加上 order by
,此時查詢出來的結(jié)果順序是未定的??梢栽诓樵冋Z句的表名后面加上 order by 要排序的列名/表達(dá)式 [asc | desc] 來進(jìn)行排序
補(bǔ)充:
asc
:表示升序(由小到大),不加具體要排序的方式,默認(rèn)是 asc
desc
:表示降序(由大到?。?,是 descending
的縮寫
排序時如果有的值是 NULL,則視其為最小值
支持對多個列進(jìn)行排序,按要排序的列的順序進(jìn)行優(yōu)先級排序,排序的列之間用逗號隔開
我們知道很多排序的算法,例如:冒泡、選擇、插入、希爾、堆排、快排、歸并…而這其中歸并排序是最適合 MySQL 進(jìn)行數(shù)據(jù)排序的,因為 MySQL 的數(shù)據(jù)是存儲在硬盤上的,而對于硬盤的讀寫操作,開銷很大,為了減少讀寫次數(shù),所以要找到對于遍歷次數(shù)更少的排序方法。初次之外由于數(shù)據(jù)量可能很大,內(nèi)存一下不能存儲完全,就可以對每一段進(jìn)行排序再存入進(jìn)去。因此歸并排序更加適合 MySQL 對數(shù)據(jù)進(jìn)行排序
示例1: 對 math 進(jìn)行升序查詢
示例2: 對 math 進(jìn)行降序查找
示例3: 使用表達(dá)式或者別名進(jìn)行排序
示例4: 對多個列進(jìn)行綜合排序,要求在 math
最高的情況下,再排 chinese
更低的
條件查詢適用很廣,不限于上述幾種用法基礎(chǔ)之上,例如 update
、delete
等語句也可以使用。它是通過 where 條件表達(dá)式 的形式,去進(jìn)行一個篩選,相當(dāng)于遍歷查詢結(jié)果,針對每一個記錄帶入到條件中,將符合條件的記錄保留下來,不符合的則淘汰。
條件表達(dá)式可以使用:比較運(yùn)算符或者邏輯運(yùn)算符
比較運(yùn)算符:
邏輯運(yùn)算符:
運(yùn)算符 | 說明 |
---|---|
and | 類似于 Java 中的 &&,多個條件都為 true 時,結(jié)果才是 true |
or | 類似于 Java 中的 ||,只要有一個條件為 true,結(jié)果就為 true |
not | 類似于 Java 當(dāng)中的 ~,條件為 true,結(jié)果則為 false |
like 常搭配的通配符:
通配符 | 說明 |
---|---|
% | 表示任意多個字符(包含0個) |
_ | 表示任意一個字符 |
補(bǔ)充:
where
條件可以使用表達(dá)式,但不能不使用別名
and
的優(yōu)先級高于 or
and 符號也可以實現(xiàn) between
的功能,但是 between
其實就是 SQL 對這種范圍匹配的一種優(yōu)化
通配符: 即可以使用一個字符去表示其它任意的一個或多個字符,用于模糊搜索
模糊匹配涉及到字符串比較,所以當(dāng)前列里存的字符串比較長時,性能就會大打折扣
模糊匹配不一定要求列為字符串類型,例如數(shù)值類型也可以,但是語句里面要將 like 后面的模糊搜索的值加引號
SQL 中的條件相當(dāng)于是“過濾器”,而不是“邏輯分支”
示例1:查詢英語不及格的同學(xué)及其成績
示例2: 查詢總分小于200的同學(xué)及其總成績(下述方法不包含值為 NULL)
示例3: 查詢總分小于200的同學(xué)及其總成績,且包含值為 NULL 的同學(xué)(為了方便展示,這里我主動新增了值為 null 的同學(xué)諸葛亮)
示例4: 查詢語文成績在80到90分之間的同學(xué)及其成績
示例5: 查詢數(shù)學(xué)成績是 98、73和65的同學(xué)和成績
示例6: 查找所有姓孫的同學(xué)
示例7: 查找所有名字以德結(jié)尾的同學(xué)
示例8: 查詢名字包含悟的同學(xué)
示例9: 查找所有姓孫且名字只有兩個字的同學(xué)
示例10: 查詢數(shù)學(xué)成績有90幾的同學(xué)及數(shù)學(xué)成績
當(dāng)查詢結(jié)果很多時,就可以將查詢結(jié)果分為很多頁。
應(yīng)用場景: 當(dāng)我們在百度某個東西時,我們發(fā)現(xiàn),搜索的結(jié)果很多,為了不一下子得到這么多數(shù)據(jù),所以就用到了分頁查詢
注意: 當(dāng)要查詢的數(shù)據(jù)量很大時,其實網(wǎng)絡(luò)開銷是很大的,包括:
數(shù)據(jù)庫服務(wù)器磁盤 IO
數(shù)據(jù)庫客戶端到數(shù)據(jù)庫服務(wù)器的網(wǎng)絡(luò) IO
因此通過分頁查詢就可以限制一次查詢的結(jié)果數(shù)目,來防止較大的網(wǎng)絡(luò)開銷
示例1:limit n
返回查詢不多于 n 行的結(jié)果(n 表示查詢結(jié)果的最大數(shù)目,默認(rèn)從行0開始)
示例2:limit m
, n 返回查詢從行 m 開始,不多于 n 行的結(jié)果
示例3:limit n offset m
返回查詢從行 m 開始,不多于 n 行的結(jié)果
補(bǔ)充:
檢索出來的第一行為行0,而不是行1,上述示例2和示例3中的 m,代表行 m 或者 第 m+1 行
語法:
update 表名 set 列名1 = 要修改的值 [, ..., 列名n = 要修改的值] [where 條件] [order by ...] [limit...]; 1
補(bǔ)充:
update
會正真修改數(shù)據(jù)庫服務(wù)器硬盤的數(shù)據(jù)
update
中的 =,相當(dāng)于賦值
如果數(shù)據(jù)結(jié)果為 NULL,在這個基礎(chǔ)上進(jìn)行運(yùn)算,結(jié)果還是 NULL
示例1: 將孫悟空的數(shù)學(xué)成績修改成80(修改一個列)
示例2: 將曹孟德的數(shù)學(xué)成績改為60,語文成績改為70(修改多個列)
示例3: 將總成績倒數(shù)前三的3位同學(xué)的數(shù)學(xué)成績加上10分
示例4: 將所有同學(xué)的語文成績減10
語法:
delete from 表名 [where ...] [order by ...] [limit ...]
示例1: 刪除孫悟空同學(xué)的考試成績
示例2: 刪除整張表數(shù)據(jù)
注意:
刪除操作需要很謹(jǐn)慎
delete from
刪表是一條一條刪除的,如果數(shù)據(jù)量很大,刪除的速度就很慢。相比之下,直接刪表速度更快
感謝各位的閱讀,以上就是“MySQL數(shù)據(jù)庫中數(shù)據(jù)表的基本操作有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對MySQL數(shù)據(jù)庫中數(shù)據(jù)表的基本操作有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。