数据库知识点汇总(最全!!)
一、數(shù)據(jù)庫概述
保存數(shù)據(jù) 的容器
SELECT sid AS ‘學(xué)生編號’ FROM yu;
數(shù)組
集合
文件
…
能否存儲大量文件?
查詢速度如何?是否方便?
共享是否方便?
安全性如何?
數(shù)據(jù)庫的好處
?實(shí)現(xiàn)數(shù)據(jù)持久化
?使用完整的管理系統(tǒng)統(tǒng)一管理,易于查詢
數(shù)據(jù)庫的概念
DB
數(shù)據(jù)庫(database):存儲數(shù)據(jù)的“倉庫”。它保存了一系列有組織的數(shù)據(jù)。
DBMS
數(shù)據(jù)庫管理系統(tǒng)(Database Management System)。數(shù)據(jù)庫是通過DBMS創(chuàng)建和操作的容器,常見的數(shù)據(jù)庫管理系統(tǒng):MySQL、Oracle、DB2、SqlServer等
SQL
結(jié)構(gòu)化查詢語言(Structure Query Language):專門用來與數(shù)據(jù)庫通信的語言。
二、SQL語言概述
SQL的優(yōu)點(diǎn):
1、不是某個特定數(shù)據(jù)庫供應(yīng)商專有的語言,幾乎所有DBMS都支持SQL
2、簡單易學(xué)
3、雖然簡單,但實(shí)際上是一種強(qiáng)有力的語言,靈活使用其語言元素,可以進(jìn)行非常復(fù)雜和高級的數(shù)據(jù)庫操作。
三、數(shù)據(jù)庫的特點(diǎn)
將數(shù)據(jù)放到表中,表再放到庫中
一個數(shù)據(jù)庫中可以有多個表,每個表都有一個的名字,用來標(biāo)識自己。表名具有唯一性。
表具有一些特性,這些特性定義了數(shù)據(jù)在表中如何存儲,類似java中 “類”的設(shè)計。
表由列組成,我們也稱為字段。所有表都是由一個或多個列組成的,每一列類似java 中的”屬性”
表中的數(shù)據(jù)是按行存儲的,每一行類似于java中的“對象”。
四、SQL語言分類
1、DML(Data Manipulation Language):數(shù)據(jù)操縱語句,用于添加、刪除、修改、查詢數(shù)據(jù)庫記錄,并檢查數(shù)據(jù)完整性
2、DDL(Data Definition Language):數(shù)據(jù)定義語句,用于庫和表的創(chuàng)建、修改、刪除。
3、DCL(Data Control Language):數(shù)據(jù)控制語句,用于定義用戶的訪問權(quán)限和安全級別。
DML
DML用于查詢與修改數(shù)據(jù)記錄,包括如下SQL語句:
INSERT:添加數(shù)據(jù)到數(shù)據(jù)庫中
UPDATE:修改數(shù)據(jù)庫中的數(shù)據(jù)
DELETE:刪除數(shù)據(jù)庫中的數(shù)據(jù)
SELECT:選擇(查詢)數(shù)據(jù)
SELECT是SQL語言的基礎(chǔ),最為重要。
DDL
DDL用于定義數(shù)據(jù)庫的結(jié)構(gòu),比如創(chuàng)建、修改或刪除數(shù)據(jù)庫對象,包括如下SQL語句:
CREATE TABLE:創(chuàng)建數(shù)據(jù)庫表
ALTER TABLE:更改表結(jié)構(gòu)、添加、刪除、修改列長度
DROP TABLE:刪除表
CREATE INDEX:在表上建立索引
DROP INDEX:刪除索引
DCL
DCL用來控制數(shù)據(jù)庫的訪問,包括如下SQL語句:
GRANT:授予訪問權(quán)限
REVOKE:撤銷訪問權(quán)限
COMMIT:提交事務(wù)處理
ROLLBACK:事務(wù)處理回退
SAVEPOINT:設(shè)置保存點(diǎn)
LOCK:對數(shù)據(jù)庫的特定部分進(jìn)行鎖定
五、mysql數(shù)據(jù)庫的安裝
圖解MySQL程序結(jié)構(gòu)
MySQL產(chǎn)品的特點(diǎn)
MySQL數(shù)據(jù)庫隸屬于MySQL AB公司,總部位于瑞典,后被oracle收購。
– 成本低:開放源代碼,一般可以免費(fèi)試用
– 性能高:執(zhí)行很快
– 簡單:很容易安裝和使用
配置文件常用配置分析(重點(diǎn))
安裝目錄下的my.ini文件
[mysqld] 服務(wù)端配置
port=3306 端口3306
basedir 是安裝目錄
datadir 數(shù)據(jù)文件目錄
character-set-server 服務(wù)端字符編碼
default-storage-engine 默認(rèn)引擎
sql-mode 語法模式
max_connections 最大連接數(shù)
啟動和停止MySQL服務(wù)
方式一:通過計算機(jī)管理方式
右擊計算機(jī)—管理—服務(wù)—啟動或停止MySQL服務(wù)
方式二:通過命令行方式(右鍵管理員運(yùn)行,否則沒有權(quán)限)
啟動:net start 服務(wù)名
停止:net stop 服務(wù)名
MySQL服務(wù)端的登錄和退出
通過mysql自帶客戶端
通過window是命令行登錄
mysql –h 主機(jī)名 –u用戶名 –p 密碼
mysql -h localhost -u root -p
輸入密碼:
退出
exit
六、MySql數(shù)據(jù)庫的使用
規(guī)范
不區(qū)分大小寫
每句話用;或\g結(jié)尾
各子句一般分行寫
關(guān)鍵字不能縮寫也不能分行
用縮進(jìn)提高語句的可讀性
注釋
單行注釋 # 或 –
多行注釋 /* 注釋文本 */
示例
6.查看mysql版本
登錄后select version();
或退出重新登錄
未登錄 mysql --version或mysql –V
1.SHOW DATABASES;
2.USE employee;
3.SHOW TABLES ;
4.DESC dept;
七、圖形化界面客戶端的使用
導(dǎo)入sql文件
四張表的介紹
八、基本 SELECT 語句
SELECT *|{[DISTINCT] column|expression [alias],…}
FROM table;
? SELECT 標(biāo)識選擇哪些列。
? FROM 標(biāo)識從哪個表中選擇。
SELECT *
FROM departments;
選擇特定的列
SELECT department_id, location_id
FROM departments;
注意
? SQL 語言大小寫不敏感。
? SQL 可以寫在一行或者多行
? 關(guān)鍵字不能被縮寫也不能分行
? 各子句一般要分行寫。
? 使用縮進(jìn)提高語句的可讀性
列的別名
? 重命名一個列。
? 便于計算。
? 緊跟列名,也可以在列名和別名之間加入關(guān)鍵字‘AS’,別名使用雙引號,以便在別名中包含空格或特殊的字符并區(qū)分大小寫。
SELECT last_name AS name, commission_pct comm
FROM employees;
SELECT last_name “Name”, salary*12 “Annual Salary”
FROM employees;
字符串
? 字符串可以是 SELECT 列表中的一個字符,數(shù)字,日期。
? 日期和字符只能在單引號中出現(xiàn)。?
顯示表結(jié)構(gòu)
使用 DESCRIBE 命令,表示表結(jié)構(gòu)
DESC[RIBE] tablename
DESCRIBE employees
九、過濾和排序數(shù)據(jù)
過濾
使用WHERE 子句,將不滿足條件的行過濾掉
SELECT
*|{[DISTINCT] column|expression [alias],…}
FROM table
[WHERE condition(s)];
WHERE 子句緊隨 FROM 子句
返回在 90號部門工作的所有員工的信息
SELECT employee_id, last_name, job_id, department_id
FROM employees
WHERE department_id = 90 ;
比較運(yùn)算
賦值使用 := 符號
SELECT last_name, salary
FROM employees
WHERE salary <= 3000;
其它比較運(yùn)算(重點(diǎn)聽一下LIKE)
BETWEEN
使用 BETWEEN 運(yùn)算來顯示在一個區(qū)間內(nèi)的值
SELECT last_name, salary
FROM employees
WHERE salary BETWEEN 2500 AND 3500;
IN
使用 IN運(yùn)算顯示列表中的值。
SELECT employee_id, last_name, salary, manager_id
FROM employees
WHERE manager_id IN (100, 101, 201);
LIKE
?使用 LIKE 運(yùn)算選擇類似的值
?選擇條件可以包含字符或數(shù)字:
% 代表零個或多個字符(任意個字符)。
_ 代表一個字符。
SELECT first_name
FROM employees
WHERE first_name LIKE ‘S%’;
‘%’和‘-’可以同時使用
SELECT last_name
FROM employees
WHERE last_name LIKE ‘_o%’; //最后的名字字母為o
NULL
使用 IS (NOT) NULL 判斷空值
SELECT last_name, manager_id
FROM employees
WHERE manager_id IS NULL;
邏輯運(yùn)算
AND
AND 要求并的關(guān)系為真
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary >=10000
AND job_id LIKE ‘%MAN%’;
OR
OR 要求或關(guān)系為真。
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary >= 10000
OR job_id LIKE ‘%MAN%’;
NOT
SELECT last_name, job_id
FROM employees
WHERE job_id
NOT IN (‘IT_PROG’, ‘ST_CLERK’, ‘SA_REP’);
ORDER BY子句
使用 ORDER BY 子句排序
ASC(ascend): 升序
DESC(descend): 降序
ORDER BY 子句在SELECT語句的結(jié)尾。
SELECT last_name, job_id, department_id, hire_date
FROM employees
ORDER BY hire_date ;
降序排序
SELECT last_name, job_id, department_id, hire_date
FROM employees
ORDER BY hire_date DESC ;
按別名排序
SELECT employee_id, last_name, salary*12 annsal
FROM employees
ORDER BY annsal;
多個列排序
按照ORDER BY 列表的順序排序
SELECT last_name, department_id, salary
FROM employees
ORDER BY department_id, salary DESC;
可以使用不在SELECT 列表中的列排序
十、分組函數(shù)
什么是分組函數(shù)
分組函數(shù)作用于一組數(shù)據(jù),并對一組數(shù)據(jù)返回一個值。
組函數(shù)類型
? AVG()
? COUNT()
? MAX()
? MIN()
? SUM()
組函數(shù)語法
SELECT [column,] group_function(column), …
FROM table
[WHERE condition]
[GROUP BY column]
[ORDER BY column];
AVG(平均值)和 SUM (合計)函數(shù)
可以對數(shù)值型數(shù)據(jù)使用AVG 和 SUM 函數(shù)。
SELECT AVG(salary), MAX(salary),
MIN(salary), SUM(salary)
FROM employees
WHERE job_id LIKE ‘%REP%’;
MIN(最小值)和 MAX(最大值)函數(shù)
可以對任意數(shù)據(jù)類型的數(shù)據(jù)使用 MIN 和 MAX 函數(shù)。
SELECT MIN(hire_date), MAX(hire_date)
FROM employees;
COUNT(計數(shù))函數(shù)
COUNT() 返回表中記錄總數(shù),適用于任意數(shù)據(jù)類型。
SELECT COUNT()
FROM
employees
WHERE department_id = 50;
COUNT(expr) 返回expr不為空的記錄總數(shù)
SELECT COUNT(commission_pct)
FROM employees
WHERE department_id = 50;
分組數(shù)據(jù)
分組數(shù)據(jù): GROUP BY 子句語法
可以使用GROUP BY子句將表中的數(shù)據(jù)分成若干組
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
GROUP BY 子句 (?)
在SELECT 列表中所有未包含在組函數(shù)中的列都應(yīng)該包含在 GROUP BY 子句中
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id ;
包含在 GROUP BY 子句中的列不必包含在SELECT 列表中
SELECT AVG(salary)
FROM employees
GROUP BY department_id ;
使用多個列分組
SELECT department_id dept_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id ;
非法使用組函數(shù)
? 不能在 WHERE 子句中使用組函數(shù)。
? 可以在 HAVING 子句中使用組函數(shù)
SELECT department_id, AVG(salary)
FROM employees
WHERE AVG(salary) > 8000
GROUP BY department_id;
WHERE 子句中不能使用組函數(shù)
過濾分組
使用 HAVING 過濾分組:
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
HAVING 子句
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000 ;
十一、多表查詢
笛卡爾集
select name,boyName from beauty,boys; 這條語句對嗎?
為了避免笛卡爾集, 可以在 WHERE 加入有 效的連接條件
Mysql 連接
使用連接在多個表中查詢數(shù)據(jù)
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
在 WHERE 子句中寫入連接條件。
在表中有相同列時,在列名之前加上表名前綴
等值連接
SELECT beauty.id,NAME,boyname FROM beauty ,boys
WHERE beauty.boyfriend_id=boys.id;
區(qū)分重復(fù)的列名
? 使用表名前綴在多個表中區(qū)分相同的列。
? 在不同表中具有相同列名的列可以用表的別名加以區(qū)分。
? 如果使用了表別名,則在select語句中需要使用表別名代替表名
? 表別名最多支持32個字符長度,但建議越少越好
表的別名
? 使用別名可以簡化查詢。
? 使用表名前綴可以提高執(zhí)行效率。
SELECT bt.id,NAME,boyname
FROM beauty bt,boys b;
WHERE bt.boyfriend_id=b.id ;
Join連接
? 分類:
– 內(nèi)連接 [inner] join on
– 外連接
? 左外連接 left [outer] join on
? 右外連接 right [outer] join on
ON 子句
SELECT bt.id,NAME,boyname
FROM beauty bt
Inner join boys b
On bt.boyfriend_id=b.id ;
連接多個表
連接 n個表,至少需要 n-1個連接條件。
例如:連接三個表,至少需要兩個連接條件。
練習(xí):查詢出公司員工的 last_name, department_name, city
使用 ON 子句創(chuàng)建多表連接(重點(diǎn))
SELECT employee_id, city, department_name
FROM employees e
JOIN departments d
ON d.department_id = e.department_id
JOIN locations l
ON d.location_id = l.location_id;
John連接總結(jié)
十二、字符函數(shù)
大小寫控制函數(shù)
這類函數(shù)改變字符的大小寫。
LOWER(‘SQL Course’)
sql course
UPPER(‘SQL Course’)
SQL COURSE
字符控制函數(shù)
CONCAT(‘Hello’, ‘World’)
HelloWorld
SUBSTR(‘HelloWorld’,1,5)
Hello
LENGTH(‘HelloWorld’)
10
INSTR(‘HelloWorld’, ‘W’)
6
LPAD(salary,10,’*’)
*****24000
RPAD(salary, 10, ‘*’)
24000*****
TRIM(‘H’ FROM ‘HelloWorld’)
elloWorld
REPLACE(‘a(chǎn)bcd’,‘b’,‘m’)
amcd
十三、數(shù)字函數(shù)
ROUND: 四舍五入
ROUND(45.926, 2) 45.93
TRUNCATE: 截斷
TRUNC(45.926, 2) 45.92
MOD: 求余
MOD(1600, 300) 100
十四、日期函數(shù)
now:獲取當(dāng)前日期
str_to_date: 將日期格式的字符轉(zhuǎn)換成指定格式的日期
STR_TO_DATE(‘9-13-1999’,’%m-%d-%Y’) 1999-09-13
date_format:將日期轉(zhuǎn)換成字符
str_to_date: 將日期格式的字符轉(zhuǎn)換成指定格式的日期 2018年06月06日
十五、條件表達(dá)式
? 在 SQL 語句中使用IF-THEN-ELSE 邏輯
? 使用方法: – CASE 表達(dá)式
CASE 表達(dá)式
在需要使用 IF-THEN-ELSE 邏輯時
CASE expr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END
練習(xí):查詢部門號為 10, 20, 30 的員工信息, 若部門號為 10, 則打印其工資的 1.1 倍, 20 號部門, 則打印其工資的 1.2 倍, 30 號部門打印其工資的 1.3 倍數(shù)
下面是使用case表達(dá)式的一個例子:
SELECT department_id,salary,
CASE department_id
WHEN 10 THEN salary1.2
WHEN 20 THEN salary1.3
WHEN 30 THEN salary*1.5
ELSE salary
END 工資2
FROM employees
十六、數(shù)據(jù)操縱語言
DML(Data Manipulation Language –數(shù)據(jù)操縱語言) 可以在下列條件下執(zhí)行: – 向表中插入數(shù)據(jù)
– 修改現(xiàn)存數(shù)據(jù)
– 刪除現(xiàn)存數(shù)據(jù)
事務(wù)是由完成若干項(xiàng)工作的DML語句組成的
十七、插入數(shù)據(jù)
INSERT 語句語法
使用 INSERT 語句向表中插入數(shù)據(jù)。
INSERT INTO table [(column [, column…])]
VALUES (value [, value…]);
使用這種語法一次只能向表中插入一條數(shù)據(jù)
插入數(shù)據(jù)
為每一列添加一個新值。
? 按列的默認(rèn)順序列出各個列的值。
? 在 INSERT 子句中隨意列出列名和他們的值。
? 字符和日期型數(shù)據(jù)應(yīng)包含在單引號中。
INSERT INTO departments(department_id, department_name,
manager_id, location_id)
VALUES (70, ‘Public Relations’, 100, 1700);
INSERT INTO
employees(employee_id,last_name,email,hire_date,job_id)
VALUES (300,’Tom’,’tom@126.com’,to_date(‘2012-3-
21’,’yyyy-mm-dd’),’SA_RAP’);
向表中插入空值
隱式方式: 在列名表中省略該列的值
INSERT INTO departments (department_id, department_name )
VALUES (30, ‘Purchasing’);
顯示方式: 在VALUES 子句中指定空值。
INSERT INTO departments
VALUES (100, ‘Finance’, NULL, NULL);
插入指定的值
NOW()函數(shù):記錄當(dāng)前系統(tǒng)的日期和時間
INSERT INTO employees (employee_id, first_name, last_name, email, phone_number,hire_date, job_id, salary, commission_pct, manager_id,department_id)
VALUES (113, ‘Louis’, ‘Popp’, ‘LPOPP’, ‘515.124.4567’, NOW(), ‘AC_ACCOUNT’, 6900, NULL, 205, 100);
從其它表中拷貝數(shù)據(jù)
在 INSERT 語句中加入子查詢
INSERT INTO emp2
SELECT *
FROM employees
WHERE department_id = 90;
INSERT INTO sales_reps(id, name, salary, commission_pct)
SELECT employee_id, last_name, salary, commission_pct
FROM employees
WHERE job_id LIKE ‘%REP%’;
不必書寫 VALUES 子句。
子查詢中的值列表應(yīng)與 INSERT 子句中的列名對應(yīng)
十八、更新數(shù)據(jù)
UPDATE 語句語法
? 使用 UPDATE 語句更新數(shù)據(jù)
UPDATE table
SET column = value [, column = value, …]
[WHERE condition];
? 可以一次更新多條數(shù)據(jù)。
? 如果需要回滾數(shù)據(jù),需要保證在DML前,進(jìn)行設(shè)置:SET AUTOCOMMIT = FALSE;
? 使用 WHERE 子句指定需要更新的數(shù)據(jù)
UPDATE employees
SET department_id = 70
WHERE employee_id = 113;
? 如果省略 WHERE 子句,則表中的所有數(shù)據(jù)都將被更新
UPDATE copy_emp
SET department_id = 110;
更新中的數(shù)據(jù)完整性錯誤
UPDATE employees
SET department_id = 55
WHERE department_id = 110;
十九、刪除數(shù)據(jù)
DELETE 語句
使用 DELETE 語句從表中刪除數(shù)據(jù)。
DELETE FROM table
[WHERE condition];
刪除數(shù)據(jù)
使用 WHERE 子句刪除指定的記錄
DELETE FROM departments
WHERE department_name = ‘Finance’;
如果省略 WHERE 子句,則表中的全部數(shù)據(jù)將被刪除
DELETE FROM copy_emp;
刪除中的數(shù)據(jù)完整性錯誤
DELETE FROM departments
WHERE department_id = 60;
二十、子查詢
概念
出現(xiàn)在其他語句內(nèi)部的select語句,稱為子查詢或內(nèi)查詢,內(nèi)部嵌套其他select語句的查詢,稱為外查詢或主查詢
示例:
select first_name from employees where
department_id in(
select department_id from departments
where location_id=1700
)
注意事項(xiàng)
? 子查詢要包含在括號內(nèi)。
? 將子查詢放在比較條件的右側(cè)。
? 單行操作符對應(yīng)單行子查詢,多行操作符對應(yīng)多行子查詢
單行子查詢
? 只返回一行。
? 使用單行比較操作符。
子查詢語法
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table);
? 子查詢 (內(nèi)查詢) 在主查詢之前一次執(zhí)行完成。
? 子查詢的結(jié)果被主查詢(外查詢)使用 。
使用子查詢解決問題
誰的工資比 Abel 高?
執(zhí)行單行子查詢
題目:返回job_id與141號員工相同,salary比143號員工多的員工姓名,job_id 和工資
在子查詢中使用組函數(shù)
題目:返回公司工資最少的員工的last_name,job_id和salary
子查詢中的 HAVING 子句
? 首先執(zhí)行子查詢。
? 向主查詢中的HAVING 子句返回結(jié)果。
題目:查詢最低工資大于50號部門最低工資的部門id和其最低工資
非法使用子查詢
子查詢中的空值問題
SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE last_name = ‘Haas’);
子查詢不返回任何行
多行子查詢
? 返回多行。
? 使用多行比較操作符
使用in操作符
題目:返回location_id是1400或1700的部門中的所有員工姓名
在多行子查詢中使用 ANY 操作符
題目:返回其它部門中比job_id為‘IT_PROG’部門任一工資低的員工的員
工號、姓名、job_id 以及salary
題目:返回其它部門中比job_id為‘IT_PROG’部門所有工資都低的員工
的員工號、姓名、job_id 以及salary
子查詢中的空值問題
二十一、創(chuàng)建數(shù)據(jù)庫
創(chuàng)建一個保存員工信息的數(shù)據(jù)庫
– create database employees;
相關(guān)其他命令
– show databases;查看當(dāng)前所有數(shù)據(jù)庫
– use employees;“使用”一個數(shù)據(jù)庫,使其作為當(dāng)前數(shù)據(jù)庫
命名規(guī)則
? 數(shù)據(jù)庫名不得超過30個字符,變量名限制為29個 ? 必須只能包含 A–Z, a–z, 0–9, _共63個字符
? 不能在對象名的字符間留空格
? 必須不能和用戶定義的其他對象重名
? 必須保證你的字段沒有和保留字、數(shù)據(jù)庫系統(tǒng)或常用方法沖突
? 保持字段名和類型的一致性,在命名字段并為其指定數(shù)據(jù)類型的時候一定要保證一致性。假如數(shù)據(jù)類型在一個表里是整數(shù),那在另一個表里可就別變成字符型了
CREATE TABLE 語句
? 必須具備:
– CREATE TABLE權(quán)限
– 存儲空間
? 必須指定:
– 表名
– 列名, 數(shù)據(jù)類型, 尺寸
語法
確認(rèn)
常用數(shù)據(jù)類型
創(chuàng)建表
CREATE TABLE emp (
#int類型,自增
emp_id INT AUTO_INCREMENT, #最多保存20個中英文字符
emp_name CHAR (20),
#總位數(shù)不超過15位
salary DOUBLE,
#日期類型
birthday DATE,
#主鍵
PRIMARY KEY (emp_id)
) ;
使用子查詢創(chuàng)建表
? 使用 AS subquery 選項(xiàng),將創(chuàng)建表和插入數(shù)據(jù)結(jié)合起來(?)
? 指定的列和子查詢中的列要一一對應(yīng)
? 通過列名和默認(rèn)值定義列
復(fù)制現(xiàn)有的表:
create table emp1 as select * from employees;
create table emp2 as select * from employees where 1=2;
–創(chuàng)建的emp2是空表。
使用子查詢創(chuàng)建表舉例
二十二、ALTER TABLE 語句
使用 ALTER TABLE 語句可以實(shí)現(xiàn):
–向已有的表中添加列
?修改現(xiàn)有表中的列
–刪除現(xiàn)有表中的列
–重命名現(xiàn)有表中的列
追加一個新列
ALTER TABLE dept80
ADD job_id varchar(15);
修改一個列
? 可以修改列的數(shù)據(jù)類型, 尺寸和默認(rèn)值
? 對默認(rèn)值的修改只影響今后對表的修改
ALTER TABLE dept80
MODIFY (last_name VARCHAR(30));
ALTER TABLE dept80
MODIFY (salary double(9,2) default 1000);
刪除一個列
使用 DROP COLUMN 子句刪除不再需要的列.
ALTER TABLE dept80
DROP COLUMN job_id;
重命名一個列
使用 CHANGE old_column new_column dataType子句重命名列
ALTER TABLE dept80
CHANGE department_name dept_name varchar(15);
二十三、刪除表
? 數(shù)據(jù)和結(jié)構(gòu)都被刪除
? 所有正在運(yùn)行的相關(guān)事務(wù)被提交
? 所有相關(guān)索引被刪除
? DROP TABLE 語句不能回滾
DROP TABLE dept80;
清空表
? TRUNCATE TABLE 語句:
– 刪除表中所有的數(shù)據(jù)
– 釋放表的存儲空間
? TRUNCATE語句不能回滾
? 可以使用 DELETE 語句刪除數(shù)據(jù),可以回滾
二十四、改變對象的名稱
? 執(zhí)行RENAME語句改變表, 視圖的名稱
? 必須是對象的擁有者
ALTER table dept
RENAME TO detail_dept;
二十五、常見的數(shù)據(jù)類型
整型
小數(shù)
位類型
char和varchar類型
字符串類型 最多字符數(shù) 描述及存儲需求
說明:用來保存MySQL中較短的字符串。
binary和varbinary類型
說明:類似于char和varchar,不同的是它們包含二進(jìn)制字符串而不包含非二進(jìn)制字符串。
Enum類型
說明:又稱為枚舉類型哦,要求插入的值必須屬于列表中指定的值之一。
如果列表成員為1~255,則需要1個字節(jié)存儲
如果列表成員為255~65535,則需要2個字節(jié)存儲
最多需要65535個成員
Set類型
說明:和Enum類型類似,里面可以保存0~64個成員。和Enum類型最大的區(qū)別是:SET類型一次可以選取多個成員,而Enum只能選一個根據(jù)成員個數(shù)不同,存儲所占的字節(jié)也不同
日期類型
datetime和timestamp的區(qū)別
1、Timestamp支持的時間范圍較小,取值范圍:19700101080001——2038年的某個時間Datetime的取值范圍:1000-1-1 ——9999—12-31
2、timestamp和實(shí)際時區(qū)有關(guān),更能反映實(shí)際的日期,而datetime則只能反映出插入時的當(dāng)?shù)貢r區(qū)
3、timestamp的屬性受Mysql版本和SQLMode的影響很大
二十六、約束
什么是約束
? 為了保證數(shù)據(jù)的一致性和完整性,SQL規(guī)范以約束的方式對表數(shù)據(jù)進(jìn)行額外的條件限制。
? 約束是表級的強(qiáng)制規(guī)定
? 可以在創(chuàng)建表時規(guī)定約束(通過 CREATETABLE 語句),或者在表創(chuàng)建之后也可以(通
過 ALTER TABLE 語句)
有以下六種約束:
– NOT NULL 非空約束,規(guī)定某個字段不能為空
– UNIQUE 唯一約束,規(guī)定某個字段在整個表中是唯一的
– PRIMARY KEY 主鍵(非空且唯一) – FOREIGN KEY 外鍵
– CHECK 檢查約束
– DEFAULT 默認(rèn)值
具體細(xì)節(jié)可以參閱W3Cschool手冊
注意: MySQL不支持check約束,但可以使用check約束,而沒有任何效果;
? 根據(jù)約束數(shù)據(jù)列的限制,約束可分為:
– 單列約束:每個約束只約束一列
– 多列約束:每個約束可約束多列數(shù)據(jù)
? 根據(jù)約束的作用范圍,約束可分為:
– 列級約束只能作用在一個列上,跟在列的定義后面
– 表級約束可以作用在多個列上,不與列一起,而是單獨(dú)定義
NOT NULL 約束
非空約束用于確保當(dāng)前列的值不為空值,非空約束只能出現(xiàn)在表對象的列上。
Null類型特征:
?所有的類型的值都可以是null,包括int、float等數(shù)據(jù)類型
?空字符串””不等于null,0也不等于null
創(chuàng)建 not null 約束:
CREATE TABLE emp(
id INT(10) NOT NULL,
NAME VARCHAR(20) NOT NULL DEFAULT ‘a(chǎn)bc’,
sex CHAR NULL
);
增加 not null 約束
ALTER TABLE emp
MODIFY sex VARCHAR(30) NOT NULL;
取消 not null 約束:
ALTER TABLE emp
MODIFY sex VARCHAR(30) NULL;
取消 not null 約束,增加默認(rèn)值:
ALTER TABLE emp
MODIFY NAME VARCHAR(15) DEFAULT ‘a(chǎn)bc’ NULL;
UNIQUE 約束
? 同一個表可以有多個唯一約束,多個列組合的約束。在創(chuàng)建唯一約束的時候,如果不給唯一約束名稱,就默認(rèn)和列名相同。
? MySQL會給唯一約束的列上默認(rèn)創(chuàng)建一個唯一索引
? 唯一約束,允許出現(xiàn)多個空值:NULL。
CREATE TABLE USER(
id INT NOT NULL,
NAME VARCHAR(25),
PASSWORD VARCHAR(16),
#使用表級約束語法
CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD)
);
表示用戶名和密碼組合不能重復(fù)
添加唯一約束
ALTER TABLE USER
ADD UNIQUE(NAME,PASSWORD);
ALTER TABLE USER
ADD CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD);
ALTER TABLE USER
MODIFY NAME VARCHAR(20) UNIQUE;
刪除約束
ALTER TABLE USER
DROP INDEX uk_name_pwd;
PRIMARY KEY 約束
? 主鍵約束相當(dāng)于唯一約束+非空約束的組合,主鍵約束列不允許重復(fù),也不允許出現(xiàn)空值
? 如果是多列組合的主鍵約束,那么這些列都不允許為空值,并且組合的值不允許重復(fù)。
? 每個表最多只允許一個主鍵,建立主鍵約束可以在列級別創(chuàng)建,也可以在表級別上創(chuàng)建。
? MySQL的主鍵名總是PRIMARY,當(dāng)創(chuàng)建主鍵約束時,系統(tǒng)默認(rèn)會在所在的列和列組合上建立對應(yīng)的唯一索引。
CREATE TABLE emp4(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(20)
);
CREATE TABLE emp5(
id INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(20),
pwd VARCHAR(15),
CONSTRAINT emp5_id_pk PRIMARY KEY(id)
);
CREATE TABLE emp6(
id INT NOT NULL,
NAME VARCHAR(20),
pwd VARCHAR(15),
CONSTRAINT emp7_pk PRIMARY KEY(NAME,pwd)
);
刪除主鍵約束
ALTER TABLE emp5
DROP PRIMARY KEY;
添加主鍵約束
ALTER TABLE emp5
ADD PRIMARY KEY(NAME,pwd);
修改主鍵約束
ALTER TABLE emp5
MODIFY id INT PRIMARY KEY;
FOREIGN KEY 約束
? 外鍵約束是保證一個或兩個表之間的參照完整性,外鍵是構(gòu)建于一個表的兩個字段或是兩個表的兩個字段之間的參照關(guān)系。
? 從表的外鍵值必須在主表中能找到或者為空。當(dāng)主表的記錄被從表參照時,主表的記錄將不允許刪除,如果要刪除數(shù)據(jù),需要先刪除從表中依賴該記錄的數(shù)據(jù),然后才可以刪除主表的數(shù)據(jù)。
? 還有一種就是級聯(lián)刪除子表數(shù)據(jù)。
? 注意:外鍵約束的參照列,在主表中引用的只能是主鍵或唯一鍵約束的列
? 同一個表可以有多個外鍵約束
創(chuàng)建外鍵約束:
CREATE TABLE dept(
dept_id INT AUTO_INCREMENT PRIMARY KEY,
dept_name VARCHAR(20)
);
CREATE TABLE emp(
emp_id INT AUTO_INCREMENT PRIMARY KEY,
last_name VARCHAR(15),
dept_id INT,
);
創(chuàng)建多列外鍵組合,必須使用表級約束:
CREATE TABLE classes(
id INT,
NAME VARCHAR(20),
number INT,
PRIMARY KEY(NAME,number)
);
CREATE TABLE student(
id INT AUTO_INCREMENT PRIMARY KEY,
classes_name VARCHAR(20),
classes_number INT,
FOREIGN KEY(classes_name,classes_number)
REFERENCES classes(NAME,number)
);
? 刪除外鍵約束:
ALTER TABLE emp
DROP FOREIGN KEY emp_dept_id_fk;
? 增加外鍵約束:
ALTER TABLE emp
ADD [CONSTRAINT emp_dept_id_fk] FOREIGN KEY(dept_id)
REFERENCES dept(dept_id);
FOREIGN KEY 約束的關(guān)鍵字
– FOREIGN KEY: 在表級指定子表中的列
– REFERENCES: 標(biāo)示在父表中的列
–ON DELETE CASCADE(級聯(lián)刪除): 當(dāng)父表中的列被刪除時,子表中相對應(yīng)的列也被刪除
–ON DELETE SET NULL(級聯(lián)置空): 子表中相應(yīng)的列置空
CREATE TABLE student(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(20),
classes_name VARCHAR(20),
classes_number INT,
/表級別聯(lián)合外鍵/
FOREIGN KEY(classes_name, classes_number)
REFERENCES classes(NAME, number) ON DELETE CASCADE);
CHECK 約束
? MySQL可以使用check約束,但check約束對數(shù)據(jù)驗(yàn)證沒有任何作用,添加數(shù)據(jù)時,沒有任何錯誤或警告
CREATE TABLE temp(
id INT AUTO_INCREMENT,
NAME VARCHAR(20),
age INT CHECK(age > 20),
PRIMARY KEY(id)
);
二十七、MySQL中使用limit實(shí)現(xiàn)分頁
? 背景
–查詢返回的記錄太多了,查看起來很不方便,怎么樣能夠?qū)崿F(xiàn)分頁查詢呢?
? 分頁原理
–所謂分頁顯示,就是將數(shù)據(jù)庫中的結(jié)果集,一段一段顯示出來需要的條件
MySQL中使用limit實(shí)現(xiàn)分頁
? 怎么分段,當(dāng)前在第幾段(每頁有幾條,當(dāng)前在第幾頁)
–前10條記錄:SELECT * FROM table LIMIT 0,10;
–第11至20條記錄:SELECT * FROM table LIMIT 10,10;
–第21至30條記錄: SELECT * FROM table LIMIT 20,10;
? 公式:
(當(dāng)前頁數(shù)-1)*每頁條數(shù),每頁條數(shù)
SELECT * FROM table LIMIT(PageNo - 1)*PageSize,PageSize; ? 注意:
–limit子句必須放在整個查詢語句的最后!
二十八、事務(wù)
事務(wù)的概念
事務(wù):事務(wù)由單獨(dú)單元的一個或多個SQL語句組成,在這個單元中,每個MySQL語句是相互依賴的。而整個單獨(dú)單元作為一個不可分割的整體,如果單元中某條SQL語句一旦執(zhí)行失敗或產(chǎn)生錯誤,整個單元將會回滾。所有受到影響的數(shù)據(jù)將返回到事物開始以前的狀態(tài);如果單元中的所有SQL語句均執(zhí)行成功,則事物被順利執(zhí)行
MySQL 中的存儲引擎[了解]
1、概念:在mysql中的數(shù)據(jù)用各種不同的技術(shù)存儲在文件(或內(nèi)存)中。
2、通過show engines;來查看mysql支持的存儲引擎。
3、 在mysql中用的最多的存儲引擎有:innodb,myisam ,memory 等。其中innodb支持事務(wù),而myisam、memory等不支持事務(wù)
事務(wù)的特點(diǎn)(重點(diǎn))
事務(wù)的ACID(acid)屬性
–1. 原子性(Atomicity)
原子性是指事務(wù)是一個不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。
–2. 一致性(Consistency)
事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另外一個一致性狀態(tài)。
–3. 隔離性(Isolation)
事務(wù)的隔離性是指一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾,即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾。
–4. 持久性(Durability)
持久性是指一個事務(wù)一旦被提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,接下來的其他操作和數(shù)據(jù)庫故障不應(yīng)該對其有任何影響
事務(wù)的使用
以第一個 DML 語句的執(zhí)行作為開始
以下面的其中之一作為結(jié)束:
–COMMIT 或 ROLLBACK 語句
–DDL 或 DCL 語句(自動提交)
–用戶會話正常結(jié)束
–系統(tǒng)異常終了
數(shù)據(jù)庫的隔離級別
對于同時運(yùn)行的多個事務(wù), 當(dāng)這些事務(wù)訪問數(shù)據(jù)庫中相同的數(shù)據(jù)時, 如果沒有采取必要的隔離機(jī)制, 就會導(dǎo)致各種并發(fā)問題:
–臟讀: 對于兩個事務(wù) T1, T2, T1 讀取了已經(jīng)被 T2 更新但還沒有被提交的字段. 之后, 若 T2 回滾, T1讀取的內(nèi)容就是臨時且無效的.
–不可重復(fù)讀: 對于兩個事務(wù)T1, T2, T1 讀取了一個字段, 然后 T2 更新了該字段. 之后, T1再次讀取同一個字段, 值就不同了.
–幻讀: 對于兩個事務(wù)T1, T2, T1 從一個表中讀取了一個字段, 然后 T2 在該表中插 入了一些新的行. 之后, 如果 T1 再次讀取同一個表, 就會多出幾行.
數(shù)據(jù)庫事務(wù)的隔離性: 數(shù)據(jù)庫系統(tǒng)必須具有隔離并發(fā)運(yùn)行各個事務(wù)的能力, 使它們不會相互影響, 避免各種并發(fā)問題.
一個事務(wù)與其他事務(wù)隔離的程度稱為隔離級別. 數(shù)據(jù)庫規(guī)定了多種事務(wù)隔離級別, 不同隔離級別對應(yīng)不同的干擾程度, 隔離級別越高, 數(shù)據(jù)一致性就越好, 但并發(fā)性越弱
數(shù)據(jù)庫提供的 4 種事務(wù)隔離級別
Oracle 支持的 2 種事務(wù)隔離級別:READ COMMITED, SERIALIZABLE。 Oracle 默認(rèn)的事務(wù)隔離級別為: READ COMMITED
Mysql 支持 4 種事務(wù)隔離級別. Mysql 默認(rèn)的事務(wù)隔離級別為: REPEATABLE READ
在 MySql 中設(shè)置隔離級別
每啟動一個 mysql 程序, 就會獲得一個單獨(dú)的數(shù)據(jù)庫連接. 每個數(shù)據(jù)庫連接都有一個全局變量 @@tx_isolation, 表示當(dāng)前的事務(wù)隔離級別.
查看當(dāng)前的隔離級別: SELECT @@tx_isolation;
設(shè)置當(dāng)前 mySQL 連接的隔離級別:
–set transaction isolation level read committed;
設(shè)置數(shù)據(jù)庫系統(tǒng)的全局的隔離級別:
–set global transaction isolation level read committed;
二十九、視圖
? 概念
視圖:MySQL從5.0.1版本開始提供視圖功能。一種虛擬存在的表,行和列的數(shù)據(jù)來自定義視圖的查詢中使用的表,并且是在使用視圖時動態(tài)生成的,只保存了sql邏輯,不保存查詢結(jié)果
? 應(yīng)用場景:
– 多個地方用到同樣的查詢結(jié)果
– 該查詢結(jié)果使用的sql語句較復(fù)雜
? 示例:
CREATE VIEW my_v1
AS
SELECT studentname,majorname
FROM student s
INNER JOIN major m
ON s.majorid=m.majorid
WHERE s.majorid=1;
常見題目
1.查詢郵箱中包含a字符的員工名、部門名和工種信息
2.查詢各部門的平均工資
3.查詢平均工資最低的部門信息
4.查詢平均工資最低的部門名和工資
視圖的好處
? 重用sql語句
? 簡化復(fù)雜的sql操作,不必知道它的查詢細(xì)節(jié)
? 保護(hù)數(shù)據(jù),提高安全性
創(chuàng)建或者修改視圖
? 創(chuàng)建視圖的語法:
create [or replace] view view_name
As select_statement
[with|cascaded|local|check option]
? 修改視圖的語法:
alter view view_name
As select_statement
[with|cascaded|local|check option]
視圖的可更新性和視圖中查詢的定義有關(guān)系,以下類型的視圖是不能更新的。
? 包含以下關(guān)鍵字的sql語句:分組函數(shù)、distinct、group by、having、union或者union all
? 常量視圖
? Select中包含子查詢
? join
? from一個不能更新的視圖
? where子句的子查詢引用了from子句中的表
刪除視圖
? 刪除視圖的語法:
用戶可以一次刪除一個或者多個視圖,前提是必須有該視圖的drop權(quán)限。
drop view [if exists] view_name,view_name …[restrict|cascade]
查看視圖
? 查看視圖的語法:
show tables;
如果需要查詢某個視圖的定義,可以使用show create view命令進(jìn)行查看:
show create view view_name \G
三十、存儲過程和函數(shù)
什么是存儲過程和函數(shù)
存儲過程和函數(shù):
事先經(jīng)過編譯并存儲在數(shù)據(jù)庫中的一段sql語句的集合。
使用好處:
1、簡化應(yīng)用開發(fā)人員的很多工作
2、減少數(shù)據(jù)在數(shù)據(jù)庫和應(yīng)用服務(wù)器之間的傳輸
3、提高了數(shù)據(jù)處理的效率
創(chuàng)建存儲過程或函數(shù)
? 創(chuàng)建存儲過程:
create procedure 存儲過程名 ([proc_parameter[,…]])
[characteristic…]routine_body
? 創(chuàng)建函數(shù):
create function 函數(shù)名([func_parameter[,…]])
returns type
[characteristic…]routine_body
語法解釋
? proc_parameter: [in|out|inout] param_name type
? Func_paramter:param_name type
? Type:
任何有效的mysql數(shù)據(jù)類型
? Characteristic:
language sql(默認(rèn),且推薦)
|[not] deterministic
|{contains sql|no sql|reads sql data|modifies sql data}
|sql security{definer|invoker}
|comment ‘string’
? Rountine_body:
有效的sql 過程語句
調(diào)用存儲過程或函數(shù)
? 調(diào)用存儲過程:
call 存儲過程名(參數(shù)列表)
? 調(diào)用函數(shù):
Select 函數(shù)名(參數(shù)列表)
案例
? 查詢員工名為king的所有記錄
? 根據(jù)輸入的員工名,查詢部門名
? 根據(jù)指定的員工編號,返回工資
? 根據(jù)指定的員工編號,返回工資和部門號
? 將輸入的a和b都翻倍并返回
修改存儲過程或函數(shù)
? 修改存儲過程:
alter procedure 存儲過程名 [charactristic…]
? 修改函數(shù):
alter function 函數(shù)名 [charactristic…]
characteristic:
{contains sql|no sql|reads sql data|modifies sql data}
|sql security{definer|invoker}
|comment ‘string’
刪除存儲過程或函數(shù)
說明:一次只能刪除一個存儲過程或者函數(shù),并且要求有該過程或函數(shù)的alter routine 權(quán)限
刪除存儲過程:
drop procedure [if exists] 存儲過程名
刪除函數(shù):
drop function [if exists] 函數(shù)名
查看存儲過程或函數(shù)
1.查看存儲過程或函數(shù)的狀態(tài):
show {procedure|function} status like 存儲過程或函數(shù)名
2.查看存儲過程或函數(shù)的定義:
show create {procedure|function} 存儲過程或函數(shù)名
3.通過查看information_schema.routines了解存儲過程和函數(shù)的信息(了解)
select * from rountines where rounine_name =存儲過程名|函數(shù)名
三十一、數(shù)據(jù)庫設(shè)計
為什么需要設(shè)計數(shù)據(jù)庫
良好的數(shù)據(jù)庫設(shè)計
-節(jié)省數(shù)據(jù)的存儲空間
-能夠保證數(shù)據(jù)的完整性
-方便進(jìn)行數(shù)據(jù)庫應(yīng)用系統(tǒng)的開發(fā)
軟件項(xiàng)目開發(fā)周期中數(shù)據(jù)庫設(shè)計
設(shè)計數(shù)據(jù)庫的步驟
收集信息
與該系統(tǒng)有關(guān)人員進(jìn)行交流、座談,充分了解用戶需求,理解數(shù)據(jù)庫需要完成的任務(wù)
標(biāo)識實(shí)體 (Entity)
標(biāo)識數(shù)據(jù)庫要管理的關(guān)鍵對象或?qū)嶓w,實(shí)體一般是名詞
標(biāo)識每個實(shí)體的屬性(Attribute)
標(biāo)識實(shí)體之間的關(guān)系(Relationship)
E-R圖
轉(zhuǎn)化E-R圖為數(shù)據(jù)庫模型圖
將各實(shí)體轉(zhuǎn)換為對應(yīng)的表,將各屬性轉(zhuǎn)換為各表對應(yīng)的列
標(biāo)識每個表的主鍵列
在表之間建立主外鍵,體現(xiàn)實(shí)體
為什么需要數(shù)據(jù)規(guī)范化
不合規(guī)范的表設(shè)計
信息重復(fù)
更新異常
插入異常
無法正確表示信息
刪除異常
丟失有效信息
第一范式 (1st NF)
第一范式的目標(biāo)是確保每列的原子性
如果每列都是不可再分的最小數(shù)據(jù)單元(也稱為最小的原子單元),則滿足第一范式(1NF)
第二范式 (2nd NF)
第二范式要求每個表只描述一件事情
第三范式 (3nd NF)
如果一個關(guān)系滿足2NF,并且除了主鍵以外的其他列都不傳遞依賴于主鍵列,則滿足第三范式(3NF)
總結(jié)
以上是生活随笔為你收集整理的数据库知识点汇总(最全!!)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将json数据转换成实体对象 JSON格
- 下一篇: KDD数据库知识发现流程