2020校招學習之路分享————MySQL篇

前言:

**博主今年秋招一路走來還是挺幸運的,找到了合適自己的方法,筆試面試相對來說也是比較順利的,因爲博主並非專學計算機相關專業而是數媒專業(~~技術藝術兩不幹),所以能夠收到offer一部分歸功於運氣,還有很大一部分得益於自己找到了相對來說比較好的方式去學習相關知識,在這裏先向大家推薦學習MySql的一些學習方法,會在後續文章中陸續寫一下如何製作簡歷、算法、筆試、面試的一些東西提供給大家春招做準備,話不多說,乾貨開始!

一: 相關軟件、資料

學習前的準備啦~~,校招筆試面試一般要求的數據庫語言是MySQL,所以我們首先要安裝mysql相關的軟件,因爲mysql是微軟相關的,所以在安裝之前,爲了避免不必要的錯誤發生,希望大家卸載掉SQL Server之類的數據庫軟件,下面開始正事,先給大家軟件,然後介紹一下相關事宜!

百度網盤鏈接: https://pan.baidu.com/s/1GqbiHUPq_HT7NuqQmMYyeQ
提 取 碼 : fyco

軟件安裝簡介

鏈接裏面有兩個壓縮包,一個是相關軟件和供你練習的數據庫,另一個是我所學習的課件還有一些練習的試題,在記憶的同時敲一下試題的代碼能夠增加手感哦!(都是很基礎的試題,不佔用時間的哦)

大家卸載之前電腦安裝的數據庫後就可以安裝我們所需要的軟件啦,首先安裝mysql,安裝完之後開始安裝我們MySQL的操作軟件神器—Navicat,大家看到有兩個安裝包,一個是軟件安裝包一個是破解軟件,切記,一切操作都要在U盤中進行,安裝到自己的電腦上即可(mysql、安裝可百度的哦,博主在實習沒有時間爲大家詳細截圖,如果期間碰到問題請聯繫博主即可 q1311392184

二、SQL常用數據類型

先給大家說明一下,如果你的基礎薄弱,建議仔細觀看接下來的內容,然後敲一下代碼,事半功倍,在接下來的時間內博主會爲大家更新筆試經常出現的部分(也就是筆試考點啦),還會有公司面試所涉及的內容更新,所以一定要關注博主!

1、數值型

1)整型

在這裏插入圖片描述

  • 默認有符號,需要無符號的話,用UNSIGNED INT
  • 插入超過範圍的數,最終爲臨界值
  • 整型的長度代表顯示的寬度,如果要使用,需要搭配zerofill使用,對於int(M),如長度小於M,用0左填充至寬度爲M,如果大於M則無影響。沒實際意義。

2)小數

在這裏插入圖片描述

  • D保留小數位數
  • M整數+小數位數和
  • MD可以省略,DECIMAL默認爲(10,0),FLOAT和DOUBLE會根據實際插入的值來確定
  • 定點型精確度高一點,一些高精度要求的可以用定點型,如貨幣匯率等

2、字符型

在這裏插入圖片描述

  • M爲最多的字符數,“abc”是3個字符,“你好”是兩個字符
  • CHAR是固定長度的字符,可省略M,默認爲1,費空間,效率高
  • VARCHAR是可變長度字符,不可以省略M,M爲最大長度,省空間,效率低
  • BINARY和VARBINARY與CHAR和VARCHAR類似用法
  • ENUM(“a”,“b”,“c”),多選一,只能保存"a",“b”,"c"其中之一,不區分大小寫,在mysql5.7中如果插入非列表中的內容,則爲null
  • SET(“a”,“b”,“c”),多選多,能保存一個或多個abc中的值,如保存"a,b",不區分大小寫,在mysql5.7如果插入非列表中的內容,則報錯

3、日期型

在這裏插入圖片描述

三、SQL字段約束

1、六大約束

在這裏插入圖片描述

