2.MySQL數(shù)據(jù)庫基本操作

思考: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ī)則比較簡單

  1. 語法環(huán)境:SQL執(zhí)行必須是在客戶端與服務(wù)端建立聯(lián)系(登錄驗(yàn)證通過進(jìn)入MySQL環(huán)境)之后才能被執(zhí)行的璧针,因此必須在進(jìn)入MySQL服務(wù)端之后嚷炉,客戶端才能給服務(wù)端發(fā)送指令
  2. 代碼執(zhí)行:SQL的執(zhí)行是服務(wù)器自動(dòng)判定執(zhí)行,而判定的標(biāo)準(zhǔn)就是檢測到語句結(jié)束符探橱。
  3. SQL代碼是順序逐行執(zhí)行的申屹。
  4. 語句結(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
  1. SQL指令關(guān)鍵字不區(qū)分大小寫
mysql> select host,user,authentication_string from mysql.user;
#最終執(zhí)行沒有區(qū)別
mysql> SELECT host,user,authentication_string FROM mysql.user;
  1. 注釋: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ù)庫

  1. 查看所有數(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給用戶使用的

  1. 查看部分?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'; #模糊匹配
  1. 數(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ù)庫信息隘膘。

  1. 創(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)
  1. 數(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)
  1. 數(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)的字符集蹋嵌。

  1. 數(shù)據(jù)庫創(chuàng)建指令執(zhí)行成功后,不只是會(huì)在查看時(shí)看到對應(yīng)數(shù)據(jù)庫葫隙,會(huì)在MySQL指定的存儲(chǔ)數(shù)據(jù)的目錄data下看到一個(gè)對應(yīng)名字的文件夾
創(chuàng)建數(shù)據(jù)庫效果.png

總結(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)字符集躬拢。

  1. 修改數(shù)據(jù)庫字符集:alter database 數(shù)據(jù)庫名字 charset 新字符集;
mysql> alter database my_project charset gbk;
Query OK, 1 row affected (0.04 sec)

  1. 數(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ù)器端不存在

  1. 刪除數(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)
  1. 數(shù)據(jù)庫刪除會(huì)直接清空該數(shù)據(jù)庫內(nèi)的所有內(nèi)容,而且不可找回掉房,因此一定要慎重(操作之前先做安全備份)
  2. 數(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
  1. 數(shù)據(jù)庫的刪除不只是在系統(tǒng)環(huán)境中看不到對應(yīng)的數(shù)據(jù)庫名字,對應(yīng)data目錄下的數(shù)據(jù)庫名字文件夾也會(huì)被清空
刪除數(shù)據(jù)庫效果.png

總結(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ù)字段的操作麻捻。

  1. 創(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>
  1. 數(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)

  1. 表選項(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ù)和索引

InnoDB和MyIsam存儲(chǔ)引擎.png

  1. 表選項(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)

  1. 表選項(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)

  1. 創(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)是無法生效的
MyIsam結(jié)構(gòu)復(fù)制.png
  1. 練習(xí):創(chuàng)建一張學(xué)生表和一張專業(yè)表掰派,學(xué)生表包含字段有:學(xué)生姓名从诲、性別、年齡靡羡、學(xué)號系洛、聯(lián)系方式、專業(yè)略步、家庭住址描扯,專業(yè)表包含字段有:專業(yè)名稱、專業(yè)編號趟薄、所屬學(xué)院绽诚。然后思考一下兩個(gè)表之間是否有聯(lián)系

總結(jié)

  1. 創(chuàng)建數(shù)據(jù)表是通過create table關(guān)鍵字創(chuàng)建

  2. 因?yàn)楸砗妥侄尾环旨遥侄卧贛ySQL中又是必須指定類型的杭煎,所以表恩够、字段名和字段類型是一起存在的

  3. 創(chuàng)建數(shù)據(jù)庫表必須指定數(shù)據(jù)庫,因?yàn)楸韺儆跀?shù)據(jù)庫管理

  4. 表選項(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)

  1. 查看全部已存在表: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)
  1. 查看部分匹配表名: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)
  1. 查看表結(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表示額外屬性(屬性)
  1. 查看表創(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é)

  1. show tables可以實(shí)現(xiàn)查看全部表或者匹配部分查看

  2. show create table能夠?qū)崿F(xiàn)表結(jié)構(gòu)的查看票从,方便我們?nèi)チ私獗淼慕Y(jié)構(gòu)并針對其進(jìn)行相應(yīng)的調(diào)整

  3. 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)容

  1. 更新表名魁蒜,表的名字可以修改: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ù)庫名字而已

  1. 更新表選項(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ù)后更不要輕易修改(尤其是字符集修改)。

  1. 修改表字段或者屬性脚作,這塊操作比較復(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)
  1. 修改字段位置:字段默認(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ù)也一并刪除,所以請確保安全(操作前備份)

  1. 練習(xí):在已創(chuàng)建的學(xué)生表中牍陌,增加愛好hobby擎浴、高中high_school字段和ID字段(放到第一個(gè)),然后修改hign_school為senior_school毒涧,并將位置放到hobby前(hobby前一個(gè)字段之后)贮预,最后刪除hobby字段

