全網最實用—30分鐘快速掌握Mysql數據庫
MySQL教程
0.數據庫概念
0.1 數據的概念
數據(Data)概念:數據是對客觀事物的符號表示,如圖形符號、數字、字母等,數據是存儲的基本對象。數據的種類分爲:文字、圖形、圖象、聲音。
0.2 數據庫概念
數據庫(Database,簡稱DB)的定義:“按照數據結構來組織、存儲和管理數據的倉庫”。數據庫主要分爲純文本數據庫,關係型數據庫與非關係型數據庫。
- 純文本數據庫:適用於小型應用,只能順序訪問,不能隨機訪問。如:txt等文本
- 關係型數據庫:簡單易用,容易維護,支持SQL,可用於複雜查詢。 如:mysql,oracle,sqlLite
- 非關係型數據庫:無需經過sql層解析,讀寫性能高,基於鍵值對,沒有耦合性,容易擴展。如:Mongodb,redis,Hbase
0.3 SQL概念
SQL是結構化查詢語言(Structured Query Language)簡稱,結構化查詢語言是一種數據庫查詢和程序設計語言,SQL語句對數據庫進行操作的一種語言。
在數據庫中,通過SQL命令進行操作,這些常用的命令主要包括以下幾類:DDL,DML,DCL,TCL。
1.數據庫定義語句(DDL)
DDL(Data Definition Language)數據庫定義語言:CREATE、DROP、ALTER等
1.1 創建語法: create
創建數據庫:create database [數據庫名];
創建表:create table [表名](…);
create table t_user(
id int PRIMARY key auto_increment,
user_name varchar(50),
pass_word varchar(50),
sex char(1)
);
1.2 修改語法:alter
改表名:alter table t_user rename t_student;
增加列:alter table t_student add column birthday datetime default now();
刪除列:alter table t_student drop column birthday;
1.3 刪除語法 : drop
刪除數據庫:drop database [數據庫名]
刪除表:drop table [表名]
2.數據庫操作語言(DML)
2.1 新增(INSERT)
新增單行:
insert into [表名](列1,列2,...);
新增多行:
insert into [表名](column1,column2)values(value1,value2),(value1,value2);
2.2 修改(UPDATE)
語法:
UPDATE 表名稱 SET 列名=值,列名=值 [where 列名=值];
2.3 刪除(DELETE)
語法:
DELETE FROM 表名稱 [where 列名=值];
2.4 查詢(SELECT)
語法:
SELECT 列名|* FROM 表名稱 [ where 列名 = 值 ]
標準查詢:
select * from t_user;
select 列名1,列名2,列名3... from city_info_user;
帶條件查詢:
select * from t_user where name=值 and password=值;
select * from t_user where name='zhangsan' and password='123';
模糊查詢:
查詢t_user中列名爲name的包含“值”的記錄
select * from t_user where name like %值%;
統計查詢:
查詢t_user表有多少條記錄
select count(*) from t_user;
分頁查詢:
語法:select * from t_user limit ?, ?;
從t_user表的第一條記錄開始(0代表第一條記錄),讀取5條。
select * from t_user limit 0,5;
3. 數據庫控制語言(DCL)
3.1 查看全部權限
DCL(數據庫控制語言)主要用於創建用戶,創建授權與權限收回操作。
查看全部權限:
show privileges;
3.2 創建&刪除用戶
創建用戶語法:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
示例:
create user 'zhangsan'@'127.0.0.1' IDENTIFIED by '123456';
在本地數據庫(ip:127.0.0.1)創建一個叫"zhangsan"的mysql用戶,並設置密碼爲"123456";
刪除用戶
DROP USER 'username'@'host';
3.3 授權與撤銷
授權語法:
GRANT [privileges], [privileges] ON databasename.tablename TO 'username'@'host'
示例:
授予用戶’zhangsan’操作demo數據庫的student表select與insert權限。
GRANT SELECT, INSERT ON demo.student TO 'zhangsan'@'127.0.0.1';
撤銷用戶權限:
語法:
REVOKE [privilege],[privilege] ON databasename.tablename FROM 'username'@'host';
示例:
撤銷用戶zhangsan對數據庫demo的student表的select,insert權限。
REVOKE select,insert ON demo.student FROM 'zhangsan'@'127.0.0.1';
3.4 更改用戶密碼
更改用戶密碼:
語法:
SET PASSWORD FOR 'username'@'host'=PASSWORD('newpassword');
示例:
設置root用戶的密碼爲“123456”。
set password for 'root'@'127.0.0.1' = password('123456');
4.事務控制語言(TCL)
4.1 什麼是事務?
事務是在程序執行多個操作的過程中,所有操作要麼都成功,否則就撤銷所有操作的更改。
4.2 事務的ACID特性
1、原子性(Atomicity)
事務是數據庫的邏輯工作單位,而且是必須是原子工作單位,對於其數據修改,要麼全部執行,要麼全部不執行。
2、一致性(Consistency)
事務在完成時,必須是所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。
例如:對銀行轉帳事務,不管事務成功還是失敗,應該保證事務結束後帳戶表中張三和李四的轉賬總額爲2000元。
3、隔離性(Isolation)
一個事務的執行不能被其他事務所影響。
4、持久性(Durability)
一個事務一旦提交,事物的操作便永久性的保存在database中。即使此時再執行回滾操作也不能撤消所做的更改。
4.3 TCL語句
查詢當前事務狀態:
select @@autocommit;
1 代表 自動提交事務。(mysql默認是自動提交事務)
0 代表手動提交事務。
設置手動提交事務:
@@autocommit=0;
提交事務:
COMMIT;
回滾事務:
ROLLBACK;
5.SQL常用函數
5.1 聚合函數
函數 AVG(): 返回指定組中的平均值,空值被忽略。
示例:查詢tb_student表中年齡的平均值
select avg(age) from tb_student;
函數 COUNT():返回指定列的數量。
示例:查詢tb_student表中有多少條記錄
select count(*) from tb_student;
函數MAX():返回指定列的最大值。
示例:查看tb_student表中age年齡最大的值是多少。
select max(age) from tb_student;
函數MIN():返回指定列的最小值。
示例: 查看tb_student表中age年齡最小的值是多少。
select min(age) from tb_student;
SUM():返回指定列的和
示例:查看tb_student表中所有的同學年齡的總和是多少。
select sum(age) from tb_student;
5.2 日期和時間函數
NOW():返回當前日期
YEAR():返回指定日期的年份
MONTH():返回指定日期的月份
HOUR():返回指定時間的小時值
MINUTE():返回指定時間的分鐘數
DATEDIFF():返回起始時間和結束時間之間的天數
5.3 流程函數
語法:IF(expr1,expr2,expr3)
條件分支語句示例:
select IF(salary>=3000,'高收入',if(salary<3000,'低收入','薪資未填')) from salary;
語法: IFNULL(column,‘返回值’)
示例:
select userId, ifnull(salary,'0') from salary;
語法: case when (條件) then ‘爲真則返回’ else ‘爲假則返回’ END
示例:
select CASE WHEN salary<=3000 THEN '低收入' else '高收入' END from salary;
6.多表查詢
6.1 內連接
內連接的概念:
內連接分爲條件連接、等值連接和自然連接三種。通過多表查詢,返回2表之間交集的數據。
條件連接:
條件連接就是在多個表的集合中選取滿足條件的行的連接
select * from A,B where A.a > A.b
等值連接:
等值連接就是特殊的條件連接,當條件爲某字段=某字段時,即爲等值連接。
select * from t_student s, t_exam e where s.id = e.sid;
自然連接:
自然連接(NATURAL JOIN)是一種特殊的等值連接,將表中具有相同名稱的列自動進行匹配。
PS:自然連接不必指定任何連接條件:
SELECT * FROM e_order o NATURAL JOIN e_user us ;
6.2 外連接
6.2.1 左外連接
左連接: 將左邊表的數據全部查詢出來,右表沒有的用null表示。
示例:
表1:e_user
表2:e_order
業務場景:查詢出所有用戶購買的訂單信息。(此處數據展示主體爲用戶,因此以用戶表爲基表。)
select u.*,o.order_code from e_user u left join e_order o on u.id=o.u_id;
結果如下圖:
6.2.2 右外連接
右連接概念:將右邊表的數據全部查詢出來,左表沒有的用null表示。
業務場景:查詢所有商品的購買信息。(此處數據展示主體爲商品)
select u.t_name,o.* from e_user u right join e_order o on u.id=o.u_id;
如下圖:
6.2.3 全外連接
關鍵字:union /union all
採用 union 全連接:
union會自動將完全重複的數據去除掉,只顯示一行。
語法:
(select colum1,colum2...columN from tableA ) union (select colum1,colum2...columN from tableB )
採用 union all 全連接:
union all會保留那些重複的數據;
語法:
(select colum1,colum2...columN from tableA ) union all (select colum1,colum2...columN from tableB );
6.3 自連接
6.3.1 自連接概念
自連接(self join)是SQL語句中經常要用的連接方式,使用自連接可以將自身表的一個鏡像當作另一個表來對待,即將一張表看成多張表來做連接,從而能夠得到一些特殊的數據。
6.3.2 使用場景
業務場景:通過員工表查詢公司員工以及該員工上級領導。
select worker.emp_name 員工 , mgr.emp_name 領導 from t_emp worker left join t_emp mgr on worker.manager_id = mgr.emp_id;
效果如下圖:
6.4 子查詢
6.4.1 什麼是子查詢?
子查詢(subquery),即嵌套在其他查詢中的查詢。 (select語句中嵌套select語句)
6.4.2 單行子查詢
子查詢返回的結果集是 單行一列,直接使用 = > < >= <= <> 這些比較標量結果的操作符。
單行子查詢的本質:
1)只返回一行結果;
2)使用單行比較運算符;
業務場景:查詢薪資大於平均的員工信息
select * from e_user where t_salary >(select avg(t_salary) from e_user);
6.4.3 多行子查詢
由於子查詢返回的結果集是 N 行一列,因此不能直接使用 = > < >= <= <> 這些比較標量結果的操作符。需要使用IN,ANY,ALL操作符。
多行子查詢本質:根據子查詢的結果是否是多行單列。
IN:在指定項內,同IN(v1,v2,…)
示例:
select * from e_order where id in(select id from e_user where id<3);
ANY:表示與子查詢返回的任一個值比較是否爲true,則返回true。
any(…):大於最小值
< any(…):小於最大值
< all (…):小於所有值
如下圖:
業務場景:查詢薪資小於 產品經理與項目經理的 員工名和職位以及薪資。
select * from e_user where t_salary < all(select t_salary from e_user where t_job = '產品經理' or t_job='項目經理');