外鍵說明
  • 保證從表的值必須來自於主表的某一列的值,需在從表中添加外鍵。
  • 主表從表對應的字段類型要一致或兼容
  • 主表的字段必須是一個key(一般是主鍵或唯一)
  • 插入數據時,必須先插入主表再插入從表
主鍵與唯一的區別
  • 主鍵具有唯一性,不允許爲null,一張表最多一個,可以組合使用(即多個字段爲組合爲一個主鍵)但不推薦。
  • 唯一具有唯一性,允許爲null且在mysql5.7中默認可以有多個null,一張表可以有多個,可以組合使用但不推薦

2、標識列(自增長列)

  • 標識列用AUTO_INCREMENT設置
  • 標識列必須是主鍵或唯一
  • 一個表中最多一個標識列
  • 標識列類型只能是數值型

有關約束和標識列的使用,在DDL表的管理部分有整理

四、DQL(Data Query Language)數據查詢語言

1、語句順序(代碼中的位置)

  • 書寫順序:SELECT、DISTINCT、FROM、JOIN ON、WHERE、GROUP BY、HAVING、ORDER
    BY、LIMIT
  • 執行順序:FROM、 JOIN ON、WHERE、GROUP
    BY、HAVING、SELECT、DISTINCT、ORDER BY、LIMIT

2、基礎查詢(SELECT)

SELECT 查詢內容 FROM 表名

(1)查詢常量

SELECT 200;
SELECT 'hello';

(2)查詢表達式

對於"+"運算符,僅用於數字類型的相加。若運算數爲字符,嘗試轉化爲數字,若轉換失敗,則認爲是0;若運算數爲null,結果爲null。如下:

SELECT 100%3;
SELECT '123'+9;     #結果爲 132,'123'-->123
SELECT 'haha'+9;    # 結果爲 9,’haha’-->0
SELECT null+9;      # 結果爲 null

(3)查詢字段

a.表中字段查詢

SELECT first_name FROM employees;           #查詢單個字段
SELECT first_name,last_name FROM employees; #查詢多個字段
SELECT * FROM employees;                    #查詢所有字段

b.使用別名(AS)

SELECT first_name AS '名',last_name  '姓' FROM employees; #查詢結果使用別名

c.去重(DISTINCT)

SELECT DISTINCT department_id FROM employees; #查詢結果去重

(3)查詢函數

SQL提供了很多現成函數,常用的大致可分爲單行函數和分組函數。

  • 單行函數爲處理一條數據,輸出一個結果,如對字符串的處理等。
  • 分組函數又稱聚合函數、統計函數或組函數,是對多條記錄的統計結果,如求和等。

a.單行函數
根據處理的數據類型不同,單行函數又可細分爲字符函數、數學函數、日期函數、流程控制函數等

·字符函數
LENGTH(str) 返回字符串長度

 SELECT LENGTH('hello');   #結果爲5
 SELECT LENGTH(last_name); #結果爲last_name字段的長度

CONCAT(str1,str2) 拼接字符串

		SELECT CONCAT(last_name,'-',first_name); #結果爲 last_name字段 - first_name字段

UPPER(str) | LOWER(str) 轉換爲大/小寫

SELECT UPPER('hello'); #結果爲'HELLO'
SELECT LOWER('HeLLo'); #結果爲'hello'

SUBSTR(str,pos,len) 截取字符串,字符串索引從1開始

	SELECT SUBSTR('my name is xiaoming',4,4); #結果爲'name'
  	SELECT SUBSTR('my name is xiaoming',4);   #結果爲'name is xiaoming'

INSTR(str,substr) 返回子串第一次出現的索引,字符串索引從1開始

	 SELECT INSTR('my name is xiaoxiao','xiao'); #結果爲12

TRIM(str,substr) 首尾去除規定字符,默認去空格

	SELECT TRIM('   my  name  is  xiaoming  ');                #結果爲'my  name  is  xiaoming'
    SELECT TRIM('7' FROM '77my  name 777 is  xiaoming  777');  #結果爲'my  name 777 is  xiaoming  '

