MySQL零基礎入門視頻課程——筆記
MySQL,主講:湯小洋
一、MySQL簡介
1. 介紹
1.1 什麽是數據庫?
? 數據庫:Database,按照數據結構來組織、存儲和管理數據的倉庫,簡單來說就是存儲數據的倉庫
? 數據庫管理系統:用來管理數據庫的軟件系統,常見:MySQL、Oracle、SQL Server、DB2、Sybase、Access等
1.2 什麽是MySQL?
? MySQL:是一個開源的關系型數據庫管理系統,由瑞典MySQL AB公司開發,後來被Oracle收購,所以目前屬於Oracle公司
? 特點:體積小、速度快、成本低、開源,中小型網站都使用MySQL數據庫
? 版本:企業版Enterprise、社區版Community
? DBA:Database Administrator 數據庫管理員
2. 安裝MySQL
2.1 版本
? 分平臺:Windows、Linux、Mac
? 分版本:5.x 6.x 7.x 8.x
2.2 安裝
? 安裝位置:/usr/local/mysql
- bin 可執行文件
- data 數據庫文件
- my.cnf 核心配置文件
2.3 服務
? 安裝MySQL後,會在操作系統中添加一個MySQL服務
? 需要先啟動服務才能使用MySQL:
-
系統偏好設置——>MySQL
- 勾選Automatically Start MySQL Server on Startup,設置開機自動啟動MySQL服務
二、基本操作
1. 連接MySQL
? 語法:
mysql -u 用戶名 -p密碼 -h 數據庫服務器地址 -D 數據庫名
? 安裝MySQL以後,默認有一個管理員 root
2. 查看數據庫和表
show databases; -- 查看當前所有數據庫
use 數據庫名; -- 切換數據庫
show tables; -- 查看當前數據庫中所有表
select database(); -- 顯示當前操作的數據庫
select user(); -- 顯示當前登陸的用戶
? mysql庫是系統庫,包含MySQL的相關系統信息,不要修改
3. 導入初始數據
3.1 導入數據
? 以.sql結尾的文件是數據庫腳本文件
? 先連接登陸MySQL,然後執行如下命令:
source /Users/appleuser/Desktop/init.sql
3.2 表結構
desc 表名; -- 查看表的結構
select * from 表名; -- 查看表中的所有數據
emp雇員表
列名 | 類型 | 含義 |
---|---|---|
empno | int 整數 | 雇員編號 |
ename | varchar 字符串 | 雇員姓名 |
job | varchar 字符串 | 工作、職位 |
mgr | int 整數 | 上司/領導的編號 |
hiredate | date 日期 | 入職時間 |
sal | double 小數 | 薪水、工資 |
comm | int 整數 | 獎金 |
deptno | int 整數 | 部門編號 |
dept部門表
列名 | 類型 | 含義 |
---|---|---|
deptno | int 整數 | 部門編號 |
dname | varchar 字符串 | 部門名稱 |
loc | varcher 字符串 | 部門位置 |
salgrade工資等級表
列名 | 類型 | 含義 |
---|---|---|
grade | int 整數 | 等級編號 |
losal | int 整數 | 工資下限 |
hisal | int 整數 | 工資上限 |
bonus獎金表
三、SQL
? SQL:Structured Query Language 結構化查詢語言,用來對數據庫進行查詢、更新和管理的一種特殊的語言
? 包含三個部分:
-
DML
Data Manipulation Language 數據操作語言
用於檢索或更新數據庫:insert delete update select 增刪改查
-
DDL
Data Definition Language 數據定義語言
用於定義數據的結構:create alter drop
-
DCL
Data Control Language 數據控制語言
用於定義數據庫用戶的權限:grant revoke
四、 查詢操作
1. 簡介
1.1 語法
select 列名1 別名1,列名2 別名2... from 表名;
示例:
select ename from emp;
select ename,job,hiredate from emp;
select * from emp;
select ename 姓名,job 職位,hiredate 入職時間 from emp;
select empno,ename,sal "your salary" from emp; -- 別名包含空格時,需要使用雙引號引起來
1.2 用法
-
字符串連接concat()
select concat(‘編號為‘,empno,‘的雇員,姓名為‘,ename,‘,職位為‘,job) from emp;
-
四則運算 + - * %
例:查詢雇員姓名及年薪
select ename 雇員姓名,sal*12 年薪 from emp; select ename 雇員姓名,(sal+comm)*12 年薪 from emp; -- 有問題的 select ename 雇員姓名,(sal+ifnull(comm,0))*12 年薪 from emp; -- 使用ifnull()
在MySQL中,NULL與任何值進行運算,結果都為NULL
-
去除重復列 distinct
例:查詢所有的職位
select distinct job from emp; select ename,job from emp; -- 在去除重復列時只有當所有列都相同時才能去除
?
2. 限定查詢
? 語法:
select 列名1 別名1,列名2 別名2...
from 表名
where 條件;
2.1 比較運算符
? > < >= <= = !=或<>
? 例:查詢工資大於1500的雇員信息
select * from emp where sal>1500;
? 例:查詢雇員編號不是7369的雇員信息
select * from emp where empno!=7369;
? 例:查詢姓名是smith的雇員編號、姓名、工資、入職時間
select empno,ename,sal,hiredate from emp where ename=‘smith‘;
? 註:字符串要使用引號引起來,同時MySQL中不區分大小寫
2.2 null 或 not null
? 例:查詢沒有獎金的雇員信息
select * from emp where comm is null;
select * from emp where comm is not null;
? 註:判斷是否為null時使用的是is,不能使用比較運算符=
2.3 and
? 例:查詢基本工資大於1000,並且可以獲取獎金的雇員姓名、工資、獎金
select ename,sal,comm from emp where sal>1000 and comm is not null;
2.4 or
? 例:查詢從事銷售工作,或工資大於等於2000的雇員信息
select * from emp where job=‘salesman‘ or sal>=2000;
2.5 not
? 例:查詢從事非銷售工作,並且工資不小於1500的雇員的編號、姓名、職位、工資、入職時間
select empno,ename,job,sal,hiredate from emp where job!=‘salesman‘ and sal >= 1500;
select empno,ename,job,sal,hiredate from emp where not (job=‘salesman‘ and sal<1500); -- 有問題的
select empno,ename,job,sal,hiredate from emp where (not job=‘salesman‘) and (not sal<1500);
2.6 between and
? 例:查詢基本工資大於1500,但小於3000的雇員信息
select * from emp where sal>1500 and sal<3000;
select * from emp where sal between 1500 and 3000;
? 註:between and 包含臨界值
? 例:查詢1981年入職的雇員編號、姓名、入職時間、所在部門編號
select empno,ename,hiredate,deptno from emp where hiredate between ‘1981-1-1‘ and ‘1981-12-31‘;
? 註:日期必須使用引號引起來
2.7 in 或 not in
? 例:查詢編號為7369、7499、7788的雇員信息
select * from emp where empno=7369 or empno=7499 or empno=7788;
select * from emp where empno in (7369,7499,7788);
? 例:查詢姓名為smith、allen、king的雇員編號、姓名、入職時間
select empno,ename,hiredate from emp where ename in (‘smith‘,‘allen‘,‘king‘);
select empno,ename,hiredate from emp where ename not in (‘smith‘,‘allen‘,‘king‘);
2.8 like
? 用來進行模糊查詢,需要結合通配符一起使用
? 常用通配符:
- % 可以匹配任意長度字符
- _ 只能匹配單個字符
? 例:查詢雇員姓名以S開頭的雇員信息
select * from emp where ename like ‘S%‘;
? 例:查詢雇員姓名中包含M的雇員信息
select * from emp where ename like ‘%M%‘;
? 例:查詢從事銷售工作,並且姓名長度為4個字符的雇員信息
select * from emp where job=‘salesman‘ and ename like ‘____‘;
? 例:查詢1981年入職的雇員編號、姓名、入職時間、所在部門編號
select empno,ename,hiredate,deptno from emp where hiredate like ‘1981%‘;
3. 排序
3.1 語法
? 語法:
select 列名1 別名1,列名2 別名2...
from 表名
where 條件
order by 排序列1 asc|desc,排序列2 asc|desc...;
? asc表示升序,desc表示降序,省略時默認按升序
3.2 示例
? 例:查詢所有雇員信息,按工資由低到高排序
select * from emp order by sal;
? 例:查詢部門10的雇信息,按工資由高到低排序,如果工資相同,則按入職時間由早到晚排序
select * from emp where deptno=10 order by sal desc,hiredate;
? 例:查詢雇員編號、姓名、年薪,按年薪由高到低排序
select empno,ename,(sal+ifnull(comm,0))*12 income from emp order by income desc;
五、多表查詢
1. 簡介
? 同時從多張表中查詢數據,一般來說多張表之間都會存在某種關系
2. 基本用法
2.1 語法
select 列名1 別名1,列名2 別名2...
from 表名1 別名1,表名2 別名2...
where 條件
order by 排序列1 asc|desc,排序列2 asc|desc...;
? 例:將emp表和dept表進行多表查詢(笛卡爾積)
select * from emp,dept;
? 通過將兩張表的關聯字段進行比較,去掉笛卡爾積,多表查詢時一般都會存在某種關系
select * from emp,dept where emp.deptno=dept.deptno;
2.2 示例
? 例:查詢雇員編號、雇員姓名、工資、所在部門名稱及位置(等值連接)
select empno,ename,sal,dname,loc
from emp e,dept d
where e.deptno=d.deptno;
? 例:查詢雇員姓名、工資、入職時間、所在部門編號、部門名稱
select e.ename,e.sal,e.hiredate,d.deptno,d.dname
from emp e,dept d
where e.deptno=d.deptno; -- 如果多張表中出現同名的列,當查詢時需要指定前綴
? 例:查詢雇員姓名、雇員工資、領導姓名、領導工資(自身連接)
select e.ename 雇員姓名,e.sal 雇員工資,m.ename 領導姓名,m.sal 領導工資
from emp e,emp m
where e.mgr=m.empno;
? 例:查詢雇員姓名、雇員工資、部門名稱、領導姓名、領導工資
select e.ename 雇員姓名,e.sal 雇員工資,d.dname 部門名稱,m.ename 領導姓名,m.sal 領導工資
from emp e,dept d,emp m
where e.deptno=d.deptno and e.mgr=m.empno;
? 例:查詢雇員姓名、雇員工資、部門名稱、工資所在等級(非等值連接)
select e.ename 雇員姓名,e.sal 雇員工資,d.dname 部門名稱,s.grade 工資等級
from emp e,dept d,salgrade s
where e.deptno=d.deptno and e.sal between s.losal and s.hisal;
? 例:查詢雇員姓名、雇員工資、部門名稱、雇員工資等級、領導姓名、領導工資、領導工資等級
select e.ename 雇員姓名,e.sal 雇員工資,d.dname 部門名稱,s.grade 雇員工資等級,m.ename 領導姓名,m.sal 領導工資,sm.grade 領導工資等級
from emp e,dept d,salgrade s,emp m,salgrade sm
where e.deptno=d.deptno and e.sal between s.losal and s.hisal and e.mgr=m.empno and m.sal between sm.losal and sm.hisal;
3. SQL99標準
3.1 簡介
? SQL99標準,也稱為SQL1999標準,是1999年制定的
? 分類:內連接、外連接
3.2 內連接
? 使用inner join…on
? 語法:
select 列名1 別名1,列名2 別名2...
from 表名1 別名1 inner join 表名2 別名2 on 多表間的關聯關系
where 條件
order by 排序列1 asc|desc,排序列2 asc|desc...;
? 例:查詢雇員編號、雇員姓名、工資、部門名稱
select e.empno,e.ename,e.sal,d.dname
from emp e inner join dept d on e.deptno=d.deptno;
? 例:查詢工資大於1500的雇員姓名、工資、部門名稱、領導姓名
select e.ename,e.sal,d.dname,m.ename
from emp e inner join dept d on e.deptno=d.deptno inner join emp m on e.mgr=m.empno
where e.sal>1500;
select e.ename,e.sal,d.dname,m.ename
from emp e,dept d,emp m
where e.deptno=d.deptno and e.mgr=m.empno and e.sal>1500;
3.3 外連接
? 分類:
-
左外連接 left outer join…on,也稱為左連接left join…on
以左邊的表作為主表,無論如何都會顯示主表中的所有數據
-
右外連接 right outer join…on,也稱為右連接right join…on
以右邊的表作為主表,無論如何都會顯示主表中的所有數據
? 語法:
select 列名1 別名1,列名2 別名2...
from 表名1 別名1 left join 表名2 別名2 on 多表間的關聯關系
where 條件
order by 排序列1 asc|desc,排序列2 asc|desc...;
? 例:查詢雇員姓名、工資、領導姓名、領導工資(有的雇員沒有領導)
select e.ename,e.sal,m.ename,m.sal
from emp e,emp m
where e.mgr=m.empno; -- 有問題的
select e.ename,e.sal,m.ename,m.sal
from emp e inner join emp m on e.mgr=m.empno; -- 有問題的
select e.ename,e.sal,m.ename,m.sal
from emp e left join emp m on e.mgr=m.empno;
select e.ename,e.sal,m.ename,m.sal
from emp m right join emp e on e.mgr=m.empno;
? 例:查詢部門編號、部門名稱、部門位置、部門中雇員姓名、工資
select d.deptno,d.dname,d.loc,e.ename,e.sal
from dept d left join emp e on d.deptno=e.deptno
order by d.deptno;
六、聚合函數和分組統計
1. 聚合函數
? 聚合函數,稱為統計函數
? 常用函數函數:
- count() 總數量
- max() 最大值
- min() 最小值
- sum() 和
- avg() 平均值
? 例:查詢部門30的總人數
select count(empno) 總人數 from emp where deptno=30;
select max(sal) from emp;
select ename 雇員姓名,avg(sal) 平均工資 from emp where deptno=10; -- 不合理
? 註:聚合函數在統計時會忽略NULL值
? 例:查詢部門30的最高工資、最低工資、平均工資
select max(sal),min(sal),round(avg(sal),2) from emp where deptno=30;
2. 分組統計
2.1 語法
select 列名1 別名1,列名2 別名2...
from 表名1 別名1 left join 表名2 別名2 on 多表間的關聯關系
where 分組前的條件
group by 分組列
having 分組後的條件
order by 排序列1 asc|desc,排序列2 asc|desc...;
2.2 示例
? 例:查詢每個部門的平均工資
select deptno 部門編號,avg(sal) 平均工資
from emp
group by deptno;
select d.dname 部門名稱,avg(sal) 平均工資
from emp e,dept d
where e.deptno=d.deptno
group by d.dname;
? 註:
- 在MySQL中分組統計時可以查詢出分組列以外的其他列,而在Oracle中不行
- 建議將要查詢出的列作為分組列
? 例:查詢部門的名稱及每個部門的員工數量
select d.dname 部門名稱,count(e.empno) 員工數量
from dept d left join emp e on d.deptno=e.deptno
group by d.dname;
? 例:查詢平均工資大於2000的部門的編號和平均工資
select deptno,avg(sal)
from emp
group by deptno
having avg(sal)>2000;
? 例:查詢出非銷售人員的職位名稱,以及從事同一工作的雇員的月工資總和,並且要滿足工資總和大於5000,查詢的結果按月工資總和的升序排列
select job,sum(sal) sum
from emp
where job!=‘salesman‘
group by job
having sum(sal)>5000
order by sum;
? 例:查詢部門平均工資的最大值
select max(avg(sal))
from emp
group by deptno; -- MySQL中不支持
? 註:在MySQL中聚合函數不能嵌套使用,而Oracle中可以
select max(temp.avg)
from (select avg(sal) avg from emp group by deptno) temp;
七、子查詢
1. 簡介
? 一個查詢中嵌套著另一個查詢,稱為子查詢
- 子查詢必須放在小括號中
- 子查詢可以出現在任意位置,如select、from、where、having等
2. 基本用法
2.1 語法
select (子查詢)
from (子查詢) 別名
where (子查詢)
group by
having (子查詢)
2.2 示例
? 例:查詢工資比7566高雇員信息
-- 使用多表連接
select e2.*,e1.ename,e1.sal
from emp e1,emp e2
where e1.empno=7566 and e2.sal>e1.sal;
-- 使用子查詢
select sal from emp where empno=7566;
select * from emp where sal> (select sal from emp where empno=7566);
? 例:查詢工資比部門30員工的工資高的雇員信息
select sal from emp where deptno=30;
select * from emp where sal>(select sal from emp where deptno=30); -- 錯誤用戶
? 註:將子查詢與比較運算符一起使用時,必須保證子查詢返回的結果不能多於一個
? 例:查詢雇員的編號、姓名、部門名稱
-- 使用多表連接
select e.empno,e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;
-- 子查詢
select empno,ename,(select dname from dept where deptno=e.deptno) from emp e;
? 總結:
- 一般來說,多表連接查詢都可以使用子查詢替換,但有的子查詢不能使用多表連接查詢來替換
- 子查詢特點:靈活、方便,一般常作為增、刪、改、查操作的條件,適合於操作一個表的數據
- 多表連接查詢更適合於查看多表中數據
3. 子查詢分類
? 可以分為三類:
-
單列子查詢
返回單行單列,使用頻率最高
-
多行子查詢
返回多行單列
-
多列子查詢
返回單行多列或多行多列
3.1 單列子查詢
? 例:查詢工資比7654高,同時又與7900從事相同工作的雇員信息
select *
from emp
where sal>(
select sal from emp where empno=7654
) and job=(
select job from emp where empno=7900
);
? 例:查詢工資最低的雇員的姓名、工作、工資
select ename,job,sal from emp where sal=(select min(sal) from emp);
? 例:查詢工資高於公司平均工資的雇員信息
select * from emp where sal>(select avg(sal) from emp);
? 例:查詢每個部門的編號和最低工資,要求最低工資大於等於部門30的最低工資
select deptno,min(sal)
from emp
group by deptno
having min(sal)>=(
select min(sal) from emp where deptno=30
);
? 例:查詢部門的名稱、部門的員工數、部門的平均工資、部門的最低收入雇員的姓名
-- 拆分
select deptno,count(empno),avg(sal),min(sal)
from emp
group by deptno;
-- 方式1:使用子查詢
select
(select dname from dept where deptno=e.deptno) dname,
count(empno),
avg(sal),
(select ename from emp where sal=min(e.sal)) ename
from emp e
group by deptno;
-- 方式2:使用多表連接查詢
select d.dname,t.count,t.avg,e.ename
from (select deptno,count(empno) count,avg(sal) avg,min(sal) min from emp group by deptno) t,dept d,emp e
where d.deptno=t.deptno and e.sal=t.min;
? 例:查詢平均工資最低的工作及平均工資
-- 拆分
select min(t.avg)
from (
select avg(sal) avg from emp group by job
) t;
select job,avg(sal)
from emp
group by job
having avg(sal) = (
select min(t.avg) from (select avg(sal) avg from emp group by job) t
);
3.2 多行子查詢
? 對於多行子查詢,可以使用如下三種操作符:
-
in
例:查詢所在部門編號大於等於20的雇員信息
select * from emp where deptno>=20; select * from emp where deptno in ( select deptno from dept where deptno>=20 );
例:查詢工資與部門20中的任意員工相同的雇員信息se
select * from emp where sal in ( select sal from emp where deptno=20 );
-
any
三種用法:
=any:與任意一個相同,此時與in操作符功能一樣 >any:只要比裏面最小的值大即可 <any:只要比裏面最大的值小即可
select * from emp where sal <any ( select sal from emp where deptno=20 );
-
all
兩種用法:
>all:比裏面最大的值要大 <all:比裏面最小的值要小
select * from emp where sal <all ( select sal from emp where deptno=20 );
3.3 多列子查詢
? 多列子查詢一般出現在from子句中,作為查詢結果集
? 例:在所在從事銷售工作的雇員中找出工資大於1500的員工
select *
from (
select * from emp where job=‘salesman‘
) t
where t.sal>1500;
八、分頁查詢
1. limit關鍵字
? 用來限制查詢返回的記錄數
? 語法:
select 列名1 別名1,列名2 別名2...
from 表名1 別名1 left join 表名2 別名2 on 多表間的關聯關系
where 分組前的條件
group by 分組列
having 分組後的條件
order by 排序列1 asc|desc,排序列2 asc|desc...
limit [參數1,]參數2
? 可以接收一個或兩個數字:
- 參數1用來指定起始行的索引,索引從0開始,即第一行的索引為0
- 參數2用來指定返回的記錄數量
? 例:查詢工資的前3名
select * from emp order by sal desc limit 0,3;
select * from emp order by sal desc limit 3; -- 如果省略參數1,則默認為0,即從第1條開始返回
例:查詢工資大於1000的第4-8個用戶
select * from emp where sal>1000 limit 3,5;
? 例:查詢工資最低的用戶
select * from emp order by sal limit 1;
2. 分頁
? 例:每頁顯示4條(pageSize每頁大小),顯示第3頁的內容(pageIndex頁碼)
select * from emp limit (pageIndex-1)*pageSize,pageSize -- 計算
select * from emp limit (3-1)*4,4 -- 不能直接執行
? 註:在MySQL中limit後面的參數不能包含任何運算,實際開發中都是在編程語言中進行計算,然後將結果發送給數據庫執行
九、常用函數
1. 字符串函數
-
concat(s1,s2,s3….) 拼接字符串
select concat(‘aa‘,‘bb‘,‘cc‘) select concat(‘aa‘,‘bb‘,‘cc‘) from dual; select concat(‘編號為‘,empno,‘的員工,姓名為‘,ename) from emp;
註:dual表是MySQL提供的一張虛擬表,主要是為了滿足select...from...語法習慣,一般測試時使用,無實際意義
-
lower(s) 將字符串變為小寫
select lower(‘Hello‘) from dual
-
upper(s) 將字符中變為大寫
select upper(‘Hello‘) from dual
-
length(s) 獲取字符串的長度
select length(‘hello‘) from dual
-
reverse(s) 將字符串反轉
select reverse(‘hello‘) from dual
-
trim(s) 去除字符串兩邊的空格
select trim(‘ hello ‘) from dual
,還有ltrim()和rtrim(),去除左邊或右邊的空格 -
replace(s,s1,s2) 將字符串s中的s1替換為s2
select replace(‘hello world‘,‘o‘,‘xx‘) from dual
-
repeat(s,n) 將字符串s重復n次後返回
select repeat(‘hello‘,3) from dual
-
lpad(s,len,s1) 在字符串s的左邊使用s1進行填充,直至長度為len
select lpad(‘hello‘,8,‘x‘) from dual
-
rpad(s,len,s1) 在字符串s的右邊使用s1進行填充,直至長度為len
select rpad(‘hello‘,8,‘x‘) from dual
- substr(s,i,len) 從第i個位置開始對字符串s進行截取,截取len個
select substr(‘hello‘,2,3) from dual
2. 數值函數
- ceil(n) 返回大於n的最小整數
select ceil(10.1) from dual
- floor(n) 返回小於n的最大整數
select floor(10.1) from dual
- round(n,y) 將n保留y位小數,四舍五入
select round(3.1415,3) from dual
- truncate(n,y) 將n保留y位小數,不四舍五入
select truncate(3.1415,3) from dual
- rand() 返回0到1的隨機數
select rand() from dual
3. 日期和時間函數
-
now() 返回當前日期時間
select now() from dual
-
curdate() 返回當前日期
select curdate() from dual
-
curtime() 返回當前時間
select curtime from dual
-
year(date) 返回日期中的年
select year(‘2018-2-14‘) from dual
-
month(date) 返回日期中的月
select month(‘2018-2-14‘) from dual
-
day(date) 返回日期中的日
select day(‘2018-2-14‘) from dual
-
timestampdiff(interval,datetime1,datetime2) 返回兩個日期時間之間相隔的整數,單位由interval定義
interval可取值:year、month、day、hour、minute、second
select timestampdiff(day,‘1993-9-23‘,‘2018-11-22‘) from dual
-
date_format(date,pattern) 格式化日期
select date_format(now(),‘%Y年%m月%d日 %H:%i:%s‘) from dual
格式化參數:
%Y 表示四位數字的年
%m 表示兩位數字的月
%d 表示兩位數字的日
%H 表示兩位數字的小時,24小時制
%i 表示兩位數字的分鐘
%s 表示兩位數字的秒數
4. 流程控制函數
-
if(f,v1,v2) 如果f為真,則返回v1,否則返回 v2
select if(5>2,‘yes‘,‘no‘) from dual
-
ifnull(v1,v2) 如果v1不為null,則返回v1,否則返回v2
select ifnull(null,‘0‘) from dual
-
case when f1 then v1 when f2 then v2….else v end 如果f1為真,則返回v1;如果f2為真,則返回v2...否則返回v
select case when 5>2 then ‘yes‘ end from dual; select case when 5<2 then ‘yes‘ else ‘no‘ end from dual; select case when 5<2 then ‘one‘ when 6>4 then ‘two‘ else ‘three‘ end from dual;
5. 系統信息函數
- database() 返回當前操作的數據庫
select database()
- user() 返回當前登陸的用戶
select user()
- version() 返回MySQL服務器的版本
select version()
十、更新操作
1. insert
? 語法:
-- 語法1
insert into 表名 (列名1,列名2...) values (值1,值2...);
-- 語法2:一次性插入多條數據
insert into 表名 (列名1,列名2...) values (值1,值2...),(值1,值2...),(值1,值2...)
? 示例:
insert into dept (deptno,dname,loc) values (50,‘市場部‘,‘南京‘);
insert into dept (deptno,dname) values (60,‘開發部‘);
insert into dept values (70,‘×××部‘,‘上海‘); -- 如果是依次插入表中所有的列,此時可以省略列名
insert into dept values (11,‘aaa‘,‘aaa‘),(12,‘bbb‘,‘bbb‘),(13,‘ccc‘,‘ccc‘);
insert into emp (empno,ename,job,hiredate,sal,deptno) values (9527,‘唐伯虎‘,‘畫家‘,now(),6666,50);
2. delete
? 語法:
delete from 表名 where 條件;
? 示例:
delete from dept where deptno=60;
delete from dept where dname=‘×××部‘;
-- 刪除市場部所有工資高於5000的員工
select deptno from dept where dname=‘市場部‘
delete from emp where deptno=(select deptno from dept where dname=‘市場部‘) and sal>5000;
? 註::delete from emp
會將表中所有數據都刪除
3. update
? 語法:
update 表名 set 列名1=值1,列名2=值2... where 條件
? 示例:
update dept set dname=‘market‘ where dname=‘市場部‘;
update emp set job=‘manager‘,sal=8888,comm=666 where ename=‘smith‘;
十一、表和庫的管理
1. 數據類型
? 整數:smallint、int、bigint
? 小數:float、double
? 日期時間:date、time、datetime、timestamp
? 字符串:varchar、char、text
? 其他:clob 存儲文本大數據
blob 存儲二進制大數據
2. 創建表
? 語法:
create table 表名
(
列名 數據類型 特征,
列名 數據類型 特征,
....
列名 數據類型 特征
) charset=utf8;
? 示例:
create table user
(
id int,
username varchar(20),
password varchar(50)
);
create table t_student
(
id int primary key auto_increment, -- 將id作為主鍵,自動增長,默認從1開始,每次遞增1
name varchar(10) not null, -- 不允許為空
age int,
sex varchar(8) not null default ‘女‘, -- 指定默認值
address varchar(100),
height double,
birthday date
)charset=utf8;
insert into t_student (name,age,sex,birthday,height) values (‘範婷婷‘,18,‘女‘,‘1998-12-4‘,170.6);
insert into t_student (name,age,sex) values (null,10,‘男‘);
insert into t_student values (null,‘程瑞‘,19,‘男‘,‘南京‘,176.6,now());
3. 修改表
-
添加列
語法:
alter table 表名 add 列名 數據類型
示例:
alter table t_student add weight double;
-
修改列類型
語法:
alter table 表名 modify 列名 數據類型
示例:
alter table t_student modify name varchar(250);
-
修改列名
alter table 表名 change 原列名 新列名 數據類型
示例:
alter table t_student change sex gender varchar(8);
-
刪除列
語法:
alter table 表名 drop 列名
示例:
alter table t_student drop weight;
-
修改表名
語法:
alter table 原表名 rename 新表名 或 rename table 原表名 to 新表名
示例:
alter table t_student rename student; rename table student to t_student;
4. 刪除表
? 語法:
drop table 表名;
drop table if exists 表名;
? 示例:
drop table user;
drop table if exists user;
5. 截斷表
? 清空表中的數據,作用類似於沒有條件的delete語句
? 語法:
truncate table 表名;
? delete與truncate區別:
- delete會記錄日誌,所以速度慢,而truncate不記錄日誌,清空表並釋放資源,速度快
- delete可以指定條件只刪除表中的部分數據,而truncate只能用來清空表中的所有數據
- delete不會將自動增長列歸零,而truncate會
6. 創建庫
? 語法:
create database 數據庫名 charset utf8;
create database if not exists 數據庫名 charset utf8;
? 示例:
create database if not exists shop charset utf8;
7. 刪除庫
? 語法:
drop database 數據庫名;
drop database if exists 數據庫名;
? 示例:
drop database if exists shop;
十二、約束
1. 簡介
? constraint約束是對表中的數據的一種限制,保證數據的完整性和有效性
2. 約束分類
? 有五種約束:
-
主鍵約束 primary key
用來唯一的標識一條記錄(數據),本身不能為空
-
唯一約束 unique
不允許出現重復值
-
檢查約束 check
判斷數據是否符合指定條件
註:MySQL會對check約束進行分析,但會忽略check約束,即不會強制執行此約束,可以通過SQL編程來解決
-
非空約束 not null
不允許為null,但可以為空字符串‘‘
-
外鍵約束 foreign key
約束兩表之間的關聯關系
3. 添加約束
-
方式1:在創建表時添加約束
-- 約束沒有名稱 create table student -- 學生表 ( id int primary key, -- 主鍵約束 name varchar(10) not null, -- 非空約束 age int check(age between 1 and 120), -- 檢查約束 sex varchar(8) not null check(sex in (‘male‘,‘female‘)), -- 多種約束 IDCard varchar(18) unique, -- 唯一約束 class_id int, -- 外鍵列 foreign key (class_id) references class(c_id) -- 外鍵約束,引用主表中的主鍵 );
create table class -- 班級表 ( c_id int primary key, c_name varchar(20) not null, c_info varchar(200) );
查看表的所有信息(約束):
show create table 表名;
-- 為約束指定名稱 create table student ( id int, name varchar(10) not null, -- 非空約束 age int, sex varchar(8) , IDCard varchar(18), class_id int, constraint pk_id primary key (id), constraint ck_age check(age between 1 and 120), constraint ck_sex check(sex in (‘male‘,‘female‘)), constraint uq_IDCard unique (IDCard), constraint fk_class_id foreign key (class_id) references class(c_id) );
-
方式2:在創建表之後再添加約束
create table student ( id int, name varchar(10) not null, -- 非空約束只能在創建表時在列名後面指定 age int, sex varchar(8) , IDCard varchar(18), class_id int );
? 為表添加約束,語法:
alter table 表名 add constraint 約束名 約束類型 約束內容
? 示例:
alter table student add constraint pk_id primary key (id); alter table student add constraint ck_age check(age between 1 and 120); alter table student add constraint ck_sex check(sex in (‘male‘,‘female‘)); alter table student add constraint uq_IDCard unique (IDCard); alter table student add constraint fk_class_id foreign key (class_id) references class(c_id);
4. 刪除約束
? 語法:
- 刪除主鍵約束
alter table 表名 drop primary key
- 刪除外鍵約束
alter table 表名 drop foreign key 約束名稱
- 刪除唯一約束
alter table 表名 drop index 約束名稱
- 刪除非空約束
alter table 表名 modify 列名 數據類型 null
5. 註意事項
- 創建表時,必須先創建主表,再創建從表
- 刪除表時,必須先刪除從表,再刪除主表
- 可以在創建表時指定級聯刪除,當主表數據被刪除時,將自動刪除從表中的相關數據
create table student -- 學生表
(
id int primary key, -- 主鍵約束
name varchar(10) not null, -- 非空約束
age int check(age between 1 and 120), -- 檢查約束
sex varchar(8) not null check(sex in (‘male‘,‘female‘)), -- 多種約束
IDCard varchar(18) unique, -- 唯一約束
class_id int, -- 外鍵列
foreign key (class_id) references class(c_id) on delete cascade -- 級聯刪除
);
十三、用戶和權限管理
1. 創建用戶並授予權限
? 語法:
grant 權限列表 on 庫名.表名 to 用戶名@來源地址 identified by ‘密碼‘;
? 示例:
grant select on test.emp to tom@localhost identified by ‘123‘;
grant select on shop.user to jack@localhost identified by ‘123‘;
grant select,update on shop.* to mike@‘%‘ identified by ‘111‘;
grant delete on shop.user to mike@‘%‘;
grant all on *.* to alice@‘%‘ identified by ‘123‘;
? 註:test庫是安裝時默認創建的,默認情況下所有用戶對該庫都擁有最大的權限
? 只能管理員才具有創建用戶的權限
2. 查看權限
? 語法:
show grants; -- 查看自己的權限
show grants for 用戶名@來源地址; -- 查看其他人的權限
3. 撤銷權限
? 語法:
revoke 權限列表 on 庫名.表名 from 用戶名@來源地址
? 示例:
revoke delete on shop.user from mike@‘%‘;
4. 刪除用戶
? 語法:
use mysql;
delete from user where user=‘用戶名‘;
flush privileges; -- 刷新權限
十四、事務處理
1. 簡介
? transaction
? 事務處理是用來保證數據操作的完整性
? 一個業務由若幹個一次性的操作組成,這些操作要麽都成功,要麽都失敗,如銀行轉賬
? 事務特性ACID:
- 原子性(Atomicity):不可再分
- 一致性(Consistency):要保證數據前後的一致性
- 隔離性(Isolation):兩個事務的操作互不幹擾
- 持久性(Durability):一旦事務提交,不可回滾
2. 事務操作
? MySQL默認是自動提交事務的,將每一條語句都當作一個獨立的事務執行,可以通過autocommit關閉自動提交事務
? 查看autocommit模式:show variables like ‘autocommit‘
? 關閉自動提交:set autocommit=off
或 set autocommit=0
? 手動提交事務:commit
? 手動回滾事務:rollback
MySQL零基礎入門視頻課程——筆記