思考:SQL是一種編程語言济赎,那是不是意味著學(xué)習(xí)起來非常復(fù)雜呢塘娶?數(shù)據(jù)庫內(nèi)部有數(shù)據(jù)庫纹坐、數(shù)據(jù)表枝冀、字段以及相應(yīng)的數(shù)據(jù),是不是內(nèi)容會(huì)非常多呢?
引入:SQL是針對關(guān)系型數(shù)據(jù)庫的高級的非過程化編程語言果漾,是一種近乎自然語言的編程語言球切,因此從學(xué)習(xí)角度來講是非常簡單的。另外根據(jù)數(shù)據(jù)庫的實(shí)際應(yīng)用绒障,我們將基礎(chǔ)SQL學(xué)習(xí)分成對應(yīng)的三類吨凑,內(nèi)容也不多:
- 庫操作:針對數(shù)據(jù)庫的管理
- 表操作:針對數(shù)據(jù)表(字段)的管理
- 數(shù)據(jù)操作:針對表中數(shù)據(jù)的管理
總結(jié):SQL的學(xué)習(xí)本質(zhì)是要掌握數(shù)據(jù)庫的基礎(chǔ)指令操作,因此學(xué)習(xí)本身難度不大户辱,相對編程語言有各種對應(yīng)的業(yè)務(wù)邏輯而言鸵钝,SQL指令基本是固定的,因此要學(xué)習(xí)的量也不會(huì)太大庐镐。
思考:SQL是一種編程語言恩商,那是不是也像PHP一樣有一些語法規(guī)則呢?
引入:任何一種編程語言都有其固定的語法規(guī)則和結(jié)構(gòu)必逆,作為指令式的SQL語言怠堪,雖然語法簡單,但是也有其自身的規(guī)則末患。
一研叫、SQL語法規(guī)則
定義:SQL語法規(guī)則就是指服務(wù)器DBMS需要客戶端提供指定規(guī)范的代碼,SQL的語法規(guī)則比較簡單
- 語法環(huán)境:SQL執(zhí)行必須是在客戶端與服務(wù)端建立聯(lián)系(登錄驗(yàn)證通過進(jìn)入MySQL環(huán)境)之后才能被執(zhí)行的璧针,因此必須在進(jìn)入MySQL服務(wù)端之后嚷炉,客戶端才能給服務(wù)端發(fā)送指令
- 代碼執(zhí)行:SQL的執(zhí)行是服務(wù)器自動(dòng)判定執(zhí)行,而判定的標(biāo)準(zhǔn)就是檢測到語句結(jié)束符探橱。
- SQL代碼是順序逐行執(zhí)行的申屹。
- 語句結(jié)束符:SQL的語句結(jié)束符分為三種:
- 英文分號(;):與其他語言語句結(jié)束符一樣
- \g:與分號的效果一樣
- \G:數(shù)據(jù)結(jié)果以行為單位的縱向展示
mysql> select host,user,authentication_string from mysql.user;
mysql> select host,user,authentication_string from mysql.user\g
mysql> select host,user,authentication_string from mysql.user\G
- SQL指令關(guān)鍵字不區(qū)分大小寫
mysql> select host,user,authentication_string from mysql.user;
#最終執(zhí)行沒有區(qū)別
mysql> SELECT host,user,authentication_string FROM mysql.user;
- 注釋:SQL中也有注釋,分為行注釋和塊注釋:
- 行注釋:#和(--空格)隧膏,表示后面的所有內(nèi)容都是注釋
- 塊注釋:和其他編程語言一樣哗讥,使用/*塊注釋內(nèi)容*/
mysql> -- 這是注釋(注意--后有空格)
mysql> #這也是注釋
mysql>
mysql> /*
/*> 注釋從這里開始
/*> 注釋還沒結(jié)束,>前面的/*表示在等待對應(yīng)的結(jié)束
/*> */
mysql>
總結(jié):因?yàn)镾QL的語法特性胞枕,每次執(zhí)行的SQL基本都是一條杆煞,在發(fā)送SQL指令的時(shí)候可以沒有語句結(jié)束符,系統(tǒng)不會(huì)執(zhí)行腐泻,但是會(huì)一直等待語句結(jié)束符的出現(xiàn)决乎,才會(huì)組織前面的所有內(nèi)容進(jìn)行語法檢查然后執(zhí)行。
二派桩、SQL庫操作【掌握】
思考:客戶端登錄數(shù)據(jù)庫服務(wù)端之后构诚,什么都看不到,如何知道服務(wù)器里有什么東西呢铆惑?
引入:客戶端登錄數(shù)據(jù)庫其實(shí)本質(zhì)就是數(shù)據(jù)庫管理系統(tǒng)DBMS在和客戶端進(jìn)行響應(yīng)范嘱,DMBS管理的最粗單元就是數(shù)據(jù)庫(DB)送膳。默認(rèn)的,數(shù)據(jù)庫在安裝后是有自己的核心數(shù)據(jù)庫的丑蛤,只是需要特定的SQL指令才能看到叠聋。
1.查看數(shù)據(jù)庫【掌握】
定義:查看數(shù)據(jù)庫,即將系統(tǒng)已經(jīng)存在的數(shù)據(jù)庫顯示出來受裹。在SQL操作中晒奕,分兩種情況查看數(shù)據(jù)庫:一是查看所有數(shù)據(jù)庫,二是查看匹配數(shù)據(jù)庫
- 查看所有數(shù)據(jù)庫:show databases;
mysql> show databases;
+--------------------+
| Database | #名字:當(dāng)前表只有一個(gè)字段名字叫Database
+--------------------+
| information_schema | #第一個(gè)數(shù)據(jù)庫
| mysql | #第二個(gè)數(shù)據(jù)庫
| performance_schema |
| sys | #默認(rèn)四個(gè)數(shù)據(jù)庫
+--------------------+
4 rows in set (0.00 sec) #說明:4行數(shù)據(jù)(括號內(nèi)表示用時(shí)名斟,單位秒)
注意:版本不同數(shù)據(jù)庫的內(nèi)部結(jié)構(gòu)不同脑慧,5.7以前的mysql數(shù)據(jù)庫都有一個(gè)空數(shù)據(jù)庫test給用戶使用的
- 查看部分?jǐn)?shù)據(jù)庫:使用匹配方式匹配相近數(shù)據(jù)庫,語法結(jié)構(gòu)為:show databases like 'pattern';
占位符_(下劃線):匹配固定位置單個(gè)字符砰盐,_a闷袒,可以是Aa\aa\sa,但不能是aaa
占位符%(百分號):匹配多個(gè)字符岩梳,%a囊骤,可以是任何以a結(jié)尾的字符
為了解決實(shí)際需求,_和%可以同時(shí)無限制使用
mysql> show databases like '_a'; #下劃線匹配
mysql> show databases like '%a'; #模糊匹配
- 數(shù)據(jù)庫創(chuàng)建是有SQL指令完成的冀值,可以通過指令查看數(shù)據(jù)庫創(chuàng)建的指令:show create database 數(shù)據(jù)庫名字;
mysql> show create database mysql;
總結(jié):通過show databases指令可以實(shí)現(xiàn)查看全部或者匹配部分?jǐn)?shù)據(jù)庫也物。在實(shí)際工作中,當(dāng)項(xiàng)目數(shù)據(jù)庫較少時(shí)使用查看全部列疗,如果項(xiàng)目數(shù)據(jù)庫非常多滑蚯,那么可以使用匹配模式來篩選要查看的數(shù)據(jù)庫。如果想了解一下數(shù)據(jù)庫的詳細(xì)信息抵栈,可以通過show create database 數(shù)據(jù)庫名字來實(shí)現(xiàn)告材。
思考:MySQL系統(tǒng)自帶數(shù)據(jù)庫了,是不是在開發(fā)的過程中古劲,就可以直接使用這些數(shù)據(jù)庫來儲(chǔ)存項(xiàng)目數(shù)據(jù)呢斥赋?
引入:系統(tǒng)內(nèi)部的數(shù)據(jù)庫是用于數(shù)據(jù)庫管理工作的,不適合存放用戶項(xiàng)目數(shù)據(jù)产艾,如果用戶要使用數(shù)據(jù)庫疤剑,需要根據(jù)項(xiàng)目來創(chuàng)建對應(yīng)的數(shù)據(jù)庫。
2.創(chuàng)建數(shù)據(jù)庫【掌握】
定義:創(chuàng)建數(shù)據(jù)庫闷堡,就是通過對應(yīng)的SQL指令實(shí)現(xiàn)在數(shù)據(jù)庫服務(wù)器中增加對應(yīng)的數(shù)據(jù)庫信息隘膘。
- 創(chuàng)建數(shù)據(jù)庫:create database 數(shù)據(jù)庫名字;
mysql> create database my_database;
Query OK, 1 row affected (0.09 sec) #Query OK表示指令正確執(zhí)行
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| my_database | #查看到創(chuàng)建的數(shù)據(jù)庫
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.04 sec)
- 數(shù)據(jù)庫命名規(guī)范
- 數(shù)據(jù)庫名字由字母、數(shù)字和下劃線組成
- 數(shù)據(jù)庫不強(qiáng)制要求數(shù)字不能開頭(但是不建議)
- 數(shù)據(jù)庫命名應(yīng)當(dāng)見名知意(與項(xiàng)目對應(yīng))
- 數(shù)據(jù)庫多單詞數(shù)據(jù)庫命名建議使用下劃線法
- 數(shù)據(jù)庫名字如果使用到了SQL內(nèi)部關(guān)鍵字或者保留字應(yīng)該使用反引號包裹(數(shù)字鍵1左邊對應(yīng)的英文狀態(tài)``缚窿,但是不建議使用沖突關(guān)鍵字作為名字)
mysql> create database create;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'create' at line 1
#錯(cuò)誤解析:Mysql不會(huì)提示具體錯(cuò)誤信息棘幸,只會(huì)提示在哪一塊出現(xiàn)錯(cuò)誤焰扳,需要開發(fā)人員自己尋找錯(cuò)誤
mysql>
mysql> create database `create`; #使用反引號``后可以實(shí)現(xiàn)
Query OK, 1 row affected (0.00 sec)
- 數(shù)據(jù)庫創(chuàng)建過程中可以指定數(shù)據(jù)庫字符集:create database 數(shù)據(jù)庫名字 charset 字符集;
mysql> create database my_project charset utf8;
Query OK, 1 row affected (0.00 sec)
#指定字符集為utf8倦零,注意mysql中utf-8用utf8表示(不允許使用中劃線-)
注意:指定字符集的效果是數(shù)據(jù)庫中的默認(rèn)數(shù)據(jù)按照當(dāng)前字符集來存儲(chǔ)误续,但是實(shí)際數(shù)據(jù)存儲(chǔ)的話以更小的字符集為準(zhǔn)(數(shù)據(jù)表字符集);數(shù)據(jù)庫如果不指定字符集扫茅,那么默認(rèn)使用DBMS對應(yīng)的字符集蹋嵌。
- 數(shù)據(jù)庫創(chuàng)建指令執(zhí)行成功后,不只是會(huì)在查看時(shí)看到對應(yīng)數(shù)據(jù)庫葫隙,會(huì)在MySQL指定的存儲(chǔ)數(shù)據(jù)的目錄data下看到一個(gè)對應(yīng)名字的文件夾
總結(jié):數(shù)據(jù)庫創(chuàng)建是通過create database指令實(shí)現(xiàn)栽烂,是項(xiàng)目實(shí)施的第一條有效指令。在創(chuàng)建數(shù)據(jù)庫的時(shí)候通常會(huì)根據(jù)項(xiàng)目來設(shè)定字符集(目前項(xiàng)目基本都是使用utf8)恋脚,但是要注意utf8不能寫成utf-8腺办。
思考:如果在創(chuàng)建數(shù)據(jù)庫的時(shí)候弄錯(cuò)了名字或者字符集什么的后期可以改嗎?
引入:MySQL數(shù)據(jù)庫在5版本以前允許數(shù)據(jù)庫名字修改糟描,但是在5以后不允許修改名字了怀喉,不過可以修改默認(rèn)字符集。
3.修改數(shù)據(jù)庫字符集【了解】
定義:修改數(shù)據(jù)庫字符集船响,就是讓數(shù)據(jù)庫中其他結(jié)構(gòu)(數(shù)據(jù)表)能夠使用對應(yīng)的默認(rèn)字符集躬拢。
- 修改數(shù)據(jù)庫字符集:alter database 數(shù)據(jù)庫名字 charset 新字符集;
mysql> alter database my_project charset gbk;
Query OK, 1 row affected (0.04 sec)
- 數(shù)據(jù)庫字符集的修改是針對以后在數(shù)據(jù)庫創(chuàng)建的結(jié)構(gòu)的默認(rèn)字符集,不會(huì)修改已經(jīng)存在的數(shù)據(jù)表對應(yīng)的字符集
總結(jié):數(shù)據(jù)庫字符集的修改目的是為了讓后續(xù)創(chuàng)建的數(shù)據(jù)表能夠使用新的默認(rèn)字符集见间,但是不能改變已經(jīng)存在的數(shù)據(jù)表和表中的數(shù)據(jù)聊闯。實(shí)際上在開發(fā)過程中,數(shù)據(jù)庫的字符集通常在開始就會(huì)根據(jù)實(shí)際項(xiàng)目需求設(shè)定好米诉,不會(huì)隨意改變菱蔬。
思考:如果數(shù)據(jù)庫不想要了,或者已經(jīng)有新的代替了史侣,該如何讓數(shù)據(jù)庫消失呢汗销?
引入:讓數(shù)據(jù)庫消失在開發(fā)中屬于偽命題,通常不會(huì)輕易就讓數(shù)據(jù)庫消失抵窒,這樣會(huì)帶來數(shù)據(jù)的損失弛针。但是如果在開發(fā)環(huán)境中或者真的要終結(jié)某個(gè)項(xiàng)目,那么也可以實(shí)現(xiàn)數(shù)據(jù)庫刪除李皇。
4.刪除數(shù)據(jù)庫【了解】
定義:刪除數(shù)據(jù)庫削茁,即讓數(shù)據(jù)庫在MySQL服務(wù)器端不存在
- 刪除數(shù)據(jù)庫:drop database 數(shù)據(jù)庫名字;
mysql> drop database my_project;
Query OK, 0 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| create |
| my_database |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
- 數(shù)據(jù)庫刪除會(huì)直接清空該數(shù)據(jù)庫內(nèi)的所有內(nèi)容,而且不可找回掉房,因此一定要慎重(操作之前先做安全備份)
- 數(shù)據(jù)庫的刪除只允許一次刪除一個(gè)茧跋,不能刪除多個(gè)
mysql> drop database my_database,`create`;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`create`' at line 1
- 數(shù)據(jù)庫的刪除不只是在系統(tǒng)環(huán)境中看不到對應(yīng)的數(shù)據(jù)庫名字,對應(yīng)data目錄下的數(shù)據(jù)庫名字文件夾也會(huì)被清空
總結(jié):數(shù)據(jù)庫的刪除是一種非常謹(jǐn)慎的操作卓囚,因?yàn)橐坏﹦h除就不可恢復(fù)瘾杭。在生產(chǎn)環(huán)境中進(jìn)行刪除操作非常恐怖哪亿,一定不要執(zhí)行粥烁,如果確定要執(zhí)行贤笆,勢必要拿到上級的明確指令甚至責(zé)任文件,而且在操作的時(shí)候也一定要事先備份讨阻。
三芥永、數(shù)據(jù)表(字段)操作【掌握】
思考:目前已經(jīng)知道如何創(chuàng)建屬于用戶項(xiàng)目的數(shù)據(jù)庫,那么數(shù)據(jù)是否可以直接存放到數(shù)據(jù)庫里呢钝吮?
引入:數(shù)據(jù)庫是數(shù)據(jù)存儲(chǔ)的大容器埋涧,數(shù)據(jù)庫本身不能存放數(shù)據(jù),必須依賴數(shù)據(jù)表才能存儲(chǔ)數(shù)據(jù)奇瘦。
1.創(chuàng)建數(shù)據(jù)表【掌握】
定義:創(chuàng)建數(shù)據(jù)表棘催,即在數(shù)據(jù)庫中創(chuàng)建更小的數(shù)據(jù)存儲(chǔ)的結(jié)構(gòu)。數(shù)據(jù)表是一個(gè)二維結(jié)構(gòu)表耳标,不只是有關(guān)表自身結(jié)構(gòu)巧鸭,而且還與字段是一體的。因此所有數(shù)據(jù)表的操作就意味著有數(shù)據(jù)字段的操作麻捻。
- 創(chuàng)建數(shù)據(jù)表語法結(jié)構(gòu)
create table 表名(
字段名 字段類型 [字段屬性], #每個(gè)字段有對應(yīng)的英文逗號“,”分隔
字段名 字段類型 [字段屬性], #字段屬性并非強(qiáng)制要求
...
字段名 字段類型 [字段屬性] #最后一個(gè)字段名不需要逗號結(jié)束
)[表選項(xiàng)]; #表選項(xiàng)可有可無纲仍,都有默認(rèn)值
- 表名:描述表內(nèi)數(shù)據(jù)的關(guān)鍵字,由數(shù)字贸毕、字母和下劃線組成(不建議使用數(shù)字開頭)郑叠;如果使用關(guān)鍵字或者保留字作為表名應(yīng)該使用反引號``;表名字在同一個(gè)數(shù)據(jù)庫下不能重復(fù)
- 字段名字:二維表列名字明棍,描述該列數(shù)據(jù)的關(guān)鍵字乡革;同一表內(nèi)字段名字不能重復(fù)
- 字段類型:MySQL為了方便數(shù)據(jù)的規(guī)范,對每列數(shù)據(jù)都強(qiáng)制規(guī)定數(shù)據(jù)的類型
- 表選項(xiàng):表的額外規(guī)范摊腋,包括存儲(chǔ)引擎(默認(rèn)InnoDB)沸版、字符集(默認(rèn)數(shù)據(jù)庫字符集)和校對集(默認(rèn)數(shù)據(jù)庫對應(yīng)校對集)
注意:表是一種多行結(jié)構(gòu),因此不建議直接使用CMD控制臺(tái)輸入指令兴蒸,應(yīng)該先在文本中寫好指令视粮,然后復(fù)制到CMD下去運(yùn)行
mysql> create table my_table(
-> name varchar(10), #name為字段名,varchar(10)表示最長10個(gè)字符
-> age int #age為字段名橙凳,int表示整形
-> );
ERROR 1046 (3D000): No database selected #錯(cuò)誤蕾殴,沒有選擇數(shù)據(jù)庫
mysql>
- 數(shù)據(jù)表是依附于數(shù)據(jù)庫存在的,也就是說數(shù)據(jù)表必須屬于某個(gè)指定的數(shù)據(jù)庫岛啸,而不能直接在DMBS下創(chuàng)建對應(yīng)的數(shù)據(jù)庫钓觉。要指定表對應(yīng)的數(shù)據(jù)庫有兩種方式:
- 直接在數(shù)據(jù)表名字前綁定數(shù)據(jù)庫:create table 數(shù)據(jù)庫.數(shù)據(jù)表名字 ...
mysql> create table my_database.my_table( #指定數(shù)據(jù)表my_table放到數(shù)據(jù)庫my_database下
-> name varchar(10),
-> age int
-> );
Query OK, 0 rows affected (0.36 sec)
- 進(jìn)入到某個(gè)具體數(shù)據(jù)庫環(huán)境:use 數(shù)據(jù)庫名字;
mysql> use my_database; #進(jìn)入my_database,后續(xù)的操作默認(rèn)都是在my_database里面
Database changed
mysql>
mysql> create table my_student(
-> name varchar(10),
-> number varchar(10),
-> age int
-> );
Query OK, 0 rows affected (0.70 sec)
- 表選項(xiàng)1:存儲(chǔ)引擎坚踩,數(shù)據(jù)存儲(chǔ)的方式荡灾,默認(rèn)是InnoDB(5以前是MyIsam)。存儲(chǔ)引擎的語法結(jié)構(gòu)為:engine [=] InnoDB/Myisam
mysql> create table my_engine1(
-> name varchar(10)
-> )engine InnoDB;
Query OK, 0 rows affected (0.77 sec)
mysql> create table my_engine2(
-> name varchar(10)
-> )engine = MyIsam;
Query OK, 0 rows affected (0.08 sec)
注意:存儲(chǔ)引擎InnoDB和MyIsam的差別不僅僅是在數(shù)據(jù)處理上,在數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)方面也有區(qū)別:InnoDB會(huì)創(chuàng)建一個(gè)結(jié)構(gòu)和一個(gè)數(shù)據(jù)批幌、索引文件(5.7.2后存在)础锐;MyIsam會(huì)創(chuàng)建三個(gè)文件:結(jié)構(gòu)、數(shù)據(jù)和索引
- 表選項(xiàng)2:字符集逼裆,表中數(shù)據(jù)指定的字符集,默認(rèn)是所屬數(shù)據(jù)庫的字符集赦政。字符集的語法為:[default] charset [=] 字符集
mysql> create table my_charset1(
-> name varchar(10)
-> )default charset = utf8;
Query OK, 0 rows affected (0.31 sec)
mysql> create table my_charsete2(
-> name varchar(10)
-> )charset gbk;
Query OK, 0 rows affected (0.29 sec)
- 表選項(xiàng)中的存儲(chǔ)引擎和字符集沒有順序關(guān)系胜宇,可以同時(shí)存在
mysql> create table my_engine_charset1(
-> name varchar(10)
-> )charset utf8 engine = Innodb;
Query OK, 0 rows affected (0.29 sec)
mysql> create table my_engine_charset2(
-> name varchar(20)
-> )engine = Myisam default charset = utf8;
Query OK, 0 rows affected (0.10 sec)
- 創(chuàng)建表的特殊方式:有的時(shí)候可以使用一種“偷懶”的方式來創(chuàng)建表,這種方式就是通過已經(jīng)創(chuàng)建好的表來實(shí)現(xiàn)恢着。MySQL中提供了兩種簡單方式:
-
使用SQL指令創(chuàng)建仿照已經(jīng)存在的表創(chuàng)建新表:create table 表名 like [數(shù)據(jù)庫名.]舊表名;
mysql> use create; #進(jìn)入到create數(shù)據(jù)庫環(huán)境 Database changed mysql> create table my_table_new like my_database.my_table; Query OK, 0 rows affected (0.73 sec)
- 可以直接復(fù)制MyIsam結(jié)構(gòu)表的三個(gè)文件到另外的數(shù)據(jù)庫:MyIsam表是獨(dú)立空間桐愉,可以移動(dòng)有效;而InnoDB是非獨(dú)立空間直接移動(dòng)是無法生效的
- 練習(xí):創(chuàng)建一張學(xué)生表和一張專業(yè)表掰派,學(xué)生表包含字段有:學(xué)生姓名从诲、性別、年齡靡羡、學(xué)號系洛、聯(lián)系方式、專業(yè)略步、家庭住址描扯,專業(yè)表包含字段有:專業(yè)名稱、專業(yè)編號趟薄、所屬學(xué)院绽诚。然后思考一下兩個(gè)表之間是否有聯(lián)系
總結(jié)
創(chuàng)建數(shù)據(jù)表是通過create table關(guān)鍵字創(chuàng)建
因?yàn)楸砗妥侄尾环旨遥侄卧贛ySQL中又是必須指定類型的杭煎,所以表恩够、字段名和字段類型是一起存在的
創(chuàng)建數(shù)據(jù)庫表必須指定數(shù)據(jù)庫,因?yàn)楸韺儆跀?shù)據(jù)庫管理
表選項(xiàng)部分如果在數(shù)據(jù)庫設(shè)定好的前提下羡铲,不是特別業(yè)務(wù)需求蜂桶,不用額外的管理。
思考:創(chuàng)建表的時(shí)候表名是不能在一個(gè)數(shù)據(jù)庫中重復(fù)存在的也切,那么如何查看表名在數(shù)據(jù)庫中已經(jīng)使用過了呢屎飘?
引入:首先在系統(tǒng)開發(fā)中,創(chuàng)建結(jié)構(gòu)的SQL指令應(yīng)該是要在外部文檔創(chuàng)建的贾费,其次在進(jìn)行表格創(chuàng)建的時(shí)候钦购,系統(tǒng)會(huì)自動(dòng)告知表名是否已經(jīng)存在,也不會(huì)出現(xiàn)什么大問題褂萧。但是我們可以通過查看數(shù)據(jù)庫中的表來避免這種錯(cuò)誤押桃。
2.查看數(shù)據(jù)表【掌握】
定義:數(shù)據(jù)表的存在是與字段和類型一體的,因此查看表的情況相對來說種類比較多导犹,可以是查看表名也可以是查看表結(jié)構(gòu)
- 查看全部已存在表:show tables; #進(jìn)入數(shù)據(jù)庫環(huán)境
mysql> show tables;
+-----------------------+
| Tables_in_my_database |
+-----------------------+
| my_charset1 |
| my_charsete2 |
| my_engine1 |
| my_engine2 |
| my_engine_charset1 |
| my_engine_charset2 |
| my_student |
| my_table |
+-----------------------+
8 rows in set (0.00 sec)
-
查看部分匹配表名:show tables like 'pattern';
匹配模式也是‘_’單個(gè)字符匹配和‘%’多個(gè)字符模糊匹配
mysql> show tables like 'my_charset_';
#注意my后面的下劃線會(huì)匹配所有單個(gè)字符包括下劃線本身
+-------------------------------------+
| Tables_in_my_database (my_charset_) |
+-------------------------------------+
| my_charset1 |
+-------------------------------------+
1 row in set (0.00 sec)
mysql> show tables like 'my_e%';
#匹配所有my開頭后跟一個(gè)字符唱凯,然后接e字符羡忘,后無限匹配
+-------------------------------+
| Tables_in_my_database (my_e%) |
+-------------------------------+
| my_engine1 |
| my_engine2 |
| my_engine_charset1 |
| my_engine_charset2 |
+-------------------------------+
4 rows in set (0.00 sec)
- 查看表結(jié)構(gòu),就是顯示表中所有的字段細(xì)信息等:desc/describe/[show columns from] 表名;
mysql> desc my_table;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> describe my_table;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> show columns from my_table;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
#Field表示字段名
#Type表示字段類型
#NULL表示字段是否允許為空(屬性)
#key表示字段的索引
#Default表示字段的默認(rèn)值(屬性)
#Extra表示額外屬性(屬性)
- 查看表創(chuàng)建語句磕昼,可以方便看出表的結(jié)構(gòu)信息以及表選項(xiàng)控制:show create table 表名;
mysql> show create table my_table;
+----------+----------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------+----------------------------------------------------------------------------------------------------------------------------------+
| my_table | CREATE TABLE `my_table` (
`name` varchar(10) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+----------+----------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)
#此創(chuàng)建語句并非用戶輸入的原始語句卷雕,而是被系統(tǒng)加工保存的創(chuàng)建語句
#這種結(jié)構(gòu)查看適合使用\G查看,會(huì)更清晰
mysql> show create table my_table\G
*************************** 1. row ***************************
Table: my_table
Create Table: CREATE TABLE `my_table` (
`name` varchar(10) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
總結(jié)
show tables可以實(shí)現(xiàn)查看全部表或者匹配部分查看
show create table能夠?qū)崿F(xiàn)表結(jié)構(gòu)的查看票从,方便我們?nèi)チ私獗淼慕Y(jié)構(gòu)并針對其進(jìn)行相應(yīng)的調(diào)整
desc/describe/show columns from 表名來查看字段數(shù)據(jù)
思考:表結(jié)構(gòu)查看可以方便我們看原來的設(shè)計(jì)是否滿足需求漫雕,如果不滿足怎么辦?
引入:數(shù)據(jù)表涉及的內(nèi)容比較多峰鄙,包括名字本身和字段以及字段類型(還有字段屬性)浸间,這塊如果前期設(shè)計(jì)不好的話,后期的確會(huì)有一些需要修改的時(shí)候吟榴。
3.更新數(shù)據(jù)表【掌握】
定義:更新數(shù)據(jù)表即根據(jù)需求更新表本身以及表內(nèi)部字段部分的內(nèi)容
- 更新表名魁蒜,表的名字可以修改:rename table 舊表名 to 新表名;
mysql> show tables;
+-----------------------+
| Tables_in_my_database |
+-----------------------+
| my_charset1 |
| my_charsete2 | #原表名
| my_engine1 |
| my_engine2 |
| my_engine_charset1 |
| my_engine_charset2 |
| my_student |
| my_table |
+-----------------------+
8 rows in set (0.00 sec)
mysql> rename table my_charsete2 to my_charset2; #修改語句
Query OK, 0 rows affected (0.65 sec)
mysql> show tables;
+-----------------------+
| Tables_in_my_database |
+-----------------------+
| my_charset1 |
| my_charset2 | #新表名
| my_engine1 |
| my_engine2 |
| my_engine_charset1 |
| my_engine_charset2 |
| my_student |
| my_table |
+-----------------------+
8 rows in set (0.00 sec)
注意:如果見到有些地方對應(yīng)的表名是 XXX.表名 不要奇怪,XXX只是顯式的指定的數(shù)據(jù)庫名字而已
- 更新表選項(xiàng)吩翻,即更新表后期對應(yīng)信息(不建議修改):alter table 表名 表選項(xiàng)修改;
mysql> show create table my_table\G
*************************** 1. row ***************************
Table: my_table
Create Table: CREATE TABLE `my_table` (
`name` varchar(10) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> #當(dāng)前表使用的字符集為my_database數(shù)據(jù)庫的默認(rèn)字符集(數(shù)據(jù)庫也沒指定用的DMBS的字符集)
mysql>
mysql> alter table my_table default charset = utf8; #修改表選項(xiàng)
Query OK, 0 rows affected (0.50 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table my_table\G
*************************** 1. row ***************************
Table: my_table
Create Table: CREATE TABLE `my_table` (
`name` varchar(10) CHARACTER SET latin1 DEFAULT NULL,
#細(xì)節(jié):原本該字段沒有提示字符集兜看,但是在表字符集被改后該字段多出了字符集顯示
#原理:原來表和字段都是采用數(shù)據(jù)庫默認(rèn)字符集,現(xiàn)在改了表狭瞎,但是字段不會(huì)自動(dòng)改變
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql>
注意:表選項(xiàng)通常在一開始確定后就不再修改铣减,尤其是當(dāng)表內(nèi)已經(jīng)產(chǎn)生數(shù)據(jù)后更不要輕易修改(尤其是字符集修改)。
- 修改表字段或者屬性脚作,這塊操作比較復(fù)雜葫哗,涉及到字段新增、字段修改(名字+屬性)球涛,字段刪除等操作劣针,都是使用alter table 表名操作
- 增加表字段,本質(zhì)是增加表的字段名以及字段類型(屬性):alter table 表名 add [column] 字段名 字段類型 [屬性];
mysql> desc my_table;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> alter table my_table add column number varchar(10);
Query OK, 0 rows affected (0.58 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc my_table;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| number | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
- 修改表字段名亿扁,也是強(qiáng)制要求必須修改對應(yīng)的字段類型:alter table 表名 change [column] 舊字段名 新字段名 字段類型 [屬性];
mysql> desc my_table;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| number | varchar(10) | YES | | NULL | | #修改前
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> alter table my_table change number school_number varchar(10);
Query OK, 0 rows affected (0.47 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc my_table;
+---------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| school_number | varchar(10) | YES | | NULL | | #修改后
+---------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
- 修改表字段類型(屬性):alter table 表名 modify [column] 字段名 新字段類型 [屬性];
mysql> desc my_table;
+---------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| school_number | varchar(10) | YES | | NULL | | #修改前Type為varchar類型
+---------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> alter table my_table modify school_number int;
Query OK, 0 rows affected (0.79 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc my_table;
+---------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| school_number | int(11) | YES | | NULL | | #修改后Type為int類型
+---------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
注意:change也可以用于修改字段類型和屬性(不建議)捺典,只需要使用:alter table 表名 change 舊名字 舊名字 字段類型 [屬性];
- 刪除表字段:alter table 表名 drop [column] 字段名;
mysql> desc my_table;
+---------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| school_number | int(11) | YES | | NULL | |
+---------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> alter table my_table drop school_number;
Query OK, 0 rows affected (0.63 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc my_table;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
- 修改字段位置:字段默認(rèn)的操作(新增)都是在所有字段最后,我們可以通過位置指令來實(shí)現(xiàn)字段放到任意位置(change和modify指令也可以修改位置)
- first:字段放到第一個(gè)位置
mysql> desc my_table;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> alter table my_table add number varchar(10) first; #放到第一個(gè)位置
Query OK, 0 rows affected (0.87 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc my_table;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| number | varchar(10) | YES | | NULL | | #原本應(yīng)該在age后的从祝,現(xiàn)在在第一個(gè)位置
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
- after 字段名:放到指定字段名的后面
mysql> desc my_table;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| number | varchar(10) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> alter table my_table modify name varchar(10) after age; #只修改位置襟己,使用modfiy
Query OK, 0 rows affected (1.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc my_table;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| number | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | | #name字段由原來的age前變到age后
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.07 sec)
注意:drop字段操作會(huì)將該字段對應(yīng)的數(shù)據(jù)也一并刪除,所以請確保安全(操作前備份)
- 練習(xí):在已創(chuàng)建的學(xué)生表中牍陌,增加愛好hobby擎浴、高中high_school字段和ID字段(放到第一個(gè)),然后修改hign_school為senior_school毒涧,并將位置放到hobby前(hobby前一個(gè)字段之后)贮预,最后刪除hobby字段
總結(jié)
- MySQL為表結(jié)構(gòu)提供了一套容錯(cuò)機(jī)制,允許在表創(chuàng)建后對字段進(jìn)行增刪改操作,這些操作主要是考慮到業(yè)務(wù)變化仿吞,之前設(shè)定的字段名滑频、字段類型或者屬性需要有對應(yīng)的修改
- 我們可以通過rename實(shí)現(xiàn)表名修改
- 可以通過alter table 表名 add/change/modify/drop實(shí)現(xiàn)表中字段的增刪改,從而可以全面的維護(hù)表結(jié)構(gòu)
- 不過唤冈,雖然MySQL有這樣一套容錯(cuò)機(jī)制峡迷,但是開發(fā)人員還是應(yīng)該盡量在表創(chuàng)建期間考慮到更多的因素以防止后期對表結(jié)構(gòu)的修改。
思考:如果一張表創(chuàng)建錯(cuò)了你虹,不想要了該怎么辦呢绘搞?
引入:雖然創(chuàng)建表錯(cuò)誤是一件低概率事件,而且是應(yīng)該盡量避免的事情售葡,但是MySQL也還是提供了一種容錯(cuò)機(jī)制看杭,允許用戶刪除表忠藤。
4.數(shù)據(jù)表刪除【掌握】
定義:刪除表結(jié)構(gòu)挟伙,即將創(chuàng)建表以及表中的數(shù)據(jù)進(jìn)行一次性刪除。
- 刪除表結(jié)構(gòu)語法:drop table 表名;
mysql> show tables;
+-----------------------+
| Tables_in_my_database |
+-----------------------+
| my_charset1 |
| my_charset2 |
| my_engine1 | #執(zhí)行刪除前
| my_engine2 |
| my_engine_charset1 |
| my_engine_charset2 |
| my_student |
| my_table |
+-----------------------+
8 rows in set (0.00 sec)
mysql> drop table my_engine1; #執(zhí)行刪除操作
Query OK, 0 rows affected (0.26 sec)
mysql> show tables;
+-----------------------+
| Tables_in_my_database | #刪除后效果
+-----------------------+
| my_charset1 |
| my_charset2 |
| my_engine2 |
| my_engine_charset1 |
| my_engine_charset2 |
| my_student |
| my_table |
+-----------------------+
7 rows in set (0.00 sec)
注意:刪除表操作會(huì)刪除表中所有的數(shù)據(jù)模孩,因此一定要做好刪除前的準(zhǔn)備工作(刪除確認(rèn)以及對應(yīng)數(shù)據(jù)備份)
- 刪除表的時(shí)候MySQL允許同時(shí)刪除多張表:drop table 表名1,表名2...;
mysql> show tables;
+-----------------------+
| Tables_in_my_database |
+-----------------------+
| my_charset1 |
| my_charset2 |
| my_engine2 | #刪除前
| my_engine_charset1 |
| my_engine_charset2 |
| my_student | #刪除前
| my_table |
+-----------------------+
7 rows in set (0.00 sec)
mysql> drop table my_engine2,my_student; #一次性刪除兩張表
Query OK, 0 rows affected (0.27 sec)
mysql> show tables;
+-----------------------+
| Tables_in_my_database |
+-----------------------+
| my_charset1 |
| my_charset2 |
| my_engine_charset1 |
| my_engine_charset2 |
| my_table |
+-----------------------+
5 rows in set (0.00 sec)
- 在項(xiàng)目前期或者備份還原數(shù)據(jù)的時(shí)候尖阔,有的時(shí)候會(huì)特意去刪除已經(jīng)存在的同名數(shù)據(jù)表,這個(gè)時(shí)候也會(huì)用到刪除操作榨咐,不過在操作的時(shí)候會(huì)加上一個(gè)判斷介却,保證刪除表結(jié)構(gòu)的指令不會(huì)被報(bào)錯(cuò):drop table if exists 表名;
mysql> show tables;
+-----------------------+
| Tables_in_my_database |
+-----------------------+
| my_charset1 |
| my_charset2 |
| my_engine_charset1 |
| my_engine_charset2 |
| my_table |
+-----------------------+
5 rows in set (0.00 sec)
mysql> drop table if exists my_student; #有則刪除,沒有就跳過
Query OK, 0 rows affected, 1 warning (0.00 sec)
#當(dāng)前沒有執(zhí)行块茁,因?yàn)閿?shù)據(jù)庫中沒有my_student表
mysql> create table my_student(
-> name varchar(10),
-> age int
-> )charset utf8;
Query OK, 0 rows affected (0.68 sec)
mysql> show tables;
+-----------------------+
| Tables_in_my_database |
+-----------------------+
| my_charset1 |
| my_charset2 |
| my_engine_charset1 |
| my_engine_charset2 |
| my_student |
| my_table |
+-----------------------+
6 rows in set (0.00 sec)
注意:drop table if exists 表名如果發(fā)現(xiàn)沒有刪除的表雖然不會(huì)做什么齿坷,但是會(huì)給出一個(gè)警告,如果想知道警告內(nèi)容是什么数焊,可以直接在出現(xiàn)警告后使用: show warnings;命令查看警告信息
mysql> drop table if exists my_student;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show warnings;
+-------+------+----------------------------------------+
| Level | Code | Message |
+-------+------+----------------------------------------+
| Note | 1051 | Unknown table 'my_database.my_student' | #明確告知沒有my_student表
+-------+------+----------------------------------------+
1 row in set (0.00 sec)
總結(jié):刪除表操作能夠幫助我們清楚錯(cuò)誤的或者已經(jīng)不用的表永淌,但是這種操作本身具有不安全性,因此需要特別注意被刪除的表的安全性質(zhì)佩耳,事先做好保護(hù)工作遂蛀。
四、數(shù)據(jù)操作【掌握】
思考:數(shù)據(jù)表已經(jīng)創(chuàng)建好了干厚,怎樣才能把數(shù)據(jù)放到數(shù)據(jù)表中去呢李滴?
引入:數(shù)據(jù)表是數(shù)據(jù)操作的基本單位,但是實(shí)際上數(shù)據(jù)本身的存儲(chǔ)都是以字段為最小存儲(chǔ)單位的蛮瞄。往表中存放數(shù)據(jù)所坯,就是將數(shù)據(jù)存放到表中每個(gè)字段對應(yīng)的列中。在MySQL中挂捅,數(shù)據(jù)是以插入的方式來實(shí)現(xiàn)數(shù)據(jù)新增的包竹。
1.新增數(shù)據(jù)【掌握】
定義:新增數(shù)據(jù),就是往數(shù)據(jù)表中對應(yīng)的空行中填充對應(yīng)字段所需要的數(shù)據(jù)。
- 新增一條完整數(shù)據(jù):對表中對應(yīng)的一條空白記錄處所有字段數(shù)據(jù):insert into 表名 values(字段1對應(yīng)的值1,字段2對應(yīng)的值2...,字段N對應(yīng)的值N)
- 值元素的數(shù)量和字段數(shù)量要一致
- 字段的順序與值的順序要對應(yīng)上
- 字符串?dāng)?shù)據(jù)需要使用引號包裹,可以是單引號和雙引號
mysql> desc my_table;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| number | varchar(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.04 sec)
mysql> insert into my_table values('0000000001',20,'Jim');
Query OK, 1 row affected (0.17 sec)
- 新增指定字段數(shù)據(jù):給表中對應(yīng)的一條空白記錄處指定字段數(shù)據(jù):insert into 表名 (字段1,字段2...字段N) values(值1,值2...值N)锥涕;
- 值元素的數(shù)量要與指定的字段數(shù)量一致
- 值元素的順序要與指定字段的順序一致(字段順序可以不和表字段順序一致)
- 沒有被選中的其他表字段不能因?yàn)闆]有數(shù)據(jù)出錯(cuò)
mysql> insert into my_table (name,number) values('Tom','0000000002');
Query OK, 1 row affected (0.11 sec)
- 新增多條記錄:可以是完整的或者指定字段的多條記錄:insert into 表名 [(字段列表)] values(值列表1),(值列表2),...(值列表N);
mysql> insert into my_table values('0000000003',20,'Lily'),
-> ('0000000004',18,'LiLei'),
-> ('0000000005',28,'Lycy'); #最后一次分號相寇,表示結(jié)束,前面使用逗號“,”分隔
Query OK, 3 rows affected (0.10 sec)
Records: 3 Duplicates: 0 Warnings: 0
- 練習(xí):使用多種方式進(jìn)行數(shù)據(jù)插入操作酱讶,讓數(shù)據(jù)表中數(shù)據(jù)最少達(dá)到10條記錄
總結(jié):數(shù)據(jù)插入是數(shù)據(jù)操作的第一步,使用insert into 表名 [(字段列表)] values(值列表);方式彼乌,可以使用字段列表來進(jìn)行數(shù)據(jù)插入泻肯,但是通常實(shí)際開發(fā)會(huì)使用全字段數(shù)據(jù)插入方式∥空眨可以每次進(jìn)行一條數(shù)據(jù)插入灶挟,也可以一次性實(shí)現(xiàn)多條數(shù)據(jù)插入。在數(shù)據(jù)插入的過程中要保證值列表的順序與字段的順序一致毒租,避免出現(xiàn)數(shù)據(jù)放錯(cuò)位置稚铣。
思考:如何確保數(shù)據(jù)的插入操作是成功的呢?
引入:數(shù)據(jù)的插入操作本身可以通過執(zhí)行的反饋判定(受影響的行數(shù))墅垮,不過數(shù)據(jù)插入的目的是為了數(shù)據(jù)的查看惕医,因此可以使用數(shù)據(jù)查詢方式來檢驗(yàn)數(shù)據(jù)。
2.查詢數(shù)據(jù)【掌握】
定義:查詢數(shù)據(jù)算色,就是通過查詢SQL指令抬伺,從指定的數(shù)據(jù)表中,將數(shù)據(jù)獲取出來灾梦,以一種二維表的形式展示給用戶看
- 查看所有數(shù)據(jù):select * from 表名; #*號屬于通配符峡钓,表示匹配所有字段信息
mysql> select * from my_table;
+------------+------+-------+
| number | age | name |
+------------+------+-------+
| 0000000001 | 20 | Jim |
| 0000000002 | NULL | Tom |
| 0000000003 | 20 | Lily |
| 0000000004 | 18 | LiLei |
| 0000000005 | 28 | Lycy |
+------------+------+-------+
5 rows in set (0.11 sec)
- 查看指定字段數(shù)據(jù):select 字段名1,字段名2... from 表名;
mysql> select name,number from my_table;
+-------+------------+
| name | number |
+-------+------------+
| Jim | 0000000001 |
| Tom | 0000000002 |
| Lily | 0000000003 |
| LiLei | 0000000004 |
| Lycy | 0000000005 |
+-------+------------+
5 rows in set (0.36 sec)
注意:要查看的字段可以根據(jù)自己的需求選擇數(shù)量以及順序
- 匹配數(shù)據(jù)查看:在查詢數(shù)據(jù)的時(shí)候根據(jù)適當(dāng)?shù)臈l件篩選數(shù)據(jù):select 字段列表/* from 表名 where 條件表達(dá)式;
mysql> select * from my_table where age > 20; #查看年齡大于20的數(shù)據(jù)
+------------+------+------+
| number | age | name |
+------------+------+------+
| 0000000005 | 28 | Lycy |
+------------+------+------+
1 row in set (0.08 sec)
總結(jié):查詢操作是增刪改查操作中最為頻繁的一種,利用select 字段列表/* from 表名;可以實(shí)現(xiàn)對表中數(shù)據(jù)的基本查詢需求若河。
思考:數(shù)據(jù)查看后或者實(shí)際業(yè)務(wù)中需要對數(shù)據(jù)進(jìn)行修改的話能岩,該如何操作呢?
引入:數(shù)據(jù)的更新操作也是可以通過SQL指令來實(shí)現(xiàn)的
3.更新數(shù)據(jù)【掌握】
定義:更新數(shù)據(jù)牡肉,就是根據(jù)某些條件(可以沒有條件)對指定字段數(shù)據(jù)進(jìn)行更新操作捧灰。
- 更新全部數(shù)據(jù)的某個(gè)字段信息:update 表名 set 字段名 = 新值;
mysql> select * from my_table;
+------------+------+-------+
| number | age | name |
+------------+------+-------+
| 0000000001 | 20 | Jim |
| 0000000002 | NULL | Tom |
| 0000000003 | 20 | Lily |
| 0000000004 | 18 | LiLei |
| 0000000005 | 28 | Lycy |
+------------+------+-------+
5 rows in set (0.00 sec)
mysql> update my_table set age = 30; #全部更新
Query OK, 5 rows affected (0.11 sec)
Rows matched: 5 Changed: 5 Warnings: 0
mysql> select * from my_table;
+------------+------+-------+
| number | age | name |
+------------+------+-------+
| 0000000001 | 30 | Jim |
| 0000000002 | 30 | Tom |
| 0000000003 | 30 | Lily |
| 0000000004 | 30 | LiLei |
| 0000000005 | 30 | Lycy |
+------------+------+-------+
5 rows in set (0.00 sec)
注意:在實(shí)際操作中應(yīng)該盡量避免此類更新,這樣的更新會(huì)讓某些數(shù)據(jù)變得完全一樣统锤,從而失去實(shí)際價(jià)值毛俏。應(yīng)該根據(jù)具體的需求去更新對應(yīng)的記錄。
- 根據(jù)更新條件實(shí)現(xiàn)部分記錄更新:update 表名 set 字段 = 新值 where 條件表達(dá)式;
mysql> select * from my_table;
+------------+------+-------+
| number | age | name |
+------------+------+-------+
| 0000000001 | 30 | Jim |
| 0000000002 | 30 | Tom |
| 0000000003 | 30 | Lily |
| 0000000004 | 30 | LiLei |
| 0000000005 | 30 | Lycy |
+------------+------+-------+
5 rows in set (0.00 sec)
mysql> update my_table set age = 50 where name = 'Lily'; #Mysql中“=”號也有比較的意思饲窿,沒有“==”
Query OK, 1 row affected (0.43 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from my_table;
+------------+------+-------+
| number | age | name |
+------------+------+-------+
| 0000000001 | 30 | Jim |
| 0000000002 | 30 | Tom |
| 0000000003 | 50 | Lily |
| 0000000004 | 30 | LiLei |
| 0000000005 | 30 | Lycy |
+------------+------+-------+
5 rows in set (0.00 sec)
- 可以同時(shí)修改多個(gè)字段數(shù)據(jù):update 表名 set 字段1 = 新值1, 字段2 = 新值2 ... [where 條件表達(dá)式];
mysql> select * from my_table;
+------------+------+-------+
| number | age | name |
+------------+------+-------+
| 0000000001 | 30 | Jim |
| 0000000002 | 30 | Tom |
| 0000000003 | 50 | Lily |
| 0000000004 | 30 | LiLei |
| 0000000005 | 30 | Lycy |
+------------+------+-------+
5 rows in set (0.00 sec)
mysql> update my_table set age = 18,name = 'Jack' where number = '0000000001';
Query OK, 1 row affected (0.37 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from my_table;
+------------+------+-------+
| number | age | name |
+------------+------+-------+
| 0000000001 | 18 | Jack |
| 0000000002 | 30 | Tom |
| 0000000003 | 50 | Lily |
| 0000000004 | 30 | LiLei |
| 0000000005 | 30 | Lycy |
+------------+------+-------+
5 rows in set (0.00 sec)
總結(jié)
- 更新數(shù)據(jù)可以使用update 表名 set 字段=新值 where條件;來實(shí)現(xiàn)
- 更新過程中可以更新多個(gè)字段煌寇,也可以更新多條記錄
- 建議在更新的時(shí)候一定要通過條件來限定更新數(shù)據(jù)的量,除非特殊情況下需要更新全部數(shù)據(jù)逾雄。
思考:數(shù)據(jù)如果出錯(cuò)了阀溶,或者不要了腻脏,那么該怎么處理呢?
引入:首先银锻,所有的數(shù)據(jù)應(yīng)該都是由業(yè)務(wù)需求產(chǎn)生的永品,用戶操作記錄的。那么如果數(shù)據(jù)出現(xiàn)錯(cuò)誤击纬,也應(yīng)該是用戶來操作解決鼎姐。數(shù)據(jù)的刪除可以通過SQL刪除指令來完成。
4.刪除數(shù)據(jù)【掌握】
引入:刪除數(shù)據(jù)更振,就是將對應(yīng)數(shù)據(jù)所占據(jù)的行(多個(gè)列)清空還原到空白狀態(tài)
- 刪除全部數(shù)據(jù):delete from 表名炕桨;
mysql> delete from my_charset1;
Query OK, 0 rows affected (0.43 sec)
注意:數(shù)據(jù)刪除通常操作都是逐個(gè)刪除,真實(shí)業(yè)務(wù)不會(huì)出現(xiàn)全部刪除
- 刪除部分條件匹配數(shù)據(jù):delete from 表名 where 條件表達(dá)式;
mysql> select * from my_table;
+------------+------+-------+
| number | age | name |
+------------+------+-------+
| 0000000001 | 18 | Jack |
| 0000000002 | 30 | Tom |
| 0000000003 | 50 | Lily |
| 0000000004 | 30 | LiLei |
| 0000000005 | 30 | Lycy |
+------------+------+-------+
5 rows in set (0.00 sec)
mysql> delete from my_table where number = '0000000005';
Query OK, 1 row affected (0.08 sec)
mysql> select * from my_table;
+------------+------+-------+
| number | age | name |
+------------+------+-------+
| 0000000001 | 18 | Jack |
| 0000000002 | 30 | Tom |
| 0000000003 | 50 | Lily |
| 0000000004 | 30 | LiLei |
+------------+------+-------+
4 rows in set (0.00 sec)
總結(jié)
- 數(shù)據(jù)刪除操作的指令:delete from 表名 where ==條件表達(dá)式==;
- 該項(xiàng)操作卻是最需要注意的肯腕。因?yàn)閿?shù)據(jù)一旦刪除就無法找回献宫,因此在進(jìn)行數(shù)據(jù)刪除的時(shí)候需要特別小心確認(rèn)再操作。如果涉及到整表數(shù)據(jù)刪除实撒,一定要確保數(shù)據(jù)刪除的確認(rèn)通知姊途,并且要實(shí)現(xiàn)做好安全備份。