LPAD(str,len,padstr) | RPAD(str,len,padstr) 用規定字符左(右)填充至指定長度

  SELECT LPAD('my',10,'*'); #結果爲'********my'
  SELECT RPAD('my',10,'ab');#結果爲'myabababab'

REPLACE(str,old,new) 字符串替換

 SELECT REPLACE('my name is xiaoxiao','xiao','da');#結果爲'my name is dada'

·數學函數
ROUND(X,D) 四捨五入,保留指定位數,默認爲保留整數

SELECT ROUND(-1.65); #-2
SELECT ROUND(-1.65,1); #-1.7

CEIL(X) | FLOOR(X) 向上|向下取整

 SELECT CEIL(1.44);#2
 SELECT FLOOR(1.55);#1

TRUNCATE(X) 截取保留指定小數位

SELECT TRUNCATE(2.666,1); #2.6

MOD(X1,X2) 取模

SELECT MOD(10,3);#1,符號與被除數一致
SELECT MOD(-10,3);#-1
 SELECT MOD(10,-3);#1

·日期函數
NOW()、CURDATE() 當前時間、當前日期

 SELECT NOW();#2019-10-19 14:40:54
 SELECT CURDATE();#2019-10-19

YEAR() | MONTH() | DAY() | HOUR() | MINUTE() | SECOND()

 SELECT YEAR('2019-10-1');#2019

DATEDIFF(date1,date2) | TIMEDIFF(date1,date2) 兩個日期相差的天數|兩個時刻相差的時間

SELECT DATEDIFF('2019-10-17','2019-10-1');              #結果爲16,前面的減後面的
SELECT TIMEDIFF('2019-10-17 15:30:2','2019-10-1 7:0:0');#結果爲 392:30:02

在這裏插入圖片描述

 SELECT STR_TO_DATE('10-1 2019','%c-%d %Y');#2019-10-01
 SELECT DATE_FORMAT(NOW(),'%Y.%m.%d');#2019.10.19

·流程控制函數

  • IF 二選一
SELECT IF(10>5,'yes','no');#結果爲'yes'

CASE-WHEN-THEN-END 多選一

用法1,相當於Java的switch,判斷一個*值*:
	   
 SELECT last_name,job_id,CASE job_id
         	WHEN 'AD_PRES' THEN '1'
         	WHEN 'AD_VP' THEN '2'
         	WHEN 'IT_PROG' THEN '3'
         	ELSE '4'
         	END  FROM employees;
用法2,相當於Java的if-else if-else,判斷一個*表達式*:
 SELECT last_name,CASE
 WHEN salary<5000 THEN
           	'<5000'
 WHEN salary BETWEEN 5000 AND 10000 THEN
              		'5000-10000'
 ELSE
           	'>10000'
  	END  FROM employees;

b.分組函數

分組函數又稱爲聚合函數、統計函數、組函數,所有分組函數對null值處理爲忽略它,而非當做0。常用的分組函數有以下幾個:

  • SUM() 對數值型數據求和,用+相加,符合+的運算法則
  • AVG() 對數值型數據求平均
  • MAX() 對所有可比較類型求最大值
  • MIN()對所有可比較類型求最小值
  • COUNT() 統計非空個數

分組函數的調用爲:

SELECT SUM(salary) FROM employees;
SELECT COUNT(*) FROM employees;#統計表的總行數
SELECT COUNT(1) FROM employees;#統計表的總行數

3、條件查詢(WHERE)

SELECT 查詢內容 FROM 表名 WHERE 條件

(1)運算符做條件

sql語法中運算符有:

在這裏插入圖片描述

#查詢部門編號大於50小於100的員工信息
SELECT * FROM employees WHERE department_id > 50 AND department_id < 100;

(2)邏輯表達式做條件

在這裏插入圖片描述

#查詢部門編號大於50小於100的員工信息
SELECT * FROM employees WHERE department_id > 50 AND department_id < 100;

