第一章:數據類型數值類型(整數類型、浮點數類型)日期時間類型字元串和二進位類型其他數據類型 *數值類型包括整數型和浮點型。 整數型數據:只能存儲整數!最常用的整型數據類型是INT型。 浮點型數據:可以存儲整數和小數,但都帶有小數點。最常用的浮點型數據類型是FLOAT型。*日期時間類型: 日期型:用於 ...
第一章:數據類型
數值類型(整數類型、浮點數類型)
日期時間類型
字元串和二進位類型
其他數據類型
*數值類型包括整數型和浮點型。
整數型數據:只能存儲整數!最常用的整型數據類型是INT型。
浮點型數據:可以存儲整數和小數,但都帶有小數點。最常用的浮點型數據類型是FLOAT型。
*日期時間類型:
日期型:用於保存日期。DATE
時間性:用於保存時間。TIME
日期時間型:用於保存日期與時間。DATETIME
註意:
日期與時間之間,需要使用空格分開。
日期型、時間型、日期時間型的數據,需要使用單引號括起來。
*字元串型:
CHAR類型:固定長度的字元串 當實際字元長度小於類型其長度時,後面用空格補全。
VARCHAR類型:可變長度的字元串 保存的是實際字元串的長度。
CHAR與VARCHAR長度範圍都是0~255之間的大小。
註意:
當字元串長度超過類型長度時,超出的字元將被刪除。(沒有了)
第二章、相關操作
mysql程式常用命令
選定預設資料庫:use dbname;
顯示所有資料庫:show databases;
顯示預設資料庫中所有表:show tables;
放棄正在輸入的命令:\c
顯示命令清單:\h
退出mysql程式:\q
查看MySQL伺服器狀態信息:\s
處理SQL文件
mysql命令
處理存放在文件里的SQL命令
格式:mysql [option] dbname < file.sql
mysql –u root –p --default-character-set=latin1 dbname < backup.sql
註:latin1是MySQL4.0的預設字元集或者utf-8是MySQL5.0的預設字元集,如果不知道使用什麼字元集的時候,可以選用這兩個其中一個
mysqladmin命令
完成許多系統管理任務,如創建或刪除一個資料庫、修改密碼等
格式:mysqladmin [option] admincommand
創建資料庫:mysqladmin –u root –p create newdb
刪除資料庫:mysqladmin –u root –p drop newdb
更改密碼:mysqladmin –u root –p password “newpasswd”
mysqldump命令
用於為資料庫創建備份
格式:mysqldump [option] dbname > bak.sql
mysqldump –u root –p tmpdb > backuptmp.sql
備份出來的是一個文本文件,預設為utf-8字元集,如果想使用另外一種字元集,必須使用 --default-character-set=gbk選項來設置
附加工具
MySQL CC http://www.mysql.com/products/mysqlcc/index.html對於MySQL,它是一個極好的前端查詢和資料庫管理工具。現有Windows,UNIX和Linux版本可用,並且Mac OS X 的版本現在也有
DBTOOL專業管理器,來自http://www.dbtools.com.br,是一個用於管理MySQL資料庫、表和索引的圖形客戶,其輸入來自其他RDBMS的數據,該管理器提供一個用於查詢和報告設計的介面。
註意:
不要直接刪除磁碟中的資料庫文件!否則會導致伺服器出錯!
此外,資料庫文件不能直接雙擊打開,也不能直接訪問。
該如何訪問資料庫中的數據?
使用資料庫伺服器(DBMS)進行訪問。
第三章、資料庫操作
查看當前伺服器中的所有資料庫(名稱):show databases;
查看資料庫的信息(創建語句):show create database 資料庫名稱;
修改資料庫的基本語法格式(修改預設字元集,即編碼):
ALTER database 資料庫名稱
default character set 編碼方式
collate 編碼方式_bin;
查看當前支持的字元集:show character set ;
刪除資料庫(包括該資料庫中所有信息):drop database 資料庫名稱;
小結
查看:show
show databases 查看當前伺服器中所有資料庫的名稱
show create database 查看指定資料庫的創建語句
show character set 查看所有字元集
show collation 查看所有校對規則
創建:create
修改:alter
刪除:drop
資料庫:database
第四章、數據表操作
查看與刪除數據表的操作
查看數據表的建立語句:SHOW CREATE table 表名;
查看當前資料庫中所有表:SHOW tables;
查看表中的欄位信息:DESCRIBE 表名;可簡寫為:DESC 表名;
刪除數據表:DROP table 表名;
註意:要創建表格,必須先選定資料庫
修改數據表
修改數據表的語法,與修改資料庫的語法類似:
ALTER database mydb
default character set gbk
collate gbk_bin;
ALTER table 表名
具體要修改的選項;
註意:修改數據表是指,修改表的結構,而不是修改表中的數據。
1)修改表名稱:
ALTER table 表名
rename [TO] 新表名;
註:[TO]為可選項,即可加可不加
2)修改欄位名:
ALTER table 表名
change 舊欄位名 新欄位名 新(原)數據類型;
3)修改欄位的數據類型:
ALTER table 表名
modify 欄位名 新數據類型;
4)添加欄位:
ALTER table 表名
add 新欄位名 數據類型;
5)刪除欄位:
ALTER table 表名
drop 欄位名 ;
6)修改欄位的排列位置:
ALTER table 表名
modify 欄位名1 數據類型 FIRST | AFTER 欄位名2 ;
小結
註意:修改數據表是指,修改表的結構,而不是修改表中的數據
1)修改表名 rename
2)修改欄位名(也可同時修改欄位的數據類型) change
3)修改欄位的數據類型 modify
4)添加欄位 add
5)刪除欄位 drop
6)修改欄位的排列位置 modify
第五章、約束
約束——用於實現數據完整性,數據完整性理解為:數據的有效性(正確性)。
資料庫完整性概述:
(1)實體完整性(行與行) 主鍵約束、外鍵約束
(2)域(欄位)完整性(各個欄位數值) 非空約束、預設值約束、檢查
(3)參照完整性(表與表) 外鍵約束
(4)用戶(自定義)完整性
約束的類型:
(1)主鍵約束
(2)外鍵約束
(3)非空約束
(4)唯一約束
(5)預設值約束
(6)檢查約束
1)主鍵約束(PRIMARY KEY)
用來唯一標識表中的一個列,一個表中主鍵約束最多只能有一個,不同的行上,主鍵值不能相等。
在創建表時設置聯合主鍵約束。聯合主鍵,即多個列聯合作為主鍵。這是,主鍵列的值不能同時都相等。
*修改表時添加主鍵約束
語法格式:
ALTER TABLE 表名
ADD CONSTRAINT 約束名 PRIMARY KEY(列名);
表名:要添加約束的表
約束名:由用戶指定,用於標識約束
列名:要添加主鍵約束的列
*修改表時刪除主鍵約束
語法格式:
ALTER TABLE 表名
DROP PRIMARY KEY;
註意:由於主鍵約束在一個表中只能有一個,因此不需要指定主鍵名就可以刪除。
2)外鍵約束( FOREIGN KEY )
外鍵是指引用另一個表中的一列或多列,被引用的列應該具有主鍵約束或唯一約束。
外鍵用於建立和加強兩個表數據之間的連接。
外鍵用於建立和加強兩個表數據之間的連接。
外鍵用於建立多個表之間的關係。
語法格式:
添加外鍵
ALTER TABLE 表名
ADD CONSTRAINT 約束名
FOREIGN KEY (外鍵欄位名) REFERENCES 外鍵表名(列名);
刪除外鍵
ALTER TABLE 表名
DROP FOREIGN KEY 外鍵名;
EG:ALTER TABLE student
ADD CONSTRAINT FK_ID
FOREIGEN KEY (gid) REFERENCES grade(id);
含義:在student表的gid列上建立一個外鍵約束,該約束是參照grade表的id欄位。
對錶添加數據時有什麼影響?
對於被參照的表grade:添加數據時無任何影響。
對於外鍵表student上的外鍵列gid:該列上的數據只能選擇被參照表grade上被參照列id中的數據。
簡單的說:student表上gid列中的數據,只能是grade表上id列中已有的數據。即,student表的gid外鍵依賴於grade表的id。
3)非空約束(NOT NULL)
用來限定數據表中的列必須輸入值。
*修改表時添加非空約束
語法格式:
ALTER TABLE 表名
MODIFY 列名 該列數據類型 NOT NULL ;
4)唯一約束(UNIQUE)
也是用來唯一標識表中列的,不同的行上,唯一鍵的值也不能相等與主鍵約束不同的是,在一張數據表中可以有多個唯一約束。
*修改表時添加唯一約束
語法格式:
ALTER TABLE 表名
ADD CONSTRAINT 約束名 UNIQUE(列名);
*刪除唯一約束
語法格式:
DROP INDEX 約束名 ON 表名
5)預設值約束(DEFAULT)
用來當不給表的列輸入值時,自動為該列指定一個值。
*修改表時添加預設值約束
語法格式:
ALTER TABLE 表名
ALTER 列名 SET DEFAULT 預設值 ;
*刪除預設值約束
語法格式:
ALTER TABLE 表名
ALTER 列名 DROP DEFAULT ;
小結
表創建後,再添加約束
主鍵約束
ALTER TABLE 表名
ADD CONSTRAINT 約束名 PRIMARY KEY(列名);
唯一約束
ALTER TABLE 表名
ADD CONSTRAINT 約束名 UNIQUE(列名);
非空約束
ALTER TABLE 表名
MODIFY 列名 該列數據類型 NOT NULL ;
預設約束
ALTER TABLE 表名
ALTER 列名 SET DEFAULT 預設值 ;
外鍵約束
ALTER TABLE 表名
ADD CONSTRAINT 約束名
FOREIGN KEY (外鍵欄位名) REFERENCES 外鍵表名(列名);
註意:約束名稱可以使用SHOW CREATE TABLE 表名;來查詢。
刪除約束
主鍵約束
ALTER TABLE 表名
DROP PRIMARY KEY;
唯一約束
DROP INDEX 約束名 ON 表名
非空約束
ALTER TABLE 表名
MODIFY 列名 該列數據類型 ;
預設約束
ALTER TABLE 表名
ALTER 列名 DROP DEFAULT ;
外鍵約束
ALTER TABLE 表名
DROP FOREIGN KEY 外鍵名;
第六章、索引
索引主要內容
1)索引的概念
資料庫的索引好比新華字典的音序表,它是對數據表中一列或多列的值進行排序後的一種結構,其作用就是提高表中數據的查詢速度。
2)索引的分類
(1)普通索引:基本索引類型
(2)唯一性索引:該索引所在欄位的值必須是唯一的
(3)全文索引:定義在字元串類型上的索引
(6)空間索引:只能創建在空間數據類型上
(4)單列索引:在單個欄位上創建的索引
(5)多列索引:在多個欄位上創建的索引
3)創建索引
*創建表時創建索引
基本語法格式:
CREATE TABLE 表名稱
(
欄位名 數據類型 [完整性約束條件],
欄位名 數據類型 [完整性約束條件],
…………
欄位名 數據類型 ,
[ UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
[索引名] (欄位名 [(長度)] [ASC | DESC] )
);
UNIQUE :唯一索引
FULLTEXT:全文索引
SPATIAL :空間索引
INDEX | KEY :表示索引,二選一即可
欄位名:要添加索引的欄位
長度:索引的長度
ASC | DESC :ASC為升序排序,DESC為降序排序,預設是ASC升序排序
*使用CREATE INDEX語句在已有表上創建索引
基本語法格式:
CREATE [ UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
ON 表名 (欄位名 [(長度)] [ASC | DESC] ) ] ;
*使用ALTER TABLE語句在已有表上創建索引
基本語法格式:
ALTER TABLE 表名
ADD [ UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
(欄位名 [(長度)] [ASC | DESC] ) ]
4)刪除索引
*使用ALTER TABLE語句在刪除索引
基本語法格式:
ALTER TABLE 表名
DROP INDEX 索引名;
*使用DROP INDEX語句在刪除索引
基本語法格式:
DROP INDEX 索引名 ON 表名 ;
5)查看表中的索引
SHOW INDEX FROM 表名;
第七章、數據的添加、更新和刪除
1)添加數據
*為表中添加記錄(數據)INSERT
語法:*INSERT [INTO] 表名 [(欄位列表)]
VALUES (值列表)
*INSERT [INTO] 表名
SET 欄位名1 = 值 ,欄位名2 = 值 , …………
同時添加多行數據
*INSERT [INTO] 表名 [(欄位列表)]
VALUES (值列表),(值列表),…………
註意:如果表名後面沒寫欄位名,則預設是向所有欄位添加值,另外字元串值應該用單引號‘ ’ 括起來。
如何知道數據是否已經插入到表中?使用查詢語句:select * from 表名;
如果表名後面沒寫欄位名,則預設是向所有欄位添加值,添加值的順序必須和欄位在表中定義的順序相同。
2)更新數據
註意:更新數據時指對錶中存在的記錄進行修改
語法:UPDATE 表名
SET 欄位名1 = 更新值,欄位名2 = 更新值,…………
[WHERE 更新條件]
敘述:
where 子句是判斷語句,用來設定條件,限制只更新滿足條件的行,如果不帶where子句,則更新所有行數據。可以一次修改多個行,多個列的數據。
3)刪除數據
語法:DELETE FROM 表名
[WHERE 刪除條件]
敘述:此語句刪除表中的行,如果不帶where子句,則刪除整個表中的記錄,但是表(表結構)不會被刪除。
*DELETE語句與TRUNCATE語句的區別
DELETE語句與TRUNCATE語句都能實現刪除表中所有數據的功能。
區別:
(1)DELETE語句是DML(數據操縱)語句,TRUNCATE語句是DDL(數據定義)語句。
(2)DELETE語句可以使用where子句來設定只刪除表中指定的數據,TRUNCATE語句只能用於刪除表中所有記錄(數據)。
(3)使用TRUNCATE語句刪除表中所有數據後,自動增加欄位( AUTO_INCREMENT )的預設初始值重新由1開始,而使用DELETE語句刪除表中所有記錄後,再次添加記錄時,自動增加欄位的值為刪除時該欄位的最大值加1。
(4)重要:TRUNCATE語句在本質上直接清空數據表,清空後數據不能恢復,DELETE語句在刪除數據前,會將刪除操作寫入操作日誌,數據可以恢復(在滿足某些條件時)。
第八章、單表查詢
查詢產生一個虛擬表,看到的是表形式顯示的結果,但結果並不真正存儲,每次執行查詢只是現從數據表中提取數據,並按照表的形式顯示出來
1)簡單條件查詢
SELECT語句的語法
SELECT [DISTINCT | DISTINCTROW | ALL] * | 欄位列表
[FROM 表名
[WHERE 查詢條件]
[GROUP BY 分組欄位名 [HAVING 分組過濾條件] ]
[ORDER BY 排序欄位名 [ASC | DESC] ]
[LIMIT [偏移量,] 記錄數]
[PROCEDURE procedure_name]
]
[DISTINCT | DISTINCTROW | ALL] :用於剔除重覆的記錄
"*| 欄位列表":需要查詢的欄位,“ * ”代表表中所有欄位
FROM 表名 :需要查詢的表名
[WHERE 查詢條件] :查詢條件
GROUP BY 分組欄位名 :用於將查詢結果按指定欄位進行分組統計
HAVING 分組過濾條件:對分組統計結果進行過濾的條件
[ORDER BY 排序欄位名 [ASC | DESC] ] :對查詢結果按照指定的欄位進行排序
[LIMIT [偏移量,] 記錄數] :用於限制查詢結果的數量(記錄數),[偏移量,] 可以設置查詢結果忽略(跳過)的記錄數
[PROCEDURE procedure_name]:查詢存儲過程返回的結果集數據
* 關係運算符
= :等於
> :大於
>= :大於或等於
< :小於
<= :小於或等於
<> :不等於
帶IN關鍵字的查詢
IN關鍵字用於判斷某個欄位的值是否在指定的集合中
集合中的數據使用小括弧“ ( ) ”括起來
帶BETWEEN …AND關鍵字的查詢
BETWEEN AND用於判斷某個欄位的值是否在指定的範圍內
空值查詢
空值(NULL)不同於0,也不同於空字元串!
where ... is (not) NULL;
帶DISTINCT關鍵字的查詢
表中的某些欄位的數據可能存在重覆的值,在查詢結果中也有可能有重覆的值,從而導致出現重覆的數據行
帶LINK關鍵字的查詢
使用LIKE可以進行模糊查詢。
通配符:下劃線 “ _ ”:代表一個任意字元
百分號 “ % ”:代表0個或多個任意字元
註意:通配符必須配合LIKE使用
如果在like模糊查詢中,字元串中需要使用_和%字元,則需要使用轉義字元,即在_和%字元加上反斜杠“ \ ” eg: where ... like ‘%\%%’ ;(包含%)
where ... like '';(*%,%*,*%*,%*% ->*代字母,字母開頭,字母結尾,開頭結尾,包含字母)
帶AND,OR關鍵字的多條件查詢
AND:而且(多個條件需要同時滿足,表達式才成立)
OR:或者(多個條件只需要滿足一個,表達式就成立)
提示:多個查詢條件,每個條件最好使用小括弧括起來
2)高級查詢
聚合函數
COUNT():返回某列的行數
SUM():返回某列的和
AVG():返回某列的平均值
MAX():返回某列的最大值
MIN():返回某列的最小值
上面的函數對一組(一列)數值進行統計,並返回唯一的一個數值(結果),所以這些函數被稱為聚合函數。
*COUNT()函數——計數
select COUNT( * )
from ...
where ...;
*SUM()函數——求和
select SUM( 欄位名)
from 表名 ;
*MAX()函數——求最大值
select MAX( 欄位名 )
from 表名 ;
*MIM()函數——求最小值
select MIN( 欄位名)
from 表名 ;
對查詢結果排序
SELECT [DISTINCT | DISTINCTROW | ALL] * | 欄位列表
[FROM 表名
[WHERE 查詢條件]
[ORDER BY 排序欄位名 [ASC | DESC] ]
]
[ORDER BY 排序欄位名 [ASC | DESC] ] :對查詢結果按照指定的欄位進行排序。
[ASC | DESC] :排序方式ASC 為升序, DESC為降序。預設是ASC 升序。
註意:ORDER BY在WHERE子句的後面
分組查詢
SELECT [DISTINCT | DISTINCTROW | ALL] * | 欄位列表
[FROM 表名
[WHERE 查詢條件]
[GROUP BY 分組欄位名 [HAVING 分組過濾條件] ]
[ORDER BY 排序欄位名 [ASC | DESC] ]
]
[GROUP BY 分組欄位名 [HAVING 分組過濾條件] ]
註意:各個子句的先後次序!
WHERE
GROUP BY
ORDER BY
使用LIMIT限制查詢結果的數量
查詢數據時,可能會返回很多條記錄,用戶可以使用LIMIT來限制查詢結果顯示的行數。例如分頁功能,也可以使用LIMIT來實現。
SELECT語句的語法
SELECT [DISTINCT | DISTINCTROW | ALL] * | 欄位列表
[FROM 表名
[WHERE 查詢條件]
[GROUP BY 分組欄位名 [HAVING 分組過濾條件] ]
[ORDER BY 排序欄位名 [ASC | DESC] ]
[LIMIT [偏移量,] 記錄數]
[PROCEDURE procedure_name]
]
[DISTINCT | DISTINCTROW | ALL] :用於剔除重覆的記錄
* | 欄位列表 :需要查詢的欄位,“ * ”代表表中所有欄位
FROM 表名 :需要查詢的表名
[WHERE 查詢條件] :查詢條件
GROUP BY 分組欄位名 :用於將查詢結果按指定欄位進行分組統計
HAVING 分組過濾條件:對分組統計結果進行過濾的條件
[ORDER BY 排序欄位名 [ASC | DESC] ] :對查詢結果按照指定的欄位進行排序
[LIMIT [偏移量,] 記錄數] :用於限制查詢結果的數量(記錄數),[偏移量,] 可以設置查詢結果忽略(跳過)的記錄數
[PROCEDURE procedure_name]:查詢存儲過程返回的結果集數據
註意:LIMIT同樣適用於UPDATE與DELETE語句
第九章、多表操作
*瞭解什麼是外鍵,會為表添加外鍵約束和刪除外鍵約束
*瞭解三種關聯關係,會向關聯表中添加和刪除數據
*學會使用交叉連接、內連接、外連接及複合條件連接查詢多表中的數據
*掌握子查詢,會使用IN、EXISTS、ANY、ALL關鍵字及比較運算符查詢多表中的數據
1)外鍵約束( FOREIGN KEY )
外鍵是指引用另一個表中的一列或多列,被引用的列應該具有主鍵約束或唯一約束。
外鍵用於建立和加強兩個表數據之間的連接。
外鍵用於建立和加強兩個表數據之間的連接。
外鍵用於建立多個表之間的關係。
語法格式:
添加外鍵
ALTER TABLE 表名
ADD CONSTRAINT 約束名
FOREIGN KEY (外鍵欄位名) REFERENCES 外鍵表名(列名);
刪除外鍵
ALTER TABLE 表名
DROP FOREIGN KEY 外鍵名;
EG:ALTER TABLE student
ADD CONSTRAINT FK_ID
FOREIGEN KEY (gid) REFERENCES grade(id);
* 含義:在student表的gid列上建立一個外鍵約束,該約束是參照grade表的id欄位。
*對錶添加數據時有什麼影響?
對於被參照的表grade:添加數據時無任何影響。
對於外鍵表student上的外鍵列gid:該列上的數據只能選擇被參照表grade上被參照列id中的數據。
簡單的說:student表上gid列中的數據,只能是grade表上id列中已有的數據。即,student表的gid外鍵依賴於grade表的id。
*對錶刪除數據時有什麼影響?
對於外鍵表(子表)student:刪除數據無任何影響。
對於被參照表(父表)grade:被刪除的數據不能是已經被student表參照(引用)的數據。
為表添加外鍵時,需要註意的問題:
(1)建立外鍵的表以及被參照的表的表類型必須是InnoDB型。
(2)定義外鍵名時,不能加引號。見書本P124。
註意:MySQL創建表時預設的表類型為MYISAM!
多學一招:添加外鍵約束的參數說明
P125,表5-1(所謂的關聯操作)
CASCADE:刪除包含與刪除鍵值有參照關係的所有記錄
SET NULL:修改包含與刪除鍵值有參照關係的所有記錄,刪除時修改為NULL
NO ACTION:不進行任何操作
RESTRICT:拒絕主表刪除或修改外鍵關聯列
2)操作關聯表
關聯關係:
*多對一
最常見的關係。例如:一個班對於多名同學
*多對多
例如:多名學生,多門課程, 一個學生可以選修多門課程,一門課程也可以被多名學生選修。
*一對一
(1)添加數據
(2)刪除數據
3)連接查詢
(1)交叉連接 CROSS JOIN
select * from 表1 CROSS JOIN 表2
交叉連接返回的結果是被連接的兩個表中所有數據行的笛卡爾積。
(2)內連接 INNER JOIN
內連接(inner join)又稱簡單連接或自然連接,是最常見的連接查詢。
內連接只列出與連接條件匹配的數據行。
內連接的兩個表可以是同一個表,這種連接稱為自連接
簡單地說,內連接查詢的結果是對交叉連接的結果按連接條件進行過濾後,得到的結果。
select * from 表1 [INNER] JOIN 表2 ON 連接條件
eg select * from department INNER JOIN employee
ON department.did = employee.did ;
eg select department.did, department.dname, employee.name
from department INNER JOIN employee
ON department.did = employee.did ;
eg select department.did, department.dname, employee.name
from department , employee
WHERE department.did = employee.did ;
*為表指定別名:
eg select p2.did , p2.name , p1.dname
from department as p1 JOIN employee as p2
ON p1.did = p2.did ;
eg select p2.did , p2.name , p1.dname
from department p1, employee p2
WHERE p1.did = p2.did ;
eg 為內連接添加查詢條件:查詢王紅的所有個人資料和部門資料
select p1.* , p2.*
from department p1 JOIN employee p2 ON p1.did = p2.did
WHERE p2.name = '王紅';
eg 找出王紅所在的部門的所有員工的資料
select p1.*
from employee p1 JOIN employee p2 ON p1.did = p2.did
WHERE p2.name = '王紅';
(3)外連接
外連接分兩種:
a.LEFT JOIN(左連接):在內連接的基礎上,返回左表中不符合連接條件的記錄(即返回左表中所有的記錄)
b.RIGHT JOIN(右連接):在內連接的基礎上,返回右表中不符合連接條件的記錄(即返回右表中所有的記錄)
註意:多表查詢時,應該明確指定每個欄位所在的表。格式為:表名.欄位名
*左連接LEFT JOIN
*右連接REGHT JOIN
*全連接FULL JOIN
*外連接必定是兩個表的連接查詢,這兩個表分別為左表與右表
*外連接的結果不僅包含符合連接條件的數據,還允許查詢結果包含不符合連接條件的數據。
*簡單地說,外連接的查詢結果就是在內連接查詢結果的基礎上,加上左表或右表中不符合連接條件的數據。
select * from 表1 LEFT JOIN 表2 ON 連接條件
select * from 表1 RIGHT JOIN 表2 ON 連接條件
(4)複合條件連接查詢
使用order by 子句對連接查詢結果排序
4)子查詢
子查詢是指一個查詢語句嵌套在另一個查詢語句內部的查詢。
一個查詢可以嵌套在SELECT、SELECT……INTO、INSERT……INTO等語句中。
IN:集合判斷運算符
EXISTS:存在測試運算符
ANY:部分滿足
ALL:全部滿足
帶IN關鍵字的子查詢
內層(嵌套)的子查詢僅返回一個欄位的數據,這些數據可以看成是一個集合。
IN關鍵字就是判斷某個欄位(did)的值是否在這個集合中
帶EXISTS關鍵字的子查詢
EXISTS(單目運算符),測試後面的子查詢是否存在數據。
TRUE:子查詢的查詢結果存在數據
FALSE:子查詢的查詢結果不存在數據,即查詢結果為空集
帶ANY關鍵字的子查詢
ANY關鍵字表示結果集中任意一個數據滿足條件即代表條件成立
帶ALL關鍵字的子查詢
ALL關鍵字表示結果集中所有數據都滿足條件,條件才算成立
*eg: 例5-8 查詢存在年齡為20歲的員工的部門
select * from department
where did IN ( select did from employee where age = 20 );
*eg: 例5-10 查詢employee表中是否存在齡大於21歲的員工,如果存在,則查詢department表中的所有記錄
select * from department
where EXISTS ( select did from employee where age > 21 );
*eg: 例5-11
select * from department
where did >ANY ( select did from employee);
select * from employee
where age = ANY ( select age from employee where did=1);
*eg: 例5-12
select * from department
where did >ALL ( select did from employee);
*eg: 查詢出所有年齡比員工的平均年齡小的員工信息。
select * from employee
where age > ( select avg(age) from employee);
如何知道平均年齡?select avg(age) from employee;
如何組合?
例如:要查詢出所有年齡小於21的員工信息,怎麼做?
select * from employee
where age < 21;
*eg: 查詢出年齡最小(大)的員工的信息。
最小年齡:select min(age) from employee;
最大年齡:select max(age) from employee;
select * from employee
where age= ( select max(age) from employee);
第十章、多表查詢
函數(列表)
數學函數
ABS(x):返回x的絕對值
SQRT(x):返回x的平方根
ROUND(x,y):對x進行四捨五入,保留y為小數
CONCAT(…):將各個欄位使用下劃線連接起來
為表和欄位取別名
查詢數據時,可以為表和欄位取別名。
為表取別名:
select * from 表名 AS 別名
為欄位取別名:
select 欄位名 [AS] 別名 from 表名 AS 別名
欄位的別名可以直接顯示在查詢結果中
第十一章、視圖
*瞭解視圖的概念,能夠簡述視圖的特點
*掌握視圖的創建方式,學會在單表和多表上創建視圖
*掌握視圖數據的查看、修改、更新以及刪除
1)視圖概述
視圖是從一個或多個基本表中導出來的表,它是一種虛擬存在的表,並且表的結構和數據依賴於基本表。
通過視圖不僅可以看到存放在基本表中的數據,並且還可以像操作基本表一樣,對視圖中存放的數據進行查詢、修改和刪除。
與直接操作基本表相比,視圖具有以下優點:
(1)簡化查詢語句
(2)安全性
(3)邏輯數據獨立性
視圖是虛擬的表!
(1)使用上與表基本一樣
(2)但視圖並不真正存儲數據,視圖的中數據歸根結底是存儲在對應的基本表中的。
2)視圖管理
創建視圖的語法:
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW 視圖名稱 [(欄位列表)]
AS
SELECT查詢語句
[ WITH [CASCADED | LOCAL] CHECK OPTION ];
註:SELECT查詢語句 的結果,就是該視圖中的內容(包括視圖的結構和數據)
創建視圖的基本語法:
CREATE VIEW 視圖名稱
AS SELECT查詢語句 ;
註:SELECT查詢語句 的結果,就是該視圖中的內容(包括視圖的結構和數據)
提示:創建視圖的其他選項一般使用預設值即可。
*eg: 例7-1
create view view_stu
as select math, chinese, math+chinese from student;
創建視圖時為視圖指定欄位名的基本語法:
CREATE VIEW 視圖名稱(視圖的欄位名)
AS SELECT查詢語句 ;
*eg: 例7-2 為視圖自定義欄位名稱
create view view_stu2 (math , chin , sum)
as select math, chinese, math+chinese from student;
*eg: 例7-3 在多表上創建視圖
create view view_class (id , name , class)
as select student.s_id, student.name , stu_info.class
from student INNER JOIN stu_info
ON student.s_id = stu_info.s_id;
select * from view_class;
查看視圖
* NULL:表示該列是否允許存儲NULL值
* Key:表示該列是否帶有索引
* Default:表示該列是否帶有的預設值
* Extra:表示該列的附加信息
查看表的結構:DESCRIBE 表名稱
查看視圖的結構:DESCRIBE 視圖名稱 可簡寫為:DESC 視圖名稱
*eg: DESC view_stu
查看表的基本信息:SHOW TABLE STATUS LIKE '表名稱'\G
查看視圖的基本信息:SHOW TABLE STATUS LIKE '視圖名稱'\G
*eg: 例7-5 查看stu_classs視圖的基本信息
SHOW TABLE STATUS LIKE ' stu_classs '\G
查看表的創建語句:SHOW CREATE TABLE 表名稱
查看視圖的創建語句:SHOW CREATE VIEW 視圖名稱
*eg: 例7-6 查看stu_classs視圖的基本信息
SHOW CREATE VIEW stu_classs
修改視圖結構
修改視圖的基本語法:
CREATE OR REPLACE VIEW 視圖名稱
AS SELECT查詢語句 ;
OR REPLACE :表示新建的視圖替換已有的視圖
註意:修改視圖結構時,所使用的SELECT查詢語句,必須是完整的查詢語句!
提示:修改後的視圖,其內容可以與原有的視圖沒有任何關聯。
*eg: 創建一個視圖myview,內容包含student表中所有同學的學號與姓名。
CREATE VIEW myview
AS select s_id , name from student;
修改視圖的 另一種語法:
ALTER VIEW 視圖名稱
AS SELECT查詢語句 ;
更新視圖(對視圖中的數據進行修改)
可以對視圖中的數據進行更新,其操作包括修改、插入、刪除數據。
對視圖數據的操作與對錶數據的操作基本一樣。
因為視圖是一個虛擬的表,並不會保存數據,所以,更新視圖中的數據,歸根結底就是更新其基本表中的數據進行更新!
既然視圖中沒有保存數據,那麼視圖中保存的是什麼?
視圖中只保存了該視圖的定義,即這個視圖對應的查詢語句。
當用戶訪問一個視圖時,MySQL伺服器會根據這個視圖的定義(其查詢語句)實時地去查詢基本表,得到相應的結果集,然後再將結果集呈現給用戶。
更新視圖時,需要註意,並不是所有的視圖都能執行更新視圖的操作!
當視圖中包含如下內容時,視圖的更新操作將不能被執行:
(1)視圖中包含基本表中被定義為非空的列(不能添加、修改)
(2)視圖的數據為數學表達式的結果(不能添加、修改)
(3)視圖中的數據使用了聚合函數(不能添加、修改、刪除)
(4)定義視圖的SELECT語句中使用DISTINCT,UNION,TOP,GROUP BY 或HAVING子句。(不能添加、修改、刪除)
刪除視圖
刪除視圖的基本語法:
DROP VIEW [IF EXISTS] 視圖名稱;
IF EXISTS:加入視圖存在的話,則刪除;如果不存在,則什麼都不做。
*eg: 例7-12 刪除view_stu2視圖
DROP VIEW view_stu2;
使用IF EXISTS則不會因為視圖已經刪除,而出現錯誤
DROP VIEW IF EXISTS view_stu2;
第十二章、事務與存儲過程
*瞭解事務的概念,會開啟、提交和回滾事務
*掌握事務的4種隔離級別
*學會創建存儲過程
*掌握調用、查看、修改和刪除存儲過程
1)事務
(1)事務概念
事務處理機制在程式開發過程中有著非常重要的作用,它可以使整個系統更加安全,保證在同一個事務中的操作具有同步性。
所謂事務就是針對資料庫的一組操作,它可以由一條或多條SQL語句組成,同一個事務的操作具備同步的特點,如果其中有一條語句無法執行,那麼所有的語句都不會執行,也就是說,事務中的語句要麼都執行,有麽都不執行。
(2)事務的操作:
開啟事務:START TRANSACTION
提交事務:COMMIT
回滾事務:ROLLBACK
註意:MySQL中直接書寫的語句都是自動提交的,而事務中的操作語句都需要使用COMMIT語句手動提交。
ROLLBACK語句只能針對未提交的事務執行回滾操作,已提交的事務是不能回滾的。
事務的4個特性:
*原子性
一個事務必須被視為一個不可分割的最小工作單元。(事務中的操作,要麼全部執行,要麼全部不執行)
*一致性
事務將資料庫從一種狀態轉變為下一種一致的狀態。
*隔離性
還稱為併發控制、可串列化、鎖等。
當多個用戶併發訪問資料庫時,資料庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個併發事務之間要相互隔離
*持久性
事務一旦提交,其所做的修改就會永久保存到資料庫中,即使資料庫發生故障也不應該對其有任何影響。
事務的提交:事務中的操作,需要提交後才能執行成功。提交事務:COMMIT
事務的回滾:在操作一個事務時,如果發現當前事務中的操作是不合理的,就可以通過回滾來取消當前事務。回滾事務:ROLLBACK
(3)事務的隔離級別:資料庫是多線程併發訪問的,所以很容易出現多個線程同時開啟事務的情況,這樣就會出現臟讀、重覆讀以及幻讀的情況,為了避免這種情況的發生,就需要為事務設置隔離級別。
MySQL中,事務有4中隔離級別:
READ UNCOMMITTED(讀未提交)
事務中的最低級別,該級別的事務可以讀取另一個事務中未提交的數據,也被稱為臟讀,這是相對危險的。
READ COMMITTED(讀提交)
大多數的資料庫管理系統的預設隔離級別,該級別下的事務只能讀取其他事務已經提交的內容。
REPEATABLE READ(可重覆讀)
是MySQL預設的事務隔離級別,可以避免臟讀、不可重覆讀的問題,確保同一事務的多個實例在併發讀取數據時,會看到同樣的數據。
SERIALIZABLE(可串列化)
是事務的最高隔離級別,它會強制對事務進行排序,使之不會發生衝突,從而解決臟讀、幻讀、重覆讀的問題。
2)存儲過程
(1)存儲過程的創建
在開發過程中,經常會遇到重覆使用某一功能的情況,為此,MySQL引入了存儲過程。
存儲過程就是一條或多條SQL語句的集合,當對資料庫進行一系列複雜操作時,存儲過程可以將這些複雜操作封裝成一個代碼塊,以便重覆使用,大大減少資料庫開發人員的工作量。
(2)創建存儲過程
創建存儲過程的基本語法:
CREATE PROCEDURE 存儲過程名稱 (參數列表)
BEGIN
存儲過程內容
END
參數可以分三種:
IN:輸入參數
OUT:輸出參數
INOUT:輸入輸出參數
由於存儲過程會包含多條SQL語句,而SQL語句預設是以分號“;”結束,所以,創建存儲過程的結束語句不能是分號,在創建存儲過程之前,必須先重新定義MySQL的結束符。
例:將兩個斜杠“//”定義為MySQL語句的結束符
DELIMITER //
註意:定義完後,直接輸入的MySQL語句,都需要使用“//”作為結束符,而不再是分號“;”
可以使用以下語句將結束符重新設置為分號“;”
DELIMITER ;
註意:分號前需要添加空格!
例6-2 創建一個查看student表所有內容的存儲過程
delimiter //
create procedure Proc()
begin
select * from student;
end //
delimiter ;
例6-12 創建一個存儲過程,查看student表中指定性別同學的人數
delimiter //
create procedure CountProc1( IN s_gender varchar(50),
OUT num int)
begin
select count(*) into num
from student
where gender = s_gender;
end //
delimiter ;
(3)變數的使用
存儲過程中可以定義變數,基本語法是:
DECLARE 變數名稱 變數數據類型 [DEFAULT 初始值 ]
例:定義一個整數(INT)變數,名稱為myvariable,初始值為100
DECLARE myvariable INT DEFAULT 100
a.變數的賦值:
SET 變數名稱 = 數值
例:設置myvariable的值為150
SET myvariable = 150
例:
DECLARE var1, var2 , var3 INT;
SET var1 = 10 , var2 = 20;
SET var3 = var1 + var2;
創建一個存儲過程,計算兩個整數的和,並將結果由參數返回
delimiter //
create procedure Proc1( IN a int , IN b int , OUT c int)
begin
SET c = a + b;
end //
delimiter ;
調用存儲過程計算5,22的和:
call Proc1(5, 22,@x);
查看結果:
select @x;
3)流程式控制制語句的使用
分支語句:
IF
THEN
ELSE
END IF;
迴圈語句:
WHILE
END WHILE;
創建一個存儲過程,計算比較兩個整數的大小,並將較大的數由參數返回
delimiter //
create procedure Proc2( IN a int , IN b int , OUT c int)
Begin
end //
調用存儲過程:
call Proc2(15, 33,@x);
查看結果:
select @x;
delimiter //
create procedure Proc2( IN a int , IN b int , OUT c int)
Begin
IF a >= b
THEN SET c = a;
ELSE SET c = b;
END IF;
end //
調用存儲過程:
call Proc2(15, 33,@x);
查看結果:
select @x;
創建一個存儲過程,計算計算兩個整數的範圍內,所有整數的和,並將結果由參數返回
create procedure Proc3( IN a int , IN b int , OUT c int)
Begin
end //
調用存儲過程:
call Proc3(1, 100,@x);
查看結果:
select @x;
create procedure Proc3( IN a int , IN b int , OUT c int)
Begin
DECLARE s INT DEFAULT 0;
DECLARE i INT ;
SET i = a;
WHILE i <= b DO
SET s = s + i;
SET i = i + 1;
END WHILE;
SET c = s;
end //
調用存儲過程:
call Proc3(1, 100,@x);
查看結果:
select @x;
4)修改存儲過程
修改存儲過程的基本語法:
ALTER PROCEDURE 存儲過程名稱
存儲過程屬性 ;
註意:MySQL不能修改存儲過程的代碼,只能修改存儲過程的許可權等屬性。如果一定要修改存儲過程代碼,必須先將存儲過程刪除之後,再重新創建一個新的存儲過程。
5)刪除存儲過程
刪除存儲過程的基本語法:
DROP PROCEDURE 存儲過程名稱 ;
註意:MySQL不能修改存儲過程的代碼,只能修改存儲過程的許可權等屬性。如果一定要修改存儲過程代碼,必須先將存儲過程刪除之後,再重新創建一個新的存儲過程。
第十三章、資料庫的高級操作
*學會對資料庫中的數據進行備份和還原操作
*學會在資料庫中創建、刪除用戶
*學會對資料庫中的許可權進行授予、查看和收回操作
1)數據備份
使用mysqldump命令可以對資料庫進行備份。
可以備份單個資料庫、多個資料庫或者所有資料庫。
註意:mysqldump是系統命令,並非MySQL語句,所以並非在MySQL控制臺中執行,而是在系統
命令提示符視窗中執行。
mysqldump命令備份數據表的基本語法:
mysqldump -u用戶名 –p密碼 資料庫名稱 [表名稱] >文件名稱
mysqldump命令備份資料庫的基本語法:
mysqldump -u用戶名 –p密碼 --database 資料庫名稱 >文件名稱
mysqldump命令備份伺服器中所有資料庫的基本語法:
mysqldump -u用戶名 –p密碼 --all-databases >文件名稱
例8-1 將資料庫chapter08中的所有數據表備份到文件myfile.sql中,用戶名為root,密碼為itcast。
mysqldump –uroot –pitcast chapter08 > myfile.sql
mysqldump –uroot –pitcast chapter08 > c:\myfile.sql
註意: -uroot 的-u與用戶名、 –pitcast 的-p與密碼,之間都不需要加空格
例 將資料庫chapter08的整個資料庫數據備份到文件myfile.sql中,用戶名為root,密碼為itcast。
mysqldump -uroot –pitcast --database chapter08 >myfile.sql
註意: -uroot 的-u與用戶名、 –pitcast 的-p與密碼,之間都不需要加空格。
如果是空密碼或者是不立即輸入密碼,-p後面不需要任何內容。
例 將伺服器中所有資料庫備份到文件myfile.sql中,用戶名為root,密碼為itcast。
mysqldump -uroot -pitcast --all-databases >myfile.sql
2)數據還原
mysql命令還原數據的基本語法:
mysql -u用戶名 –p密碼 [資料庫名稱] <文件名稱
若已使用下列語句備份了chapter08資料庫中所有的表:
mysqldump -u root–pitcast chapter08 > myfile.sql
例 利用文件myfile.sql還原資料庫chapter08中的表,用戶名為root,密碼為itcast。
mysql -uroot –pitcast chapter08 < myfile.sql
mysql命令還原整個或者多個資料庫的基本語法:
mysql -u用戶名 –p密碼 <文件名稱
註意:還原整個資料庫或者多個資料庫不需要註明資料庫名稱。
若已使用下列語句備份了整個chapter08資料庫:
mysqldump -uroot –pitcast --database chapter08 >myfile.sql
利用文件myfile.sql還原整個資料庫chapter08,用戶名為root,密碼為itcast。
mysql -uroot –pitcast < myfile.sql
另一種還原方法,登陸到mysql伺服器,使用source語句進行還原。
source語句命令還原數據的基本語法:
source 文件名稱
利用文件myfile.sql還原數據
source myfile.sql
3)用戶管理
每個軟體都會對用戶信息進行管理。
MySQL中的用戶分為root用戶和普通用戶,root用戶為超級管理員,具有所有許可權,如創建用戶,刪除用戶,管理用戶等,而普通用戶只擁有被賦予的某些許可權。
MySQL安裝完成後,伺服器中會有一個系統資料庫——mysql。該資料庫保存著所有的系統數據。
該資料庫中的user表是最重要的一個表,記錄了允許連接到伺服器的賬號(用戶)信息以及一些全局級的許可權信息,通過操作該表就可以對這些信息進行修改。
User表共有42個欄位,這些欄位大致可分如下4類:
1.用戶列
包括Host、User、Password欄位,分別代表主機名、用戶名和密碼
2.許可權列
包括Select_priv 、 Insert_priv、 Update_priv等以priv結尾的欄位,這些欄位決定了用戶對應的許可權。
3.安全列
用於管理用戶的安全信息。例如,是否支持加密等。
4.資源控制列
用戶限制用戶使用的資源。例如,每小時操作的次數。
A.創建普通用戶
1.使用GRANT語句創建用戶
GRANT語句不僅可以創建用戶,還可以對用戶進行授權,該語句會自動載入許可權表,不需要手動刷新,而且安全、準確、錯誤少,使用GRANT語句創建用戶是最常用的方法。
GRANT的語法格式:
GRANT 許可權 ON 表名
TO 用戶 [IDENTIFIED BY [密碼] ]
例如:創建一個新用戶,用戶名為user1,密碼為123,並授予該用戶對chapter08.student表的查詢許可權
GRANT select ON chapter08.student
TO 'user1'@'localhost' IDENTIFIED BY '123‘
註意: ‘user1’@‘localhost’表示該用戶可以通過本地站臺(localhost)進行登陸,併進行操作。
創建用戶後,可以查詢mysql資料庫中的user表驗證用戶信息是否已經加入。註意:密碼是加密保存的字元串。
2.使用CREATE USER語句創建用戶
使用CREATE USER語句創建用戶是,伺服器會自動修改相應的授權表,但需要註意的是,該語句創建的用戶是沒有任何許可權的。
CREATE USER的語法格式:
CREATE USER 用戶名 [IDENTIFIED BY [密碼] ]
例如:創建一個新用戶,用戶名為user2,密碼為123
CREATE USER 'user2'@'localhost' IDENTIFIED BY '123'
註意: ‘user2’@‘localhost’表示該用戶可以通過本地站臺(localhost)進行登陸,併進行操作
3.使用INSERT 語句創建用戶(不推薦使用)
其實,創建用戶在本質上就是在user表中添加一條記錄,所以,也可以使用INSERT語句直接在表中添加一條記錄,也可以達到添加用戶的目的。
INSERT語句的基本語法:
INSERT INTO 表名(需指定內容的欄位列表)
VALUES (數值列表);
例如:創建一個新用戶,用戶名為user3,密碼為123
INSERT INTO mysql.user (Host , User ,Password ,ssl_cipher ,x509_issuer ,x509_subject)
VALUES (‘localhost’ ,’user3’,PASSWORD(‘123’),’’,’’,’’);
註意:PASSWORD是一個系統函數,PASSWORD(‘123’)的作用是將密碼’123‘進行加密。因為保存在user表中的密碼必須經過加密,所以添加的密碼必須經過加密,否則該用戶的密碼將無法正確保存。
B.刪除普通用戶
1.使用DROP USER語句刪除用戶
DROP USER語句的基本語法:
DROP USER 用戶名
例如:刪除用戶user1
DROP USER ’user1’@’localhost’
2.使用DELETE語句刪除用戶(不推薦使用)
DELETE FROM 表名
WHERE 要刪除的用戶名
例如:刪除用戶user2
DELETE FROM mysql.user
WHERE host = ‘localhost’ AND user =‘user2’
C.修改用戶密碼
1.修改root用戶的密碼
2.root用戶修改普通用戶的密碼
3.普通用戶修改密碼
1.修改root用戶的密碼
使用系統命令mysqladmin
mysqladmin -u 用戶名 [-h 主機名] –p password 新密碼
使用UPDATE語句
UPDATE mysql.user
SET password = PASSWORD(‘新密碼’)
WHERE user = ’root‘ AND host = ’localhost‘;
使用SET語句
SET PASSWORD = PASSWORD(‘新密碼’)
2. root用戶修改普通用戶的密碼
使用GRANT語句
GRANT USAFE ON *.* TO ‘用戶名’@‘主機名’
IDENTIFIED BY [password] ‘新密碼’;
使用UPDATE語句
UPDATE mysql.user
SET password = PASSWORD(‘新密碼’)
WHERE user = ’root‘ AND host = ’localhost‘;
使用SET語句
SET PASSWORD FOR ‘用戶名‘@’主機名‘ = PASSWORD(‘新密碼’)
3.普通用戶修改密碼
使用SET語句
SET PASSWORD = PASSWORD(‘新密碼’)
4)許可權管理
1.mysql的許可權
參見P215,表8-2。
2.授予許可權
GRANT 許可權 ON 對象 TO ‘用戶名’@‘主機名’
3.查看許可權
SHOW GRANTS FOR ‘用戶名’@‘主機名’
4.收回許可權
REVOKE 許可權 ON 對象 FROM ‘用戶名’@‘主機名’
一、創建資料庫
創建資料庫
create database mydb
default character set gbk
collate 編碼方式_bin;
二、創建表
每個列的屬性之間,用“,”(逗號)分隔。
註意:是分隔,即最後一列後面,不用添加。
創建表
CREATE TABLE produtinfo
( id int,
proname varchar(20),
proprice float(5,2),
prodate date,
propic varchar(20),
proremarks varchar(50)
);
auto_increment自動編號
約束
創建表時設置主鍵約束 PRIMARY KEY
CREATE TABLE produtinfo
(
id int PRIMARY KEY,
proname varchar(20),
proprice float(5,2),
prodate datetime,
propic varchar(20),
proremarks varchar(50)
)
或
CREATE TABLE produtinfo
(
id int,
proname varchar(20),
proprice float(5,2),
prodate datetime,
propic varchar(20),
proremarks varchar(50),
PRIMARY KEY (id)
)
創建表時設置唯一約束 UNIQUE
CREATE TABLE 班級資料表
(
班號 int PRIMARY KEY,
專業 varchar(10),
班長 varchar(20),
班主任 varchar(20),
UNIQUE (專業)
);
創建表時設置非空約束 NOT NULL
CREATE TABLE 學生資料表
(
學號 int PRIMARY KEY,
姓名 varchar(20) NOT NULL,
性別 varchar(1) DEFAULT ‘男’ ,
出生日期 datetime,
籍貫 varchar(10),
班級 int
);
創建表時設置預設值約束 DEFAULT
CREATE TABLE 學生資料表
(
學號 int PRIMARY KEY,
姓名 varchar(20),
性別 varchar(1) DEFAULT ‘男’ ,
出生日期 datetime,
籍貫 varchar(10),
班級 int DEFAULT 201301
);
添加約束
主鍵約束 語法格式:
ALTER TABLE 表名
ADD CONSTRAINT 約束名 PRIMARY KEY(列名);
例子:
ALTER TABLE produtinfo
ADD CONSTRAINT PK_mypk PRIMARY KEY( id );
ALTER TABLE produtinfo
ADD CONSTRAINT PK_mypk PRIMARY KEY (id , proname );
唯一約束 語法格式:
ALTER TABLE 表名
ADD CONSTRAINT 約束名 UNIQUE(列名);
例子:
ALTER TABLE produtinfo
ADD CONSTRAINT UQ_myuq UNIQUE ( 專業 );
非空約束 語法格式:
ALTER TABLE 表名
MODIFY 列名 該列數據類型 NOT NULL ;
例子:
ALTER TABLE 學生資料表
MODIFY 性別 varchar(1) NOT NULL ;
預設值約束 語法格式:
ALTER TABLE 表名
ALTER 列名 SET DEFAULT 預設值 ;
例子:
ALTER TABLE 學生資料表
ALTER 性別 SET DEFAULT ‘男’ ;
查看當前支持的字元集 show character set ;
查看數據表的建立語句: SHOW CREATE table 表名;
查看當前資料庫中所有表: SHOW tables;
查看表中的欄位信息: DESCRIBE 表名;可簡寫為: DESC 表名;
查詢表中的所有數據: select * from 表名;
刪除資料庫(包括該資料庫中所有信息):
drop database 資料庫名稱;
刪除數據表:
DROP table 表名;
註意:要創建表格,必須先選定資料庫(USE 庫名)
刪除主鍵約束
語法格式:
ALTER TABLE 表名
DROP PRIMARY KEY;
例子:
ALTER TABLE produtinfo
DROP PRIMARY KEY;
由於主鍵約束在一個表中只能有一個,因此不需要指定主鍵名就可以刪除。
刪除唯一約束
語法格式:
DROP INDEX 約束名 ON 表名
例子:
DROP INDEX UQ_zy ON 班級資料表
刪除預設值約束
語法格式:
ALTER TABLE 表名
ALTER 列名 DROP DEFAULT ;
例子:
ALTER TABLE 學生資料表
ALTER 性別 DROP DEFAULT ;
修改數據表
1)修改表名稱: ALTER table 表名 rename [TO] 新表名;
註:[TO]為可選項,即可加可不加
例如:將表mytable的名稱改為my_table
ALTER table mytable
rename my_table ;
2)修改欄位名:ALTER table 表名
change 舊欄位名 新欄位名 新(原)數據類型;
例如:將mytable的欄位name改為stuname,該欄位原來的數據類型為CHAR(20)
ALTER table mytable
change name stuname CHAR(20);
如需在修改欄位名稱的同時,將該欄位的數據類型改為CHAR(12 )
ALTER table mytable
change name stuname CHAR(12);
3)修改欄位的數據類型:
ALTER table 表名
modify 欄位名 新數據類型;
例如:將mytable表的欄位name的數據類型改為CHAR(50)
ALTER table mytable
modify name CHAR(50);
4)添加欄位:
ALTER table 表名
add 新欄位名 數據類型;
例如:在mytable表中添加欄位new的數據類型改為VARCHAR(50)
ALTER table mytable
add new CHAR(50);
5)刪除欄位:
ALTER table 表名
drop 欄位名 ;
例如:將mytable表中的new欄位刪除
ALTER table mytable
drop new ;
6)修改欄位的排列位置:
ALTER table 表名
modify 欄位名1 數據類型 FIRST | AFTER 欄位名2 ;
例如:將mytable表中的name欄位修改為第一個欄位,即將其位置排在第一,
name欄位的數據類型為CHAR(20)
ALTER table mytable
modify new CHAR(20) first ;
例如:將mytable表中的name欄位的位置移動到欄位sex後面,name欄位的數據類型為CHAR(20)
ALTER table mytable
modify new CHAR(20) after sex;
三、添加、更新與刪除數據
1)
為表中添加記錄(數據)INSERT
語法:INSERT [INTO] 表名 [(欄位列表)]
VALUES (值列表)
舉例1:向student表中添加一條學生記錄(學生信息):
insert into student( id , name , grade)
values(1 , ’zhangsan’ , 98.5 ) ;
舉例2:再向student表中添加一條學生記錄(學生信息):
insert into student( name , grade , id )
values( ’lisi’ , 95 , 2 ) ;
為表中添加記錄時不指定欄位名
語法:INSERT [INTO] 表名 [(欄位列表)]
VALUES (值列表)
舉例3:再向student表中添加一條學生記錄(學生信息):
如果表名後面沒寫欄位名,則預設是向所有欄位添加值,
添加值的順序必須和欄位在表中定義的順序相同。
insert into student
values( 3, ’wangwu’ , 61.5 ) ;
為表中指定的部分欄位添加記錄
語法:INSERT [INTO] 表名 [(欄位列表)]
VALUES (值列表)
舉例4:再向student表中添加一條學生記錄(學生信息):
insert into student( id , name)
values( 4, ’zhaoliu’ ) ;
INSERT的其他寫法
語法:INSERT [INTO] 表名
SET 欄位名1 = 值 ,欄位名2 = 值 , …………
舉例7:再向student表中添加一條學生記錄(學生信息):
insert into student
set id = 5 , name = ‘boya’ , grade = 99 ;
INSERT的其他寫法:同時添加多行數據
語法:INSERT [INTO] 表名 [(欄位列表)]
VALUES (值列表),(值列表),…………
舉例8:向student表一次添加三條學生記錄(學生信息):
insert into student
values ( 6, ’lilei’ , 99 ) ,
( 7, ’hanmeimei’ , 100 ) ,
( 8, ’poly’ , 40.5 ) ;
舉例9:向student表一次添加三條學生記錄(指定欄位):
insert into student ( id , name )
values ( 9, ’liubei’ ) ,
( 10, ’guanyu’ ) ,
( 11, ’zhangsan’ ) ;
2)
更改記錄操作
語法:UPDATE 表名
SET 欄位名1 = 更新值,欄位名2 = 更新值,…………
[WHERE 更新條件]
敘述:
where 子句是判斷語句,用來設定條件,限制只更新滿足條件的行,如果不帶where子句,則更新所有行數據。
可以一次修改多個行,多個列的數據。
舉例:
將student表中的所有學生名稱為"Alex"的改為"Tom":
update student
set name=‘Tom’
where name= ‘Alex’;
例3-10:更改student表中id為1的記錄的name欄位與grade欄位的值:
UPDATE student
SET name = ‘caocao’, grade = 50
WHERE id = 1;