【MySQL】學習筆記之MySQL基礎總結

點擊筆記原文目錄可快速查看指定內容

點擊鏈接:最新筆記原文(同步)

> 數據庫概述

– 數據庫的特點和好處

  1. 永久性存儲數據,藉助數據庫軟件,最終將數據存儲到本地
  2. 方便管理和查詢
  3. 共享
  4. 安全

– 數據庫軟件

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 字段名,字段名…… 
from1 別名,表2 別名…… 
where1的別名.字段=2的別名.字段 
and1的別名.字段=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

    1. 兩個表的順序不能調換
    2. Outer可以省略
    3. 一般用外連接查詢 一個表有但另一個表中沒有的字段

— 自連接|非自連接

  • **自連接:**查詢一張表中含義一樣的兩個字段
  • 案例:查詢員工姓名、領導的姓名
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語句的執行效果

  • 單行子查詢:子查詢的結果集爲一個值

  • 多行子查詢:子查詢的結構集爲一組值

— 單行子查詢

  1. 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' 
 );

– 數據分頁查詢

  • 語法
selectfromlimit 起始索引,行數
  • 注意:

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  新表  【asselect  *  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

  • 原子性:一個事務 是不可分割的!要麼一起執行,要麼都不執行
  • 一致性:數據的準確性
  • 隔離性:一個事務和另外的事務之間隔離開來,每一個事務是獨立,互不影響
  • 持久性:一個事務一旦提交,將永久更新到本地

— 事務分類

  • 隱式事務
  1. 每條 insert、update、delete語句都可以看做一個獨立的事務
  2. 沒有明顯的事務開啓和結束的標記,所以稱爲隱式事務
  • 顯式事務
  1. 多條更新語句合併成爲一個事務,需要有明顯的事務開啓和結束標記

— 用法

①取消每條增刪改的自動提交

set  autocommit =0;

②開啓一個新事務

Start  transaction; 
UPDATE stuinfo SET sex='男' WHERE majorId=2; 
UPDATE stuinfo SET sex='女' WHERE majorId = 3;

③結束事務

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