(3)模糊查詢

sql中用於模糊查詢的關鍵字有:
在這裏插入圖片描述

#查詢last_name第二個字符是a的員工
SELECT * FROM employees WHERE last_name LIKE '_a%';

#查詢工資在10000到20000的員工信息,包括10000和20000
SELECT * FROM employees WHERE salary BETWEEN 10000 AND 20000;

#查詢職位爲D_VP和FI_MGR的員工信息
SELECT * FROM employees WHERE job_id IN ('D_VP','FI_MGR');

#查詢沒有獎金的員工信息
SELECT * FROM employees WHERE commission_pct IS NULL;

4、排序查詢(ORDER BY)

SELECT 查詢內容 FROM 表名 ORDER BY [ASC|DESC]

ASC:升序,默認項
DESC:降序

(1)基本排序

#按月薪降序
SELECT * FROM employees ORDER BY salary DESC;
#按年薪降序
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) salary_total 
FROM employees ORDER BY salary_total DESC;

(2)按函數排序

#按名字長度降序排序
SELECT * 
FROM employees 
ORDER BY LENGTH(last_name) DESC;

(3)按多個字段排序

#先按salary降序排序,同樣salary的按employee_id升序排序
SELECT * 
FROM employees 
ORDER BY salary DESC , employee_id ASC;

5、分組查詢(GROUP BY)

SELECT 查詢內容 FROM 表名 [WHERE 條件] GROUP BY 分組列表 [HAVING 條件]
  • 查詢內容中的字段,必須要出現在分組列表中
  • WHERE是在分組前對原始表篩選,HAVING是在分組後對結果表篩選
  • 分組查詢中,若用分組函數做篩選的條件,一定是在HAVING子句中

(1)按單字段分組

#查詢每個部門的員工數量
SELECT department_id,COUNT(1) 
FROM employees 
GROUP BY department_id ;

(2)按多字段分組

#查詢每個部門,每個職務的平均工資
SELECT AVG(salary),department_id,job_id 
FROM employees 
GROUP BY department_id,job_id;

(3)按函數分組

#按名字長度分組,並篩選出數量大於5的名字長度
SELECT COUNT(1) c,LENGTH(last_name) len_name 
FROM employees 
GROUP BY len_name 
HAVING c>5;

6、連接查詢(JOIN)

(1)sql92標準(棄用)

SELECT 查詢列表 FROM 表1,表2 WHERE 連接條件 [AND 查詢條件]

a.內連接
sql92標準只支持內連接,內連接即用來查詢兩張表的"交集"部分,即滿足條件的、兩張表都存在的部分。內連接又分爲等值連接、非等值連接和自連接。

等值連接
等值連接即以兩張表的兩個字段的值相等爲連接條件,進行兩張表的連接,如:

#查詢每個員工的job_title
SELECT e.last_name,e.job_id,job_title 
FROM employees e,jobs j 
WHERE e.job_id = j.job_id;

非等值連接
非等值連接即以兩張表的兩個字段的值滿足一定條件爲連接條件,進行兩張表的連接,如:

#查詢某個員工的工資等級
SELECT e.last_name,j.grade_level 
FROM employees e,job_grades j 
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;

自連接
自連接即一張表和本身的連接,因涉及到同一張表的連接,一般要對這張表使用不同的別名加以區分,如:

#查詢某個員工及其對應的領導
SELECT e1.last_name 'employee',e2.last_name 'manager'
FROM employees e1,employees e2 
WHERE e1.manager_id = e2.employee_id;

(2)sql99標準

SELECT 查詢列表 FROM 表1 [INNER|LEFT OUTER|RIGHT OUTER|FULL OUTER|UNION] JOIN 表2 ON 連接條件 [WHERE 查詢條件]

a.內連接(INNER JOIN)
sql99的內連接含義與sql92語法完全一致,只是語法不同。用sql92的三個例子改爲sql99語法形式如下:

等值連接

