一、數據庫存儲數據的特點
1、將數據放到表中,表再放到庫中
2、一個數據庫中可以有多個表,每個表都有一個的名字,用來標識自己。表名具有唯一性。
3、表具有一些特性,這些特性定義了數據在表中如何存儲,類似java中 “類”的設計。
4、表由列組成,我們也稱為字段。所有表都是由一個或多個列組成的,每一列類似java 中的”屬性”
5、表中的數據是按行存儲的,每一行類似於java中的“對象”。
二、MySQL產品的基礎操作
(一)MySQL服務的啟動和停止
方式一:計算機——右擊管理——服務
方式二:通過管理員身份運行
net start 服務名(啟動服務)
net stop 服務名(停止服務)
(二) MySQL服務的登錄和退出
方式一:通過mysql自帶的客戶端
只限於root用戶
方式二:通過windows自帶的客戶端
登錄:
mysql 【-h主機名 -P端口號 】-u用戶名 -p密碼
退出:
exit或ctrl+C
(三) MySQL的常見命令
1.查看當前所有的數據庫
show databases;
2.打開指定的庫
use 庫名
3.查看當前庫的所有表
show tables;
4.查看其它庫的所有表
show tables from 庫名;
5.創建表
create table 表名(
列名 列類型,
列名 列類型,
。。。
);
6.查看表結構
desc 表名;
7.查看服務器的版本
方式一:登錄到mysql服務端
select version();
方式二:沒有登錄到mysql服務端
mysql --version
或
mysql --V
(四) MySQL的語法規范
1.不區分大小寫,但建議關鍵字大寫,表名、列名小寫
2.每條命令最好用分號結尾
3.每條命令根據需要,可以進行縮進 或換行
4.注釋
單行注釋:#注釋文字
單行注釋:-- 注釋文字
多行注釋:/* 注釋文字 */
(五) SQL的語言分類
DQL(Data Query Language):數據查詢語言
select
DML(Data Manipulate Language):數據操作語言
insert 、update、delete
DL(Data Define Languge):數據定義語言
create、drop、alter
TCL(Transaction Control Language):事務控制語言
commit、rollback
(六) SQL的常見命令
show databases; 查看所有的數據庫
use 庫名; 打開指定 的庫
show tables ; 顯示庫中的所有表
show tables from 庫名;顯示指定庫中的所有表
create table 表名(
字段名 字段類型,
字段名 字段類型
); 創建表
desc 表名; 查看指定表的結構
select * from 表名;顯示表中的所有數據
三、DQL語言的學習
(一) 基礎查詢
語法:
SELECT 要查詢的東西
【FROM 表名】;
類似於Java中 :System.out.println(要打印的東西);
特點:
過select查詢完的結果 ,是一個虛擬的表格,不是真實存在
1要查詢的東西 可以是常量值、可以是表達式、可以是字段、可以是函數
(二) 條件查詢
條件查詢:根據條件過濾原始表的數據,查詢到想要的數據
語法:
select
要查詢的字段|表達式|常量值|函數
from
表
where
條件 ;
分類:
一、條件表達式
示例:salary>10000
條件運算符:
> < >= <= = != <>
二、邏輯表達式
示例:salary>10000 && salary<20000
邏輯運算符:
and(&&):兩個條件如果同時成立,結果為true,否則為false
or(||):兩個條件只要有一個成立,結果為true,否則為false
not(!):如果條件成立,則not后為false,否則為true
三、模糊查詢
示例:last_name like 'a%'
(三) 排序查詢
語法:
select
要查詢的東西
from
表
where
條件
order by 排序的字段|表達式|函數|別名 【asc|desc】
(四) 常見函數
一、單行函數
1、字符函數
concat拼接
substr截取子串
upper轉換成大寫
lower轉換成小寫
trim去前后指定的空格和字符
ltrim去左邊空格
rtrim去右邊空格
replace替換
lpad左填充
rpad右填充
instr返回子串第一次出現的索引
length 獲取字節個數
2、數學函數
round 四舍五入
rand 隨機數
floor向下取整
ceil向上取整
mod取余
truncate截斷
3、日期函數
now當前系統日期+時間
curdate當前系統日期
curtime當前系統時間
str_to_date 將字符轉換成日期
date_format將日期轉換成字符
4、流程控制函數
if 處理雙分支
case語句 處理多分支
情況1:處理等值判斷
情況2:處理條件判斷
5、其他函數
version版本
database當前庫
user當前連接用戶
二、分組函數
sum 求和
max 最大值
min 最小值
avg 平均值
count 計數
特點:
1、以上五個分組函數都忽略null值,除了count(*)
2、sum和avg一般用於處理數值型
max、min、count可以處理任何數據類型
3、都可以搭配distinct使用,用於統計去重后的結果
4、count的參數可以支持:
字段、*、常量值,一般放1
建議使用 count(*)
四、分組查詢
語法:
select 查詢的字段,分組函數
from 表
group by 分組的字段
特點:
1、可以按單個字段分組
2、和分組函數一同查詢的字段最好是分組后的字段
3、分組篩選
針對的表 位置 關鍵字
分組前篩選: 原始表 group by的前面 where
分組后篩選: 分組后的結果集 group by的后面 having
4、可以按多個字段分組,字段之間用逗號隔開
5、可以支持排序
6、having后可以支持別名
五、多表連接查詢
笛卡爾乘積:如果連接條件省略或無效則會出現
解決辦法:添加上連接條件
一、傳統模式下的連接 :等值連接——非等值連接
1.等值連接的結果 = 多個表的交集
2.n表連接,至少需要n-1個連接條件
3.多個表不分主次,沒有順序要求
4.一般為表起別名,提高閱讀性和性能
二、sql99語法:通過join關鍵字實現連接
含義:1999年推出的sql語法
支持:
等值連接、非等值連接 (內連接)
外連接
交叉連接
語法:
select 字段,...
from 表1
【inner|left outer|right outer|cross】join 表2 on 連接條件
【inner|left outer|right outer|cross】join 表3 on 連接條件
【where 篩選條件】
【group by 分組字段】
【having 分組后的篩選條件】
【order by 排序的字段或表達式】
好處:語句上,連接條件和篩選條件實現了分離,簡潔明了!
三、自連接
案例:查詢員工名和直接上級的名稱
sql99
SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m ON e.`manager_id`=m.`employee_id`;
sql92
SELECT e.last_name,m.last_name
FROM employees e,employees m
WHERE e.`manager_id`=m.`employee_id`;
六、子查詢
含義:
一條查詢語句中又嵌套了另一條完整的select語句,其中被嵌套的select語句,稱為子查詢或內查詢
在外面的查詢語句,稱為主查詢或外查詢
特點:
1、子查詢都放在小括號內
2、子查詢可以放在from后面、select后面、where后面、having后面,但一般放在條件的右側
3、子查詢優先於主查詢執行,主查詢使用了子查詢的執行結果
4、子查詢根據查詢結果的行數不同分為以下兩類:
① 單行子查詢
結果集只有一行
一般搭配單行操作符使用:> < = <> >= <=
非法使用子查詢的情況:
a、子查詢的結果為一組值
b、子查詢的結果為空
② 多行子查詢
結果集有多行
一般搭配多行操作符使用:any、all、in、not in
in: 屬於子查詢結果中的任意一個就行
any和all往往可以用其他查詢代替
七、分頁查詢
應用場景:
實際的web項目中需要根據用戶的需求提交對應的分頁查詢的sql語句
語法:
select 字段|表達式,...
from 表
【where 條件】
【group by 分組字段】
【having 條件】
【order by 排序的字段】
limit 【起始的條目索引,】條目數;
特點:
1.起始條目索引從0開始
2.limit子句放在查詢語句的最后
3.公式:select * from 表 limit (page-1)*sizePerPage,sizePerPage
假如:
每頁顯示條目數sizePerPage
要顯示的頁數 page
八、聯合查詢
引入:
union 聯合、合並
語法:
select 字段|常量|表達式|函數 【from 表】 【where 條件】 union 【all】
select 字段|常量|表達式|函數 【from 表】 【where 條件】 union 【all】
select 字段|常量|表達式|函數 【from 表】 【where 條件】 union 【all】
.....
select 字段|常量|表達式|函數 【from 表】 【where 條件】
特點:
1、多條查詢語句的查詢的列數必須是一致的
2、多條查詢語句的查詢的列的類型幾乎相同
3、union代表去重,union all代表不去重
九、DML語言
(一)插入
語法:
insert into 表名(字段名,...)
values(值1,...);
特點:
1、字段類型和值類型一致或兼容,而且一一對應
2、可以為空的字段,可以不用插入值,或用null填充
3、不可以為空的字段,必須插入值
4、字段個數和值的個數必須一致
5、字段可以省略,但默認所有字段,並且順序和表中的存儲順序一致
(二)修改
修改單表語法:
update 表名 set 字段=新值,字段=新值
【where 條件】
修改多表語法:
update 表1 別名1,表2 別名2
set 字段=新值,字段=新值
where 連接條件
and 篩選條件
(三)刪除
方式1:delete語句
單表的刪除: ★
delete from 表名 【where 篩選條件】
多表的刪除:
delete 別名1,別名2
from 表1 別名1,表2 別名2
where 連接條件
and 篩選條件;
方式2:truncate語句
truncate table 表名
兩種方式的區別【面試題】
#1.truncate不能加where條件,而delete可以加where條件
#2.truncate的效率高一丟丟
#3.truncate 刪除帶自增長的列的表后,如果再插入數據,數據從1開始
#delete 刪除帶自增長列的表后,如果再插入數據,數據從上一次的斷點處開始
#4.truncate刪除不能回滾,delete刪除可以回滾
十、DDL語句
(一)庫和表的管理
庫的管理:
1、創建庫
create database 庫名
2、刪除庫
drop database 庫名
表的管理:
1、創建表
CREATE TABLE IF NOT EXISTS stuinfo(
stuId INT,
stuName VARCHAR(20),
gender CHAR,
bornDate DATETIME
);
DESC studentinfo;
2、 修改表 alter
語法:ALTER TABLE 表名 ADD|MODIFY|DROP|CHANGE COLUMN 字段名 【字段類型】;
#①修改字段名
ALTER TABLE studentinfo CHANGE COLUMN sex gender CHAR;
#②修改表名
ALTER TABLE stuinfo RENAME [TO] studentinfo;
#③修改字段類型和列級約束
ALTER TABLE studentinfo MODIFY COLUMN borndate DATE ;
#④添加字段
ALTER TABLE studentinfo ADD COLUMN email VARCHAR(20) first;
#⑤刪除字段
ALTER TABLE studentinfo DROP COLUMN email;
1、 刪除表
DROP TABLE [IF EXISTS] studentinfo;
(二)常見類型
整型:
小數:
浮點型
定點型
字符型:
日期型:
Blob類型:
(三)常見約束
NOT NULL
DEFAULT
UNIQUE
CHECK
PRIMARY KEY
FOREIGN KEY
十一、數據庫事務
(一)含義
通過一組邏輯操作單元(一組DML——sql語句),將數據從一種狀態切換到另外一種狀態
(二)特點
(ACID)
原子性:要么都執行,要么都回滾
一致性:保證數據的狀態操作前和操作后保持一致
隔離性:多個事務同時操作相同數據庫的同一個數據時,一個事務的執行不受另外一個事務的干擾
持久性:一個事務一旦提交,則數據將持久化到本地,除非其他事務對其進行修改
相關步驟:
1、開啟事務
2、編寫事務的一組邏輯操作單元(多條sql語句)
3、提交事務或回滾事務
(四)事務的分類:
隱式事務,沒有明顯的開啟和結束事務的標志
比如
insert、update、delete語句本身就是一個事務
顯式事務,具有明顯的開啟和結束事務的標志
1、開啟事務
取消自動提交事務的功能
2、編寫事務的一組邏輯操作單元(多條sql語句)
insert
update
delete
3、提交事務或回滾事務
(五)使用到的關鍵字
set autocommit=0;
start transaction;
commit;
rollback;
savepoint 斷點
commit to 斷點
rollback to 斷點
(六)事務的隔離級別:
事務並發問題如何發生?
當多個事務同時操作同一個數據庫的相同數據時
事務的並發問題有哪些?
臟讀:一個事務讀取到了另外一個事務未提交的數據
不可重復讀:同一個事務中,多次讀取到的數據不一致
幻讀:一個事務讀取數據時,另外一個事務進行更新,導致第一個事務讀取到了沒有更新的數據
如何避免事務的並發問題?
通過設置事務的隔離級別
1、READ UNCOMMITTED
2、READ COMMITTED 可以避免臟讀
3、REPEATABLE READ 可以避免臟讀、不可重復讀和一部分幻讀
4、SERIALIZABLE可以避免臟讀、不可重復讀和幻讀
設置隔離級別:
set session|global transaction isolation level 隔離級別名;
查看隔離級別:
select @@tx_isolation;
十二、視圖
含義:理解成一張虛擬的表
視圖和表的區別:
使用方式 占用物理空間
視圖 完全相同 不占用,僅僅保存的是sql邏輯
表 完全相同 占用
視圖的好處:
1、sql語句提高重用性,效率高
2、和表實現了分離,提高了安全性
(一)視圖的創建
語法:
CREATE VIEW 視圖名
AS
查詢語句;
(二)視圖的增刪改查
1、查看視圖的數據 ★
SELECT * FROM my_v4;
SELECT * FROM my_v1 WHERE last_name='Partners';
2、插入視圖的數據
INSERT INTO my_v4(last_name,department_id) VALUES('虛竹',90);
3、修改視圖的數據
UPDATE my_v4 SET last_name ='夢姑' WHERE last_name='虛竹';
4、刪除視圖的數據
DELETE FROM my_v4;
(三)某些視圖不能更新
包含以下關鍵字的sql語句:分組函數、distinct、group by、having、union或者union all
常量視圖
Select中包含子查詢
join
from一個不能更新的視圖
where子句的子查詢引用了from子句中的表
(四)視圖邏輯的更新
#方式一:
CREATE OR REPLACE VIEW test_v7
AS
SELECT last_name FROM employees
WHERE employee_id>100;
#方式二:
ALTER VIEW test_v7
AS
SELECT employee_id FROM employees;
SELECT * FROM test_v7;
(五)視圖的刪除
DROP VIEW test_v1,test_v2,test_v3;
(六)視圖結構的查看
DESC test_v7;
SHOW CREATE VIEW test_v7;
十三、存儲過程
含義:一組經過預先編譯的sql語句的集合
好處:
1、提高了sql語句的重用性,減少了開發程序員的壓力
2、提高了效率
3、減少了傳輸次數
分類:
1、無返回無參
2、僅僅帶in類型,無返回有參
3、僅僅帶out類型,有返回無參
4、既帶in又帶out,有返回有參
5、帶inout,有返回有參
注意:in、out、inout都可以在一個存儲過程中帶多個
(一)創建存儲過程
語法:
create procedure 存儲過程名(in|out|inout 參數名 參數類型,...)
begin
存儲過程體
end
類似於方法:
修飾符 返回類型 方法名(參數類型 參數名,...){
方法體;
}
注意
1、需要設置新的結束標記
delimiter 新的結束標記
示例:
delimiter $
CREATE PROCEDURE 存儲過程名(IN|OUT|INOUT 參數名 參數類型,...)
BEGIN
sql語句1;
sql語句2;
END $
2、存儲過程體中可以有多條sql語句,如果僅僅一條sql語句,則可以省略begin end
3、參數前面的符號的意思
in:該參數只能作為輸入 (該參數不能做返回值)
out:該參數只能作為輸出(該參數只能做返回值)
inout:既能做輸入又能做輸出
(二)調用存儲過程
call 存儲過程名(實參列表)
十四、函數
(一)創建函數
學過的函數:LENGTH、SUBSTR、CONCAT等
語法:
CREATE FUNCTION 函數名(參數名 參數類型,...) RETURNS 返回類型
BEGIN
函數體
END
(二)調用函數
SELECT 函數名(實參列表)
(三)函數和存儲過程的區別
關鍵字 | 調用語法 | 返回值 | 應用場景 |
---|---|---|---|
函數 | FUNCTION SELECT 函數() | 只能是一個 | 一般用於查詢結果為一個值並返回時,當有返回值而且僅僅一個 |
存儲過程 | PROCEDURE CALL 存儲過程() | 可以有0個或多個 | 一般用於更新 |
十五、流程控制結構
(一)系統變量
1、全局變量
作用域:針對於所有會話(連接)有效,但不能跨重啟
查看所有全局變量
SHOW GLOBAL VARIABLES;
查看滿足條件的部分系統變量
SHOW GLOBAL VARIABLES LIKE '%char%';
查看指定的系統變量的值
SELECT @@global.autocommit;
為某個系統變量賦值
SET @@global.autocommit=0;
SET GLOBAL autocommit=0;
2、會話變量
作用域:針對於當前會話(連接)有效
查看所有會話變量
SHOW SESSION VARIABLES;
查看滿足條件的部分會話變量
SHOW SESSION VARIABLES LIKE '%char%';
查看指定的會話變量的值
SELECT @@autocommit;
SELECT @@session.tx_isolation;
為某個會話變量賦值
SET @@session.tx_isolation='read-uncommitted';
SET SESSION tx_isolation='read-committed';
(二) 自定義變量
1、用戶變量
聲明並初始化:
SET @變量名=值;
SET @變量名:=值;
SELECT @變量名:=值;
賦值:
方式一:一般用於賦簡單的值
SET 變量名=值;
SET 變量名:=值;
SELECT 變量名:=值;
方式二:一般用於賦表 中的字段值
SELECT 字段名或表達式 INTO 變量
FROM 表;
使用:
select @變量名;
2、局部變量
聲明:
declare 變量名 類型 【default 值】;
賦值:
方式一:一般用於賦簡單的值
SET 變量名=值;
SET 變量名:=值;
SELECT 變量名:=值;
方式二:一般用於賦表 中的字段值
SELECT 字段名或表達式 INTO 變量
FROM 表;
使用:
select 變量名
二者的區別:
作用域 定義位置 語法
用戶變量 當前會話 會話的任何地方 加@符號,不用指定類型
局部變量 定義它的BEGIN END中 BEGIN END的第一句話 一般不用加@,需要指定類型
(三)分支
1 、if函數
語法:if(條件,值1,值2)
特點:可以用在任何位置
2、case語句
語法:
情況一:類似於switch
case 表達式
when 值1 then 結果1或語句1(如果是語句,需要加分號)
when 值2 then 結果2或語句2(如果是語句,需要加分號)
...
else 結果n或語句n(如果是語句,需要加分號)
end 【case】(如果是放在begin end中需要加上case,如果放在select后面不需要)
情況二:類似於多重if
case
when 條件1 then 結果1或語句1(如果是語句,需要加分號)
when 條件2 then 結果2或語句2(如果是語句,需要加分號)
...
else 結果n或語句n(如果是語句,需要加分號)
end 【case】(如果是放在begin end中需要加上case,如果放在select后面不需要)
特點:
可以用在任何位置
3、if elseif語句
語法:
if 情況1 then 語句1;
elseif 情況2 then 語句2;
...
else 語句n;
end if;
特點:
只能用在begin end中!!!!!!!!!!!!!!!
三者比較:
. | 應用場合 |
---|---|
if函數 | 簡單雙分支 |
case結構 | 等值判斷 的多分支 |
if結構 | 區間判斷 的多分支 |
(四)循環
語法:
【標簽:】WHILE 循環條件 DO
循環體
END WHILE 【標簽】;
特點:
只能放在BEGIN END里面
如果要搭配leave跳轉語句,需要使用標簽,否則可以不用標簽
leave類似於java中的break語句,跳出所在循環!!!