總結(jié)

  1. MySQL為表結(jié)構(gòu)提供了一套容錯(cuò)機(jī)制,允許在表創(chuàng)建后對字段進(jìn)行增刪改操作,這些操作主要是考慮到業(yè)務(wù)變化仿吞,之前設(shè)定的字段名滑频、字段類型或者屬性需要有對應(yīng)的修改
  2. 我們可以通過rename實(shí)現(xiàn)表名修改
  3. 可以通過alter table 表名 add/change/modify/drop實(shí)現(xiàn)表中字段的增刪改,從而可以全面的維護(hù)表結(jié)構(gòu)
  4. 不過唤冈,雖然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)行一次性刪除。

  1. 刪除表結(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ù)備份)

  1. 刪除表的時(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)
  1. 在項(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ù)。

  1. 新增一條完整數(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)
  1. 新增指定字段數(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)
  1. 新增多條記錄:可以是完整的或者指定字段的多條記錄: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
  1. 練習(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ù)獲取出來灾梦,以一種二維表的形式展示給用戶看

  1. 查看所有數(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)

  1. 查看指定字段數(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ù)量以及順序

  1. 匹配數(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)行更新操作捧灰。

  1. 更新全部數(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)的記錄。

  1. 根據(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)
  1. 可以同時(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é)

  1. 更新數(shù)據(jù)可以使用update 表名 set 字段=新值 where條件;來實(shí)現(xiàn)
  2. 更新過程中可以更新多個(gè)字段煌寇,也可以更新多條記錄
  3. 建議在更新的時(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)

  1. 刪除全部數(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)全部刪除

  1. 刪除部分條件匹配數(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é)

  1. 數(shù)據(jù)刪除操作的指令:delete from 表名 where ==條件表達(dá)式==;
  2. 該項(xiàng)操作卻是最需要注意的肯腕。因?yàn)閿?shù)據(jù)一旦刪除就無法找回献宫,因此在進(jìn)行數(shù)據(jù)刪除的時(shí)候需要特別小心確認(rèn)再操作。如果涉及到整表數(shù)據(jù)刪除实撒,一定要確保數(shù)據(jù)刪除的確認(rèn)通知姊途,并且要實(shí)現(xiàn)做好安全備份。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奈惑,一起剝皮案震驚了整個(gè)濱河市吭净,隨后出現(xiàn)的幾起案子睡汹,更是在濱河造成了極大的恐慌肴甸,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囚巴,死亡現(xiàn)場離奇詭異原在,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)彤叉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門庶柿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秽浇,你說我怎么就攤上這事浮庐。” “怎么了柬焕?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵审残,是天一觀的道長。 經(jīng)常有香客問我斑举,道長搅轿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任富玷,我火速辦了婚禮璧坟,結(jié)果婚禮上既穆,老公的妹妹穿的比我還像新娘。我一直安慰自己雀鹃,他們只是感情好幻工,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著黎茎,像睡著了一般会钝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上工三,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天迁酸,我揣著相機(jī)與錄音,去河邊找鬼俭正。 笑死奸鬓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的掸读。 我是一名探鬼主播串远,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼儿惫!你這毒婦竟也來了澡罚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肾请,失蹤者是張志新(化名)和其女友劉穎留搔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铛铁,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隔显,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饵逐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片括眠。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖倍权,靈堂內(nèi)的尸體忽然破棺而出掷豺,到底是詐尸還是另有隱情,我是刑警寧澤薄声,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布当船,位于F島的核電站,受9級特大地震影響奸柬,放射性物質(zhì)發(fā)生泄漏生年。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一廓奕、第九天 我趴在偏房一處隱蔽的房頂上張望抱婉。 院中可真熱鬧档叔,春花似錦、人聲如沸蒸绩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽患亿。三九已至传蹈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間步藕,已是汗流浹背惦界。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咙冗,地道東北人沾歪。 一個(gè)月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像雾消,于是被迫代替她去往敵國和親灾搏。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容