#查詢每個員工的job_title
SELECT e.last_name,e.job_id,job_title 
FROM employees e 
INNER JOIN jobs j 
ON e.job_id = j.job_id;

非等值連接

#查詢某個員工的工資等級
SELECT e.last_name,j.grade_level 
FROM employees e
INNER JOIN job_grades j 
ON e.salary BETWEEN j.lowest_sal AND j.highest_sal;

自連接

#查詢某個員工及其對應的領導
SELECT e1.last_name 'employees',e2.last_name 'manager'
FROM employees e1
INNER JOIN employees e2 
ON e1.manager_id = e2.employee_id;

b.外連接(OUTER JOIN)
在sql99標準中,又增加的外連接的功能。外連接又包括左外連接、右外連接和全外連接。多用來查詢一張表中有,另一張表中沒有的記錄。

外連接會查詢主表的所以記錄
若主表中的某條記錄在從表中有與之對應的記錄,則相應的字段爲從表的內容;
反正,相應的字段爲null。
換句話說,外連接查詢結果=內連接查詢結果+主表有但從表沒有的記錄

對於主從表的區分,有以下幾種:
左外連接:主表 LEFT JOIN 從表
右外連接:從表 RIGHT JOIN 主表
全外連接:表1 FULL JOIN 表2,其中表1表2分別輪流作爲主表,查詢結果是兩張表的"並集"。另外,全外連接在MySQL中不支持使用。

左外連接(LEFT JOIN ON)

#查詢沒有遲到記錄的員工名
SELECT last_name,late.count_late 
FROM employees
LEFT JOIN late 
ON employees.employee_id = late.employee_id 
WHERE late.count_late IS NULL;

右外連接(RIGHT JOIN ON)

#查詢沒有遲到記錄的員工名
SELECT last_name,late.count_late
FROM late 
RIGHT JOIN employees 
ON employees.employee_id = late.employee_id 
WHERE late.count_late IS NULL;

全外連接(FULL JOIN ON)
全外連接在mysql中不支持,語法如下:

SELECT beauty.name 
FROM boys 
FULL OUTER JOIN beauty 
ON beauty.boyfriend_id = boys.id ;

c.交叉連接(CROSS JOIN)
效果即笛卡爾積形式,即兩個表的所有記錄都一一匹配一遍,查詢的結果一共A×B條記錄(A、B分別爲兩個表的記錄數)

SELECT * FROM jobs CROSS JOIN locations;

7、子查詢

嵌套在其他語句的SELECT語句爲子查詢(內查詢),外部的查詢語句爲主查詢(外查詢)

可分類爲:

  • 標量子查詢(結果集只有一行一列)
  • 列子查詢(結果集多爲一列多行) ----------IN、NOT IN:等於/不等於列表中的任意一個==
    ANY/SOME:子查詢中某一個值滿足就行 = = ALL:子查詢中所以值都滿足
  • 行子查詢(結果集多爲一行多列)
  • 表子查詢(結果集有多行多列)

(1)子查詢在SELECT後面
只支持標量子查詢,如

#查詢每個部門的信息加部門的人數
SELECT * ,
(SELECT COUNT(1) FROM employees WHERE employees.department_id = departments.department_id)
 FROM departments;

(2)子查詢在FROM後面
支持表子查詢,在一個SELECT查詢後的表中查詢新的內容,如:

#查詢每個部門的平均工資的工資等級
SELECT department_id,department_name,a , j.grade_level 
FROM (
	SELECT e.department_id ,d.department_name, AVG(salary) a 
	FROM employees e 
	LEFT JOIN departments d 
	ON  e.department_id=d.department_id 
	GROUP BY e.department_id
) tmp 
INNER JOIN job_grades j 
ON tmp.a BETWEEN j.lowest_sal AND j.highest_sal;

(3)子查詢在WHERE/HAVING後面
支持標量子查詢、列子查詢、行子查詢

