點擊筆記原文目錄可快速查看指定內容
點擊鏈接:最新筆記原文(同步)
文章目錄
> 數據庫概述
– 數據庫的特點和好處
- 永久性存儲數據,藉助數據庫軟件,最終將數據存儲到本地
- 方便管理和查詢
- 共享
- 安全
– 數據庫軟件
Oracle、db2、sybase、sqlserver、mysql、access、baseX、sqlite
Mysql優點:體積小、開源代碼、節約成本
> DML——數據查詢
– 基本查詢
- 語法:
select * from 表名 where 條件
– 條件查詢
— between……and關鍵字
- 查詢employee_id在100到120之間的
select * from employees where employee_id between 100 and 120;
— or關鍵字
- 查詢job_id 爲 ‘IT_PROG’或’AD_PU’
select * from employees where job_id ='IT_PROG'or job_id = 'AD_PU';
— and關鍵字
- 查詢姓名 第二個字符 爲’a’ 和 第三個字符爲’a’
select * from employees where first_name like '_a%' and first_name like '__a%';
— in關鍵字
- 查詢job_id 爲 ‘IT_PROG’或’AD_PU’
select * from employees where job_id in ('IT_PROG','AD_PU');
— like關鍵字
- 查詢姓名 第二個字符 爲’a’ 和 第三個字符爲’a’
select * from employees where first_name like '_a%' and first_name like '__a%';
— 轉義:escape關鍵字
- 查詢 姓名 第二個字符爲_的員工信息(包含轉義字符)
SELECT * FROM employees WHERE first_name LIKE '_$_%' ESCAPE '$';
— not關鍵字
- 判斷某列爲空
select * from employees where commission_pac is null; select * from employees where commission_pac is not null;
– 查詢排序
關鍵字:order by
ASC 升序排序
DESC 降序排序
— 按列排序
SELECT * FROM employees WHERE salary>2000 ORDER BY department_id DESC,salary desc;
— 按表達式或函數排序
SELECT * FROM employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC
— 按別名排序
SELECT salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY 年薪 DESC;
-
注:起 別名 的格式
①字段名 別名
②字段名 ‘別名’
③字段名 “別名”
– 多表查詢
- 查詢的字段來自不同的表
- 笛卡爾積出現原因:兩個表的連接,缺少連接條件,,結果爲兩個表記錄條數的乘積
— 等值連接|非等值連接
- 等值連接:
select 字段名,字段名……
from 表1 別名,表2 別名……
where 表1的別名.字段=表2的別名.字段
and 表1的別名.字段=表3的別名.字段 ……
- 非等值連接:
SELECT last_name,salary,grade_level
FROM employees e,job_grades g
WHERE salary BETWEEN lowest_sal AND highest_sal;
— 內連接|外鏈接
- 內連接:
Inner join ... On..
注意:inner 和 outer 可以省略
表沒有順序關係
-
外鏈接:
-
外連接結果: 內連接的結果 + 主表中有 但從表中沒有 的字段
left outer join ... on ...
right outer join ... On ...
注意: Mysql沒有全外連接:full join … On
-
- 兩個表的順序不能調換
- Outer可以省略
- 一般用外連接查詢 一個表有但另一個表中沒有的字段
— 自連接|非自連接
- **自連接:**查詢一張表中含義一樣的兩個字段
- 案例:查詢員工姓名、領導的姓名
SELECT a.employee_id,a.first_name 員工姓名,a.manager_id,b.first_name領導名稱
FROM employees a
INNER JOIN employees b
ON a.`manager_id`=b.`employee_id`;
– 單行函數
- 給一個值,返回一個結果
— 日期函數
select now(); //獲取當前時間(日期+時間)
— 字符函數
①轉換大小寫:upper lower
SELECT UPPER('SQL Course'); SELECT LOWER('SQL Course');
②拼接字符串:concat
SELECT CONCAT('Hello', 'World');
③截取子串(sql中 索引從1開始):substr
SELECT SUBSTR('HelloWorld',1,5);
④獲取字節個數:length
SELECT LENGTH('Hello,光頭強');
⑤獲取字符第一次出現的索引: instr
SELECT INSTR('HelloWorlWod', 'Wo');
⑥用指定的字符,填充指定的位數:lpad rpad
SELECT LPAD(salary,10,'a' ) FROM employees; SELECT RPAD(salary, 20, '*') FROM employees;
⑦去前後 指定的字符:trim
SELECT TRIM(' ' FROM ' HelloHHHHW oHHHrldHHHHH ');
⑧替換:replace
SELECT REPLACE('abcdbbb','b','xxx');
— 數學函數
①四捨五入:round
SELECT ROUND(45.926, -1);
②截短:truncate
SELECT TRUNCATE(123.56,-1);
③求餘:mod
SELECT MOD(-1600, 300)
— 條件表達式
①case語句
case 條件表達式 when 常量1 then 值1 when 常量2 then 值2 …… else 值3 End
- 【案例】查詢員工表的新工資、原始工資和部門,其中 部門編號爲90,工資爲原來 1.1倍;部門編號爲100,工資爲原來的1.2倍;其他部門,保持原值
SELECT department_id,salary 原始工資,
CASE department_id
WHEN 90 THEN salary*1.1
WHEN 100 THEN salary*1.2
ELSE salary END 新工資
FROM employees;
②if語句
If(條件表達式,值1,值2) :如果條件表達式成立,返回值1;否則,返回值2
- 【案例】查詢員工的編號、獎金、以及備註
SELECT employee_id,commission_pct,
IF(commission_pct IS NULL,'bad','good') 備註
FROM employees;
– 分組函數
① max() 最大值
min() 最小值
sum() 和
avg() 平均值
count() 計數
②忽略null值
③count(*) 統計行數
④分組函數可以嵌套單行函數
⑤分組函數不可以嵌套分組函數
⑥分組函數查詢一般不和其他字段一起
– 分組查詢
- 關鍵字:group by
- 關鍵字:having 分組後的條件
- 【案例】查看每個部門的人數,部門人數大於1
SELECT department_id 部門號 ,COUNT(employee_id) 人數
FROM employees
GROUP BY 部門號
HAVING 人數>1;
– 子查詢
-
特點:
①子查詢要先於外查詢執行,外查詢用到了子查詢的結果
②子查詢的語句最好用小括號括起來
③子查詢代替了多條sql語句的執行效果 -
單行子查詢:子查詢的結果集爲一個值
-
多行子查詢:子查詢的結構集爲一組值
— 單行子查詢
- where子句用上子查詢
- 【案例】誰的工資比Abel高
SELECT employee_id,last_name,salary
FROM employees WHERE salary > (
SELECT salary
FROM employees
WHERE last_name = 'Abel'
);
having子句用到了子查詢
- 【案例】查詢最低工資大於50號部門最低工資的部門id和其最低工資
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id
HAVING MIN(salary)>(
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
);
子查詢用到了分組函數
- 【案例】查詢公司最低工資
SELECT last_name,job_id,salary
FROM employees
WHERE salary=(
SELECT MIN(salary)
FROM employees
);
子查詢非法使用情況: 子查詢結果集爲多個;子查詢結果集爲null
— 多行子查詢
-
關鍵字:in、Any、All
-
【案例】返回其它部門中比job_id爲‘IT_PROG’部門任一工資低的員工的員工
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary<ANY(
SELECT salary
FROM employees
WHERE job_id = 'IT_PROG'
);
– 數據分頁查詢
- 語法:
select 列 from 表 limit 起始索引,行數
- 注意:
1、索引從 0開始
2、limit子句永遠放在最後
3、分頁查詢
- 步驟1:規定每頁的條目數 :5
- 步驟2:指定的頁數的起始索引
- limit (頁數-1)*條目數,條目數
- 【案例】顯示第三頁的所有的記錄
SELECT * FROM employees LIMIT 10,5;
– 數據增加(插入)
- 語法
insert into 表名【(字段名,字段名,……)】 values (值1,值2,……)
- 注意:
①非空列必須插入值
②字段的個數、類型、約束 和值的個數、類型、約束 必須一致
③字段名可以省略,但默認全部字段
④插入數據可以導入數據(複製數據):
insert into 表1 select * from表2
【案例】
INSERT INTO stuinfo(id,stuname,sex,borndate,majorId) VALUES(1,'張翠山','男','2000-9-9',2);
– 數據修改
- 語法
updata 表名 set 列名 = 新值 where 條件
- 【案例】
Update stuinfo set sex =’女’ , borndate = now() Where stuname =’周芷若’;
– 數據刪除
- 語法:
①delete from 表名 where 條件
②truncate table 表名
-
二者的區別:
①方式一可以加where條件,方式二不可以加
②方式二效率高
③方式二連着日誌文件一起刪除
> DDL數據定義語言
– 操作數據庫
創建庫:create database 數據庫名; 刪除庫:drop database 數據庫名;
– 操作表
創建表: create table 表名( 字段名 數據類型 【約束】 字段名 數據類型 【約束】 …… 字段名 數據類型【約束】 );
- 【案例】
CREATE TABLE student(
id INT NOT NULL,
sname VARCHAR(20) NOT NULL,
sex CHAR(1) NOT NULL,
majorId INT
);
– 刪除表結構
drop table 表名;
– 修改表結構:
—添加字段
Alter table 表名 add column 字段名 類型;
— 修改字段
Alter table 表名 modify column 字段名 類型;
— 刪除字段
Alter table 表名 drop column 字段名;
— 重命名字段
Alter table 表名 change 列名 新列名 類型;
— 重命名錶
Alter table 表名 rename 新表名;
— 複製表(結構/數據)
- 只複製表中的結構
Create table 新表 like 舊錶;
- 既複製結構也複製數據
Create table 新表 【as】 select * from 舊錶;
– 數據庫約束
— not null 非空約束
規定某個字段不能爲空
— Unique 唯一約束(可以爲空)
規定某個字段在整個表中是唯一的
— Primary key 主鍵約束(非空且唯一)
可以添加組合主鍵,但只能加表級約束
— Foreign key 外鍵約束
1、在從表中設置外鍵關係列
2、引用的列 在主表中必須是主鍵(非空唯一)
3、引用的列和外鍵列的類型必須是一致,名稱可以不一樣
4、插入數據先插入主表,刪除數據先刪除從表
— Check 檢查約束
check(列<100)
1、語法不報錯
2、mysql不支持此約束,也就是沒效果
— Default 默認值
- default 值;
- 插入時可以遵循以下語法
INSERT INTO score(id,stuid,majorId) VALUES(3,1,1);
INSERT INTO score VALUES(4,1,2,DEFAULT);
INSERT INTO score VALUES(4,1,2);
— Auto_increment 自增長
- 自增長列必須是數值類型
- 一個表至多有一個
- 在MySQL裏自增列,必須是一個鍵,建議和主鍵搭配
【案例】
CREATE TABLE test(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10) DEFAULT '大力'NOT NULL
);
— 創建表時添加約束(列、表)
-
列級約束
-
設計列的時候 後面追加對應的約束
create table 表( id int not null primary key 列級約束的寫法 )
- 語法:
列名 類型 not null 列名 類型 unique 列名 類型 primary key 列名 類型 check(條件) 列名 類型 default 值
-
表級約束
-
設計表的時候,對所有列的添加約束
-
語法:
CONSTRAINT pk PRIMARY KEY(id), 主鍵
constraint uq unique(stuid), 唯一
CONSTRAINT ck CHECK(score>=0 AND score<=100), 檢查
CONSTRAINT fk FOREIGN KEY(stuid) REFERENCES stuinfo(id) 外鍵
- 注意:非空、默認只能添加列級約束,外鍵只能添加表級約束
【表級約束案例】
CREATE TABLE score(
id INT ,
stuid INT ,
majorId INT ,
score FLOAT DEFAULT 100,
CONSTRAINT pk PRIMARY KEY(id),
CONSTRAINT uq UNIQUE(stuid),
CONSTRAINT ck CHECK(score>=0 AND score<=100),
CONSTRAINT fk FOREIGN KEY(stuid) REFERENCES stuinfo(id)
);
> DCL數據控制語言
關鍵字: commit 提交
rollback回滾
savepoint設置保存點
– 數據庫事務
-
每條增刪改(查不是)語句 都是自動開啓的事務
-
事務 是數據庫的特有概念,目的是爲了讓數據 從一種狀態 到另一種狀態
— 事務特點:ACID
- 原子性:一個事務 是不可分割的!要麼一起執行,要麼都不執行
- 一致性:數據的準確性
- 隔離性:一個事務和另外的事務之間隔離開來,每一個事務是獨立,互不影響
- 持久性:一個事務一旦提交,將永久更新到本地
— 事務分類
- 隱式事務:
- 每條 insert、update、delete語句都可以看做一個獨立的事務
- 沒有明顯的事務開啓和結束的標記,所以稱爲隱式事務
- 顯式事務:
- 多條更新語句合併成爲一個事務,需要有明顯的事務開啓和結束標記
— 用法
①取消每條增刪改的自動提交
set autocommit =0;
②開啓一個新事務
Start transaction;
UPDATE stuinfo SET sex='男' WHERE majorId=2;
UPDATE stuinfo SET sex='女' WHERE majorId = 3;
③結束事務
Rollback; #回滾 Commit; #提交