MySQL之MySQL服务的使用以及四种语言分类的DQL(查询),DML(操作), DDL(数据定义),TCL(事务控制)
目錄
前言
一,數據庫和SQL概述
1.簡介
2.相關概念(DB,DBMS,SQL)
3.MySQL服務的使用
二,DQL語言(查詢)
1.簡單查詢
2.條件查詢
3.排序查詢
4.分組查詢
5.多表查詢(★)
連接查詢(★)
子查詢(★)
分頁查詢(關鍵字limit)
聯合查詢(關鍵字union)
三,DML語言的學習(操作)
1.插入(insert)
2.修改(update)
3.刪除(delete)
四,DDL語言的學習(數據定義語言)
1.庫的管理:
2.表的管理:
3.常見的數據類型
4.常見的約束
5.標識列
五,TCL語言的學習(事務控制語言)Transaction Control Language
前言
學習數據庫是為了實現數據持久化使用完整的管理系統統一管理,易于查詢。
一,數據庫和SQL概述
1.簡介
數據庫:數據庫指的是長期存在計算機內、有組織、可共享的、大量數據的集合。數據是按照特定的數據模型來組織、存儲在數據庫中的。
2.相關概念(DB,DBMS,SQL)
①DB(數據庫database):存儲數據的”倉庫“,保存了一系列有組織的數據
②DBMS(數據管理系統Database ManagementSystem):用于管理DB中的數據
③SQL(結構化查詢語句StructureQueryLanguage):結構化查詢語言,用于和DBMS通信的語言(用于存取數據、查詢、更新和管理關系數據庫系統。)
? ? 特點:
? ? ? ? ? 1.不是某個特定數據庫供應商專有的語言,幾乎所有DBMS都支持SQL
? ? ? ? ??2.簡單易學
? ? ? ? ? 3.靈活使用其語言元素,可進行非常復雜和高級的數據庫操作
什么是MySQL?
MySQL是一個關系型數據庫管理系統,由瑞典MySQL AB 公司開發,屬于 Oracle 旗下產品。MySQL 是最流行的關系型數據庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關系數據庫管理系統) 應用軟件之一。在Java企業級開發中非常常用,因為 MySQL 是開源免費的,并且方便擴展。
?
3.MySQL服務的使用
①啟動和停止/登錄和退出
啟動和停止:
方式一:計算機——右擊管理——服務——MySQL ?
方式二:通過管理員身份運行cmd命令提示行 ?
net start mysql(啟動服務) ? net stop mysql(停止服務)
登錄和退出:
方式一:通過MySQL自帶的客戶端 ? 只限于root用戶
方式二:通過cmd命令提示行關閉,未配置MySQL環境變量,需在MySQL安裝的bin下啟動cmd
登錄: ? mysql 【-h主機名 -P端口號 】-u用戶名 -p密碼
退出: ? exit或ctrl+C
②語法規范
二,DQL語言(查詢)
1.簡單查詢
特點:1、查詢列表可以是字段、常量、表達式、函數,也可以是多個
? ? ? ? ? ?2、查詢結果是一個虛擬表
1)查詢到表中所有記錄:select * from 表名;
2)示例:
1、查詢單個字段
select 字段名 from 表名;
2、查詢多個字段
select 字段名,字段名 from 表名;
3、查詢所有字段
select * from 表名
4、查詢常量
select 常量值;
注意:字符型和日期型的常量值必須用單引號引起來,數值型不需要
5、查詢函數
select 函數名(實參列表);
6、查詢表達式
select 100/1234;
7、起別名
①as
②空格
8、去重
select distinct 字段名 from 表名;
9、+
作用:做加法運算
select 數值+數值; 直接運算
select 字符+數值;先試圖將字符轉換成數值,如果轉換成功,則繼續運算;否則轉換成0,再做運算
select null+值;結果都為null
10、【補充】concat函數
功能:拼接字符
select concat(字符1,字符2,字符3,...);
11、【補充】ifnull函數
功能:判斷某字段或表達式是否為null,如果為null 返回指定的值,否則返回原本的值
select ifnull(commission_pct,0) from employees;
12、【補充】isnull函數
功能:判斷某字段或表達式是否為null,如果是,則返回1,否則返回0
2.條件查詢
關鍵字:where
語法:
? ? ? ? select 查詢列表
? ? ? ? from 表名
? ? ? ? where 篩選條件
篩選條件的分類
1、簡單條件運算符
> < = <> != >= <= ?<=>安全等于
2、邏輯運算符
&& and
|| or
! ?not
3、模糊查詢
like:一般搭配通配符使用,可以判斷字符型或數值型
通配符:%任意多個字符,_任意單個字符
between and
in
is null /is not null:用于判斷null值
is null PK <=>
?? ??? ??? ?普通類型的數值?? ?null值?? ??? ?可讀性
is null?? ??? ?×? ? ? ? ? ? ? ? ? ? ? ? √? ? ? ? ? ?? ? ? √
<=>? ? ? ? ? √? ? ? ? ? ? ? ? ? ? ? ? ?√? ? ? ? ? ? ? ? ??×
例:
#1、按條件表達式篩選#案例1:查詢工資>12000的員工信息SELECT * FROMemployees WHEREsalary>12000;#2、按邏輯表達式篩選#案例1:查詢工資z在10000到20000之間的員工名、工資以及獎金 SELECTlast_name,salary,commission_pct FROMemployees WHEREsalary>=10000 AND salary<=20000; 3、模糊查詢 #案例1:查詢員工名中包含字符a的員工信息select * fromemployees wherelast_name like '%a%';#abc3.排序查詢
關鍵字:order by
語法:
? ? ? ? select 查詢列表
? ? ? ? from 表
? ? ? ? where 篩選條件
? ? ? ? order by 排序列表 【asc}desc】
特點:
1、asc :升序,如果不寫默認升序
? ? ?desc:降序
2、排序列表 支持 單個字段、多個字段、函數、表達式、別名
3、order by的位置一般放在查詢語句的最后(除limit語句之外)
例:
#1、按單個字段排序 SELECT * FROM employees ORDER BY salary DESC;#2、添加篩選條件再排序#案例:查詢部門編號>=90的員工信息,并按員工編號降序SELECT * FROM employees WHERE department_id>=90 ORDER BY employee_id DESC;#3、按表達式排序 #案例:查詢員工信息 按年薪降序SELECT *,salary*12*(1+IFNULL(commission_pct,0)) FROM employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;#4、按別名排序 #案例:查詢員工信息 按年薪升序SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY 年薪 ASC;#5、按函數排序 #案例:查詢員工名,并且按名字的長度降序SELECT LENGTH(last_name),last_name FROM employees ORDER BY LENGTH(last_name) DESC;#6、按多個字段排序#案例:查詢員工信息,要求先按工資降序,再按employee_id升序 SELECT * FROM employees ORDER BY salary DESC,employee_id ASC;4.分組查詢
關鍵字:where /having(后面均是篩選條件)
對比:
? ? ? ? ? ? ? ? ? ? 使用關鍵字?? ??? ?篩選的表?? ?位置
分組前篩選?? ?where?? ? ? ? ? ? ? ? 原始表?? ??? ?group by的前面
分組后篩選?? ?having?? ??? ?分組后的結果?? ?group by 的后面
語法:
? ? ? ?select 分組函數,分組后的字段
? ? ? ?from 表
? ? 【where 篩選條件】
? ? ? group by 分組的字段
? ? 【having 分組后的篩選】
? ? 【order by 排序列表】
特點:
? ? 1、可以按單個字段分組
? ? 2、和分組函數一同查詢的字段最好是分組后的字段
? ? 3、可以按多個字段分組,字段之間用逗號隔開
? ? 4、可以支持排序
? ? 5、having后可以支持別名
例:
#1.簡單的分組#案例1:查詢每個工種的員工平均工資 SELECT AVG(salary),job_id FROM employees GROUP BY job_id;#案例2:查詢每個位置的部門個數SELECT COUNT(*),location_id FROM departments GROUP BY location_id;#2、可以實現分組前的篩選#案例1:查詢郵箱中包含a字符的 每個部門的最高工資SELECT MAX(salary),department_id FROM employees WHERE email LIKE '%a%' GROUP BY department_id;#案例2:查詢有獎金的每個領導手下員工的平均工資SELECT AVG(salary),manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id;#3、分組后篩選#案例:查詢哪個部門的員工個數>5#①查詢每個部門的員工個數 SELECT COUNT(*),department_id FROM employees GROUP BY department_id;#② 篩選剛才①結果SELECT COUNT(*),department_id FROM employeesGROUP BY department_idHAVING COUNT(*)>5;#案例2:每個工種有獎金的員工的最高工資>12000的工種編號和最高工資SELECT job_id,MAX(salary) FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING MAX(salary)>12000;#案例3:領導編號>102的每個領導手下的最低工資大于5000的領導編號和最低工資manager_id>102SELECT manager_id,MIN(salary) FROM employees GROUP BY manager_id HAVING MIN(salary)>5000;#4.添加排序#案例:每個工種有獎金的員工的最高工資>6000的工種編號和最高工資,按最高工資升序SELECT job_id,MAX(salary) m FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING m>6000 ORDER BY m ;#5.按多個字段分組#案例:查詢每個工種每個部門的最低工資,并按最低工資降序SELECT MIN(salary),job_id,department_id FROM employees GROUP BY department_id,job_id ORDER BY MIN(salary) DESC;5.多表查詢(★)
為什么使用多表查詢?
當查詢中涉及到了多個表的字段,需要使用多表連接
select 字段1,字段2
from 表1,表2,...;
在學習多表查詢之前,先了解下笛卡爾乘積
?? ?* 產生原因:
? ? ? ? 1. 省略連接條件
? ? ? ? 2. 連接條件無效
? ? ? ? 3. 所有表中所有行互相連接
?? ?* 解決方案:
?? ??? ?添加有效篩選條件
連接查詢(★)
按年代分類:
?三個連接:內連接/外連接/交叉連接
1.內連接:關鍵字(inner)
語法:
select 查詢列表
from 表1 別名
【inner】 join 表2 別名 on 連接條件
where 篩選條件
group by 分組列表
having 分組后的篩選
order by 排序列表
limit 子句;
特點:
① 一般為表起別名
②多表的順序可以調換
③n表連接至少需要n-1個連接條件
④等值連接的結果是多表的交集部分
sql199:
①添加排序、分組、篩選
②inner可以省略
③ 篩選條件放在where后面,連接條件放在on后面,提高分離性,便于閱讀
④inner join連接和sql92語法中的等值連接效果是一樣的,都是查詢多表的交集
分類:
等值連接
非等值連接
自連接
#案例1.查詢員工名、部門名SELECT last_name,department_name FROM departments dJOIN employees e ON e.`department_id` = d.`department_id`;#案例2.查詢名字中包含e的員工名和工種名(添加篩選) SELECT last_name,job_title FROM employees e INNER JOIN jobs j ON e.`job_id`= j.`job_id` WHERE e.`last_name` LIKE '%e%';#3. 查詢部門個數>3的城市名和部門個數,(添加分組+篩選)#①查詢每個城市的部門個數 #②在①結果上篩選滿足條件的 SELECT city,COUNT(*) 部門個數 FROM departments d INNER JOIN locations l ON d.`location_id`=l.`location_id` GROUP BY city HAVING COUNT(*)>3;#案例4.查詢哪個部門的員工個數>3的部門名和員工個數,并按個數降序(添加排序)#①查詢每個部門的員工個數 SELECT COUNT(*),department_name FROM employees e INNER JOIN departments d ON e.`department_id`=d.`department_id` GROUP BY department_name#② 在①結果上篩選員工個數>3的記錄,并排序SELECT COUNT(*) 個數,department_name FROM employees e INNER JOIN departments d ON e.`department_id`=d.`department_id` GROUP BY department_name HAVING COUNT(*)>3 ORDER BY COUNT(*) DESC;#5.查詢員工名、部門名、工種名,并按部門名降序(添加三表連接)SELECT last_name,department_name,job_title FROM employees e INNER JOIN departments d ON e.`department_id`=d.`department_id` INNER JOIN jobs j ON e.`job_id` = j.`job_id`ORDER BY department_name DESC;#二)非等值連接#查詢員工的工資級別SELECT salary,grade_level FROM employees eJOIN job_grades gON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`;#查詢工資級別的個數>20的個數,并且按工資級別降序SELECT COUNT(*),grade_level FROM employees eJOIN job_grades gON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`GROUP BY grade_levelHAVING COUNT(*)>20ORDER BY grade_level DESC;#三)自連接#查詢員工的名字、上級的名字SELECT e.last_name,m.last_nameFROM employees eJOIN employees mON e.`manager_id`= m.`employee_id`;#查詢姓名中包含字符k的員工的名字、上級的名字SELECT e.last_name,m.last_nameFROM employees eJOIN employees mON e.`manager_id`= m.`employee_id`WHERE e.`last_name` LIKE '%k%';注意:
1. 使用表名前綴在多個表中區分相同的列
2. 在不同表中具有相同列名的列可以用表的別名加以區分
3. 如果使用了表別名,則在select語句中需要使用表別名代替表名
4. 表別名最多支持32個字符長度,但建議越少越好
2.外連接(left、right,full outer)
應用場景:用于查詢一個表中有,另一個表沒有的記錄
語法:
select 查詢列表
from 表1 別名
left|right|full【outer】 join 表2 別名 on 連接條件
where 篩選條件
group by 分組列表
having 分組后的篩選
order by 排序列表
limit 子句;
特點:
?1、外連接的查詢結果為主表中的所有記錄
?? ?如果從表中有和它匹配的,則顯示匹配的值
?? ?如果從表中沒有和它匹配的,則顯示null
?? ?外連接查詢結果=內連接結果+主表中有而從表沒有的記錄
?2、左外連接,left join左邊的是主表
? ? 右外連接,right join右邊的是主表
?3、左外和右外交換兩個表的順序,可以實現同樣的效果?
?4、全外連接=內連接的結果+表1中有但表2沒有的+表2中有但表1沒有的
分類:
#左外連接SELECT b.*,bo.*FROM boys boLEFT OUTER JOIN beauty bON b.`boyfriend_id` = bo.`id`WHERE b.`id` IS NULL;#案例1:查詢哪個部門沒有員工#左外SELECT d.*,e.employee_idFROM departments dLEFT OUTER JOIN employees eON d.`department_id` = e.`department_id`WHERE e.`employee_id` IS NULL;#右外SELECT d.*,e.employee_idFROM employees eRIGHT OUTER JOIN departments dON d.`department_id` = e.`department_id`WHERE e.`employee_id` IS NULL;#全外USE girls;SELECT b.*,bo.*FROM beauty bFULL OUTER JOIN boys boON b.`boyfriend_id` = bo.id;?
3.交叉連接
語句:
select 查詢列表
from 表1 別名
cross join 表2 別名;
子查詢(★)
一條查詢語句中又嵌套了另一條“完整”的select語句。被嵌套的select語句,稱為子查詢或內查詢
在外面的查詢語句,稱為主查詢或外查詢。
特點:
1、子查詢都放在小括號內
2、子查詢可以放在from后面、select后面、where后面、having后面,但一般放在條件的右側
3、子查詢優先于主查詢執行,主查詢使用了子查詢的執行結果
4、子查詢根據查詢結果的行數不同分為以下兩類:
① 單行子查詢
?? ?結果集只有一行
?? ?一般搭配單行操作符使用:> < = <> >= <=?
?? ?非法使用子查詢的情況:
?? ?a、子查詢的結果為一組值
?? ?b、子查詢的結果為空
② 多行子查詢
?? ?結果集有多行
?? ?一般搭配多行操作符使用:any、all、in、not in
?? ?in: 屬于子查詢結果中的任意一個就行
?? ?any和all往往可以用其他查詢代替
補充:
any/some:和子查詢返回的某一值比較
all():和子查詢返回的所有值比較
in/not in: 等于列表中的任意一個
分類:
1.按出現位置
1)select后面:僅支持標量子查詢
2)from后面:表子查詢
3)where或having后面:標量子查詢,列子查詢,行子查詢
4)exists后面:標量子查詢,列子查詢,行子查詢,表子查詢
2.按結果集
1)標量子查詢(結果集一行一列)
2)列子查詢(結果集一列多行)
3)行子查詢(結果級一行多列(不常用))
4)表子查詢(多行多列(當作一個表使用))
總結
select后面:標量子查詢
from后面:
?? ?支持表子查詢
where或having后面:★
?? ?標量子查詢(單行) √
?? ?列子查詢 ?(多行) √
?? ?行子查詢? ??
exists后面(相關子查詢)
?? ?表子查詢
分頁查詢(關鍵字limit)
應用場景:當查詢的條目太多,一頁顯示不全
(實現的web項目中需要根據用戶的需求提交對應的分頁查詢的sql語句)
語法:
select 查詢列表
from 表
【join type join 表2
on 連接條件
where 篩選條件
group by 分組字段
having 分組后的篩選
order by 排序的字段】
limit 【offset,】size;
注意:
offset:代表的是起始的條目索引,默認從0開始
size: ? 代表的是顯示的條目數
例:
示例:每頁顯示3條記錄 SELECT * FROM student LIMIT 0,3; -- 第1頁 SELECT * FROM student LIMIT 3,3; -- 第2頁 SELECT * FROM student LIMIT 6,3; -- 第3頁聯合查詢(關鍵字union)
作用:union:合并,聯合,將多次查詢結果合并成一個結果
語法:
查詢語句1
union 【all】
查詢語句2
union 【all】
...
特點:
1、要求多條查詢語句的查詢列數必須一致
2、要求多條查詢語句的查詢的各列類型、順序最好一致
3、union 去重,union all包含重復項
三,DML語言的學習(操作)
1.插入(insert)
語法:
方式一:
經典插入:
insert into 表明(列名,...)
values(值1,...);
方式二:
insert into 表明
set 列名=值,列名=值,...
兩種插入方式比較:
方式一:支持插入多行
方式一支持插入多行,方式二不支持INSERT INTO beauty VALUES(23,'唐藝昕1','女','1990-4-23','1898888888',NULL,2) ,(24,'唐藝昕2','女','1990-4-23','1898888888',NULL,2) ,(25,'唐藝昕3','女','1990-4-23','1898888888',NULL,2);
方式一:支持查詢,方式二不支持
注意事項:
1.插入的值的類型要與列的類型一致或兼容
2.不可以為null的列必須插入值,可以為null的列如何插入值?
? ?方式一:寫入null填充
? ?方式二:去掉不添加值的列
3.列的順序可調換(必須一 一對應)
4.列數和值的個數必須一致
5.可以省略列名,默認所有列,而且列的順序和表中列的順序一致
2.修改(update)
語法:
修改單表的記錄:
update 表名
set 列=新值,列=新值,...
where 篩選條件;
修改多表的記錄:
sql192:
update 表1 別名,表2 別名
set 列=值,...
where 連接條件
and 篩選條件;
sql199:
update 表1 別名
inner|left|right join 表2 別名
on 連接條件
set 列=值,...
where 篩選條件;
3.刪除(delete)
單表刪除:
方式一:
delete from 表名 where 篩選條件
方式二:
truncate table 表名;
多表刪除:
sql192:
delete 表1的別名,表2的別名
from 表1 別名,表2 表明
where 連接條件
and 篩選條件;
sql199:
delete 表1的別名,表2的別名
from 表1 別名
inner|left|right join 表2 別名
on 連接條件
where 篩選條件;
delete,truncate比較(面試題★)
1.delete 可以加where 條件,truncate 不能加
2.truncate 刪除,效率更高
3.假如要刪除的表中有自增長列
delete:刪除后,再插入數據,自增長列的值從斷點開始
truncate :刪除后,再插入數據,自增長列的值從1開始
4.truncate 刪除沒有返回值,delete刪除有返回值
5.truncate 刪除不能回滾,delete刪除可以回滾
SELECT * FROM boys;DELETE FROM boys; TRUNCATE TABLE boys; INSERT INTO boys (boyname,usercp) VALUES('張飛',100),('劉備',100),('關云長',100);四,DDL語言的學習(數據定義語言)
1.庫的管理:
1)創建(create):create database 【if not exists】 庫名【 character set 字符集名】;
#案例:創建庫BooksCREATE DATABASE IF NOT EXISTS books ;2)修改(alter):? alter database 庫名 character set 字符集名;
RENAME DATABASE books TO 新庫名;3)更改庫的字符集
ALTER DATABASE books CHARACTER SET gbk;4)刪除(drop):??drop database 【if exists】 庫名;
DROP DATABASE IF EXISTS books;2.表的管理:
1)創建
create table 表明(
? ? ?列名 列的類型【( 長度) 約束】,
? ? ?列名 列的類型【( 長度) 約束】,
? ? ? ....
? ? ?列名 列的類型【( 長度) 約束】,
)
例:
CREATE TABLE book(id INT,#編號bName VARCHAR(20),#圖書名price DOUBLE,#價格authorId INT,#作者編號publishDate DATETIME#出版日期 ); DESC book;2)修改
alter table 表名 add column 列名 類型 【first|after 字段名】;
例:
CREATE TABLE IF NOT EXISTS author(id INT,au_name VARCHAR(20),nation VARCHAR(10)) DESC author;
2.修改列的類型或約束
alter table 表名 modify column 列名 新類型 【新約束】;
3.修改列名
alter table 表名 change column 舊列名 新列名 類型;
4 .刪除列
alter table 表名 drop column 列名;
5.修改表名
alter table 表名 rename 【to】 新表名;
3)刪除
drop table【if exists】 表名;
通用的寫法
drop database if exists 舊庫名;
create database 新庫名;
drop table if exists 舊庫名;
create table 表名();
總結:
alter table 表名 add\drop\modify\change column 列名 列類型 約束;
表的復制:
僅僅復制表的結構:
create table 表名 like 舊表;
復制表的結構+數據:
create table 表名?
select 查詢列表 from 舊表【where 篩選】;
僅僅復制某些字段:
create table 新表名
select 列名
from 被復制表明
where 0;
例:
INSERT INTO author VALUES (1,'村上春樹','日本'), (2,'莫言','中國'), (3,'馮唐','中國'), (4,'金庸','中國');SELECT * FROM Author; SELECT * FROM copy2; #1.僅僅復制表的結構CREATE TABLE copy LIKE author;#2.復制表的結構+數據 CREATE TABLE copy2 SELECT * FROM author;#只復制部分數據 CREATE TABLE copy3 SELECT id,au_name FROM author WHERE nation='中國';#僅僅復制某些字段CREATE TABLE copy4 SELECT id,au_name FROM author WHERE 0;3.常見的數據類型
1)數值型
★整數類型
分類:tinyint,smallint,mediumint,int/integer,bigint
字節數:1,? ? ?2,? ? ? ? ? ? 3,? ? ? ? ? 4,? ?8
特點:
1.未設置無符號還是有符號,默認是有符號,
? ?通過添加unsigned關鍵字設置無符號
2.如果插入的數值超出整型的范圍,會報out of range異常,并且插入臨界值
3.如果不設置長度,會有默認長度
長度代表了顯示的最大寬度,如果不夠會用0在左邊填充,但必須搭配zerofill使用
★小數
浮點型:float(M,D),double(M,D)
定點型:dec(M,D),decimal(M,D)
特點:
①M代表整數部位+小數部位的個數,D代表小數部位
②如果超出范圍,則報out or range異常,并且插入臨界值
③M和D都可以省略,但對于定點數,M默認為10,D默認為0
④如果精度要求較高,則優先考慮使用定點數
原則:所選擇的類型越簡單越好,能保存數值的類型我越小越好
2)字符型
char、varchar、binary、varbinary、enum、set、text、blob
char:固定長度的字符,寫法為char(M),最大長度不能超過M,其中M可以省略,默認為1
varchar:可變長度的字符,寫法為varchar(M),最大長度不能超過M,其中M不可以省略
3)日期型
year年
date日期
time時間
datetime 日期+時間 ? ? ? ? ?8 ? ? ?
timestamp 日期+時間 ? ? ? ? 4? ?(比較容易受時區、語法模式、版本的影響,更能反映當前時區的真實時間)
4.常見的約束
含義:一種限制,用于限制表中表的數據,為了保證表中的數據的準確性和可靠性
1.六大約束(★)
1.NOT NULL:(非空),用于保證該字段的值不能為空
比如姓名,學號等
2.DEFAULT:(默認),用于保證該字段有默認值
比如性別
3.PRIMARY KEY:(主鍵),用于保證該字段的值具有唯一性,并且非空
比如學號,員工編號等
4.UNIOUE:(唯一),用于保證該字段的值具有唯一性,可以為空
比如座位號
5.CHECK:(檢查)約束【MySQL不支持】
6.FOREIGN KEY:(外鍵) 用于限制兩個表的關系,用于保證該字段的值
必須來自于主表的關聯列的值
在從表添加外鍵約束,用于引用主表中某列的值
比如學生表的專業編號,員工表的部門編號,員工表的工種編號等
2.主鍵和唯一比較
3.外鍵
1、用于限制兩個表的關系,從表的字段值引用了主表的某字段值
2、外鍵列和主表的被引用列要求類型一致,意義一樣,名稱無要求
3、主表的被引用列要求是一個key(一般就是主鍵)
4、插入數據,先插入主表
? ? ? 刪除數據,先刪除從表
? ? ? 可以通過以下兩種方式來刪除主表的記錄
#方式一:級聯刪除
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;
#方式二:級聯置空
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;
?
4.添加約束的時機
語法:
create table 表名(
?? ?字段名 字段類型 not null,#非空
?? ?字段名 字段類型 primary key,#主鍵
?? ?字段名 字段類型 unique,#唯一
?? ?字段名 字段類型 default 值,#默認
?? ?constraint 約束名 foreign key(字段名) references 主表(被引用列)//外鍵
)
創建表時添加約束
? ? ? ? ? ? ? ? ? ? ? 支持類型?? ??? ?可以起約束名?? ??? ??? ?
列級約束?? ??? ?除了外鍵? ? ? ? ? ? ? ?不可以
表級約束?? ??? ?除了非空和默認?? ?可以,但對主鍵無效
列級約束可以在一個字段上追加多個,中間用空格隔開,沒有順序要求
1.添加列級約束 /* 語法:
直接在字段名和類型后面追加 約束類型即可。
只支持:默認、非空、主鍵、唯一
USE students; DROP TABLE stuinfo; CREATE TABLE stuinfo(id INT PRIMARY KEY,#主鍵stuName VARCHAR(20) NOT NULL UNIQUE,#非空gender CHAR(1) CHECK(gender='男' OR gender ='女'),#檢查seat INT UNIQUE,#唯一age INT DEFAULT 18,#默認約束majorId INT REFERENCES major(id)#外鍵);CREATE TABLE major(id INT PRIMARY KEY,majorName VARCHAR(20) );#查看stuinfo中的所有索引,包括主鍵、外鍵、唯一 SHOW INDEX FROM stuinfo;2.添加表級約束
語法:在各個字段的最下面 【constraint 約束名】 約束類型(字段名)
DROP TABLE IF EXISTS stuinfo; CREATE TABLE stuinfo(id INT,stuname VARCHAR(20),gender CHAR(1),seat INT,age INT,majorid INT,CONSTRAINT pk PRIMARY KEY(id),#主鍵CONSTRAINT uq UNIQUE(seat),#唯一鍵CONSTRAINT ck CHECK(gender ='男' OR gender = '女'),#檢查CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)#外鍵);SHOW INDEX FROM stuinfo;#通用的寫法:★CREATE TABLE IF NOT EXISTS stuinfo(id INT PRIMARY KEY,stuname VARCHAR(20),sex CHAR(1),age INT DEFAULT 18,seat INT UNIQUE,majorid INT,CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id));修改表時添加或刪除約束
1)非空
添加非空
alter table 表名 modify column 字段名 字段類型 not null;
刪除非空
alter table 表名 modify column 字段名 字段類型 ;
2)默認
添加默認
alter table 表名 modify column 字段名 字段類型 default 值;
刪除默認
alter table 表名 modify column 字段名 字段類型 ;
3)主鍵
添加主鍵
alter table 表名 add【 constraint 約束名】 primary key(字段名);
刪除主鍵
alter table 表名 drop primary key;
4)唯一
添加唯一
alter table 表名 add【 constraint 約束名】 unique(字段名);
刪除唯一
alter table 表名 drop index 索引名;
5)外鍵
添加外鍵
alter table 表名 add【 constraint 約束名】 foreign key(字段名) references 主表(被引用列);
刪除外鍵
alter table 表名 drop foreign key 約束名;
5.標識列
1)創建表時設置自增長列
create table 表(
?? ?字段名 字段類型 約束 auto_increment
)
2)修改表示設置自增長列
alter table 表 modify column 字段名 字段類型 約束 auto_increment
3)刪除自增長列
alter table 表 modify column 字段名 字段類型 約束?
五,TCL語言的學習(事務控制語言)
Transaction Control Language
1.查詢相關存儲引擎:show engiens
2.設置回滾點(關鍵字savepoint 搭配rollback to 使用)
?★3.事務的ACID屬性
?4.事務的創建
1)隱式事務:指事務沒有明顯的開啟和結束的標記
? ? ? ? ? ? ? ? ? ? ? ? 比如insert,update,delete語句等等
2)顯示事務:事務具有明顯的開啟和結束的標記
? ? ? ? ? ? ? ? ? ? ? ? 前提:必須先設置自動提交功能為禁用
?5.并發事務
事務的并發問題是如何發生的?
多個事務同時操作同一個數據庫的相同數據時
并發問題:
?解決并發問題:
?★delete和truncate在事務中使用時的區別
DELETE語句執行刪除的過程是每次從表中刪除一行,并且同時將該行的刪除操作作為事務記錄在日志中保存以便進行進行回滾操作。
TRUNCATE TABLE 則一次性地從表中刪除所有的數據并不把單獨的刪除操作記錄記入日志保存,刪除行是不能恢復的。并且在刪除的過程中不會激活與表有關的刪除觸發器。執行速度快。
總結
以上是生活随笔為你收集整理的MySQL之MySQL服务的使用以及四种语言分类的DQL(查询),DML(操作), DDL(数据定义),TCL(事务控制)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一招分辨手机短信
- 下一篇: 详析运动健身APP开发市场