#標量子查詢:查詢工資最少的員工信息
SELECT * 
FROM employees 
WHERE salary = (
	SELECT MIN(salary)
	FROM employees
);
#列子查詢:查詢location_id爲1400或1500或2700的部門中的所有員工姓名
SELECT last_name 
FROM employees 
WHERE department_id IN (
	SELECT department_id 
	FROM departments 
	WHERE location_id IN(1400,1500,2700)
);
#行子查詢:查詢編號最小並且工資最高的員工信息
#滿足行子查詢的條件筆記苛刻,所以用的不多
SELECT * 
FROM employees 
WHERE (employee_id,salary) = (
	SELECT MIN(employee_id),MAX(salary) 
	FROM employees
);

(4)子查詢在EXISTS後面(相關子查詢)
EXISTS(SELECT 語句):有記錄,則爲1,無記錄,則爲0
相關子查詢是先執行外查詢,在由EXISTS過濾; 都能用IN代替

#查詢有員工的部門名
SELECT department_name 
FROM departments d 
WHERE EXISTS(
	SELECT * FROM employees e WHERE e.department_id = d.department_id
);
#用IN代替
SELECT department_name 
FROM departments d
 WHERE d.department_id IN (
 	SELECT DISTINCT department_id 
 	FROM employees
 );

8、分頁查詢(LIMIT)

SELECT 查詢列表 FROM 表名 LIMIT offset,size;
  • offset 要查詢的起始索引,從0開始,缺省爲0
  • size 要查詢的記錄數目
#查詢有獎金的員工中工資最高的10個員工的信息
SELECT * 
FROM employees 
WHERE commission_pct IS NOT NULL 
ORDER BY salary DESC 
LIMIT 0, 10;

9、聯合查詢(UNION)

SELECT完整語句1 UNION [ALL] SELECT完整語句2 UNION [ALL]

將多條查詢語句的結果合併爲一個結果,結果的字段名爲第一個查詢的字段。

  • 要求各部分字段列數一致
  • 要求各部分字段順序一致

UNION默認去重,不去重用UNION ALL

#查詢department_id>50和salary>5000的員工信息
SELECT * 
FROM employees 
WHERE department_id > 50 
UNION 
SELECT * 
FROM employees 
WHERE salary > 5000 ; 

五、DML(Data Manipulation Language)數據操作語言

1、增(INSERT)

1)方式一

INSERT INTO 表名(字段1,字段2…) VALUE (值1,值2 …)
  • 插入的值的類型要與列的類型一致或兼容
  • 可以爲null的列或有默認值的列可以不寫(默認爲null,或默認值)
  • 列的順序可以顛倒,與值對應即可
  • 可以省略列名不寫,默認是所有列名
INSERT INTO 表名 VALUE (值1,值2 ...)

支持多行插入

INSERT INTO 表名 VALUE (值1,值2 ...),(值1,值2 ...),(值1,值2 ...)...

支持子查詢,插入查詢的結果

INSERT INTO 表名(字段1,字段2...) SELECT 字段1,字段2... FROM...

2)方式二

**INSERT INTO 表名 SET 字段1=值1,字段2=值2…**

2、刪(DELETE)

1)方式一

a.刪除單表記錄
DELETE FROM 表名 WHERE 篩選條件

b.刪除多表記錄(連接刪除)
sql92語法

DELETE [表1|表2]
FROM 表1,表2
WHERE 連接條件
AND 篩選條件

sql99語法

DELETE [表1|表2]
FROM 表1
[LEFT|RIGHT|FULL|INNER] JOIN 表2
ON 連接條件
WHERE 篩選條件

2)方式二

TRUNCATE TABLE 表名

3)比較(重要)

  • TRUNCATE不能加篩選條件,只是清空整個表。
  • DELETE刪除後,自增長列從斷點開始,可以返回受影響的行數,效率低,可以回滾
  • TRUNCATE刪除後,自增長列從1開始,不可以返回受影響的行數,效率高,不可以回滾

3、改(UPDATE)

1)方式一

a.修改單表記錄
UPDATE 表名
SET 字段1=新值1,字段2=新值2…
WHERE 篩選條件
b.修改多表記錄(連接修改)
sql92語法
UPDATE 表1,表2
WHERE 連接條件
AND 篩選條件
SET 字段1=新值1,字段2=新值2…
sql99語法
UPDATE 表1
[INNER|LEFT|RIGHT|FULL] JOIN 表2
ON 連接條件
WHERE 篩選條件
SET 字段1=新值1,字段2=新值2…

六、DDL(Data Define Language)數據定義語言

1、庫的管理

1)庫的創建(CREATE)

CREATE DATABASE IF NOT EXISTS database1;

2)庫的修改(ALTER)

#修改字符集
ALTER DATABASE database1 CHARACTER SET utf-8或gbk;

3)庫的刪除(DROP)

DROP DATABASE IF EXISTS database1;

2、表的管理

1)表的創建(CREATE)

a.普通創建

CREATE TABLE  IF NOT EXISTS table_name(
				字段名 字段類型 ,
				……
				字段名 字段類型 
			)

b.複製創建

#複製表的所有結構
CREATE TABLE new_table LIKE old_table;
#複製表的部分結構
CREATE TABLE new_table SELECT list FROM old_table WHERE 0;
#複製表的所有結構+所有數據
CREATE TABLE new_table SELECT * FROM old_table;
#複製表的部分結構+所有數據
CREATE TABLE new_table SELECT field_list FROM old_table;
#複製表的部分結構+部分數據
CREATE TABLE new_table SELECT field_list FROM old_table WHERE condition

c.帶約束創建

創建表時的約束可分爲列級約束和表級約束,在mysql中:

  • 列級約束:支持主鍵、唯一、非空、默認
  • 表級約束:支持主鍵、唯一、外鍵
  • 一般的,外鍵用表級約束添加,其他的用列級約束添加
#創建表時添加列級約束
      CREATE TABLE user(
      	id INT PRIMARY KEY, #主鍵
      	name VARCHAR(20) NOT NULL, #非空
      	no INT UNIQUE, #唯一
      	flag TINYINT DEFAULT 1, #默認
      )
#創建表時添加表級約束
      CREATE TABLE user(
      	id INT,
      	no INT ,
      	book_id INT,
  	#以下添加表級約束
  	CONSTRAINT pk PRIMARY KEY(id), #主鍵
  	UNIQUE(no),#唯一,可以省略CONSTRAINT(其他約束也可一省略)
  	CONSTRAINT fk_user_book FOREIGN KEY(book_id) REFERENCES book(id) #外鍵,建議取個約束名
  ) 

d.帶標識列創建
同約束的設置方法,在創建表時,在後面添加 AUTO_INCREMENT

CREATE TABLE user(
			id INT UNIQUE AUTO_INCREMENT,
			name VARCHAR(20)
)
SET auto_increment_increment=3 #設置步長
SET auto_increment_offset=3 #設置起始值,mysql不支持,但可以通過插入數據時來手動插入一個起始值

2)表的修改(ALTER)

修改表名

ALTER TABLE 表名 RENAME TO  新表名;

修改字段名
ALTER TABLE 表名 CHANGE COLUMN 字段名 新字段名;

修改字段的類型、約束或添加約束

ALTER TABLE 表名 MODIFY COLUMN 字段名 字段類型 約束類型;

添加新列

ALTER TABLE 表名 ADD COLUMN 字段名 字段類型 約束類型;

刪除列

ALTER TABLE 表名 DROP COLUMN 字段名;

刪除約束

ALTER TABLE user DROP PRIMARY KEY;#刪除主鍵
ALTER TABLE user DROP  FOREIGN KEY  fk_user_book;#刪除外鍵

3)表的刪除(DROP)

DROP TABLE IF EXISTS 表名;

七、TCL(Transaction Control Language)事務控制語言

使用事務一般有以下步驟:

  • step1:關閉自動提交
    SET autocommit = 0 #默認爲1,自動提交
  • step2:寫多條sql語句
    ……
    ……
  • step3:結束事務
    成功:COMMIT 提交事務
    失敗:ROLLBACK 回滾

即:

SET autocommit = 0; #關閉自動提交
START TRANSACTION;
INSERT INTO book values(1,'book1');
INSERT INTO book values(2,'book2');
COMMIT;#提交,插入兩條記錄成功

SET autocommit = 0; #關閉自動提交
START TRANSACTION;
INSERT INTO book values(1,'book1');
INSERT INTO book values(2,'book2');
ROLLBACK;#回滾,不插入記錄

SET autocommit = 0; #關閉自動提交
START TRANSACTION;
INSERT INTO book values(1,'book1');
SAVEPOINT a;
INSERT INTO book values(2,'book2');
ROLLBACK a;#回滾到a,第一條插入,第二條不插入

八、DCL(Data Control Language)數據控制語言

1、補充用戶基本操作

mysql [-h localhost -P 3306] -u root -p;#登錄
exit;                                   #退出
show databases;                         #查看所有庫
use db_name;                            #進入庫
select database();                      #查看當前庫
show tables [from dbname];              #查看錶
desc tablename;                         #查看錶的結構

2、創建用戶

CREATE USER 用戶名@‘IP地址’ IDENTIFIED BY '密碼';#在指定ip訪問
CREATE USER 用戶名@’%’  IDENTIFIED BY '密碼'; #所有ip都可訪問

3、給用戶授權

GRANT 權限 ON 庫名.表名 to 用戶名@’IP地址’;
#如果是所有權限,則權限處用ALL
#如果是多個權限,中間用,隔開
#如果是所有庫,庫名用*
#如果是所有表,表名用*
#如果是所有IP,ip地址用%

常用權限:(瞭解即可)
USAGE:默認用,不可刪,登錄權限
SELECT:查詢權限
INSERT:插入權限
UPDATE:更改權限
DELETE:刪除權限
CREATE:建表權限
CREATE VIEW:創建視圖權限
ALTER:修改表權限
DROP:刪除表權限index
INDEX:創建/刪除索引
GRANT OPTION:將自己有的權限授予其他人

4、撤銷權限

REVOKE 權限 ON 庫名.表名 to 用戶名@’IP地址’;

5、查看權限

SHOW GRANTS FOR 用戶名@’IP地址’;

6、刪除用戶

DROP USER 用戶名@‘IP地址’;

九、視圖

視圖是在mysql5.1版本出現的新特性,它是一張虛擬表,和普通表一樣的用法。但在幾個特點的條件下,視圖不支持更新,一般也不對視圖進行更新。在物理空間中,只保存視圖的sql邏輯結構,而不保存具體的數據,在使用時,動態生成查詢數據。應用場景:

  • 多個地方用到同樣的查詢結果
  • 查詢語句較爲複雜

1、視圖創建

CREATE VIEW view_name
AS
SELECT語句

2、視圖修改

#方式一
CREATE OR REPLACE VIEW view_name
AS
SELECT 語句
#方式二
ALTER VIEW view_name
AS
SELECT 語句

3、視圖刪除

DROP VIEW view_name,view_name…;#支持同時刪除多個視圖

十:博主題外話

如果你不擅長觀看文字的話博主將整理資料的來源贈與你,
視頻鏈接:https://www.bilibili.com/video/av49181542/
聲明:整理的資料來自博主學習的尚硅谷的視頻,整理完方便大家觀看,視頻太浪費時間啦,當然,若你的時間充足,那博主無話可說,但春招大廠初五之後就開始了,你的時間不多吧!
請關注博主,因爲博主會 陸續更新 *如何一週學算法、如何製作合適的簡歷、快速計算機基礎搭建 面經的介紹和博主面試時的一些總結給大家,大家也可以投票決定下一篇文章先寫n哪一個哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章