SQL (Structured Query Language)結構化查詢語言 語句分類
1)DDL:數據定義語言 關鍵字有:create(創建),drop(刪除) ,truncate(刪除表結構,再創一張表),alter(修改)
2)DQL:數據查詢語言 關鍵字有:select
3)DML:數據操作語言 關鍵字有:insert(插入),update(更改),delete(刪除)
4)TCL:事務控制語言 關鍵字有:begin,savepoint,rollback,commit
5)DCL:數據控制語言 關鍵字有 :grant,revoke,deny
1. DDL: Data Definition Language
DDL操作數據庫:
創建數據庫:
create database db
修改數據庫:
alter database db add file(
NAME = db2,
SIZE=5MB
)
刪除數據庫:
drop database db
使用數據庫:
use TEST_HZ
DDL操作表結構
創建表:
create table TEST(
id int identity(1,1) primary key , -- 主鍵自增
cardid int , -- id編號
name nvarchar(50), -- 姓名
sex nchar(2), -- 性別
age int, -- 年齡
address nvarchar(50) -- 地址
)
刪除表:
drop table dbo.TEST
修改表:
增加一列:
alter table dbo.TEST add dept nvarchar
刪除一列:
alter table dbo.TEST drop column dept
修改列字段類型:
alter table dbo.TEST alter column dept char
2.DML: Data Manipulation Language
Insert 語句 格式:INSERT [INTO] 表名 [字段名] VALUES (字段值)
插入全部字段方式一:
insert into dbo.TEST(cardid,name,sex,age,address,dept) values(100,N'張三',N'女',18,N'中國天津',1)
insert into dbo.TEST(cardid,name,sex,age,address,dept) values(101,N'李四',N'男',33,N'中國天津',2)
insert into dbo.TEST(cardid,name,sex,age,address,dept) values(102,N'王五',N'女',25,N'中國天津',1)
insert into dbo.TEST(cardid,name,sex,age,address,dept) values(103,N'趙六',N'男',32,N'中國天津',1)
insert into dbo.TEST(cardid,name,sex,age,address,dept) values(104,N'陳啓',N'女',12,N'中國天津',1)
插入全部字段方式二:
insert into dbo.TEST values(108,N'張三',N'女',18,N'中國天津',1),(109,N'李四',N'男',33,N'中國天津',2),(110,N'王五',N'女',25,N'中國天津',1),(111,N'趙六',N'男',32,N'中國天津',1)
插入部分字段;
insert into dbo.TEST(cardid,name,sex,age) values(112,N'張三',N'女',18)
update 語句 格式:UPDATE 表名 SET 列名=值 [WHERE 條件表達式]
不帶條件修改數據,修改所有行:
update dbo.TEST set age=19;
帶條件修改數據
update dbo.TEST set age=119 where id =5 ;
一次修改多個列
update dbo.TEST set age=119,address='中國北京' where id =5 ;
delete 語句 格式:DELETE FROM 表名 [WHERE 條件表達式]
帶條件刪除數據
delete from dbo.TEST where id =5
不帶條件刪除數據
delete from dbo.TEST
使用truncate刪除表中所有記錄
truncate table dbo.TEST
truncate和delete的區別:
truncate 相當於刪除表的結構,再創建一張表。可以消除自增長。
3. DQL: Data Query Language
select 語句 格式: select 字段名 from 表名 [WHERE 條件表達式]
1 簡單查詢
select * from dbo.TEST;
select * from dbo.TEST where age>20;
select id,cardid,name from dbo.TEST where id>4;
select id,cardid,name from dbo.TEST where name='王五';
between ..and 表示在兩個數之間
select * from dbo.TEST where age between 18 and 30 ;
in 表示或者的關係
select * from dbo.TEST where age in(18,30);
某列數據和固定值運算想
select age+5 from dbo.TEST where id=1;
某列數據和其他列數據參與運算
select age+id from dbo.TEST where id=1;
% 匹配任意多個字符串 _ 匹配一個字符
select * from dbo.TEST where name like N'張%';
聚合函數:
統計個數
select count(*) from dbo.TEST;
求平均
select avg(age) as '年齡' from dbo.TEST;
求和
select sum(age) as '年齡總和' from dbo.TEST;
最大值
select max(age) as '最大值' from dbo.TEST;
最小值
select min(age) as '最小值' from dbo.TEST;
清除重複值
select distinct address from dbo.TEST;
3.1 多表聯查
表與表之間的關係
表與表之間的三種關係 |
關係如何維護 |
一對一 |
特殊的一對多,多方加唯一約束,從表的主鍵同時又是外鍵 |
一對多 |
通過主外鍵約束 |
多對多 |
通過中間表,中間表與兩個表是多對一 |
數據庫的三大範式
範式 |
特點 |
第1範式 |
原子性,每列不可再拆分 |
第2範式 |
不產生局部依賴,表中每一列都完全依賴於主鍵。 |
第3範式 |
不產生傳遞,表中每一列都直接依賴於主鍵 |
3.2多表查詢的分類:
--創建部門表
create table dept(
id int primary key identity(1,1),
name nvarchar(20) )
insert into dept (name) values (N'開發部'),(N'市場部'),(N'財務部');
--創建員工表
create table emp
( id int primary key identity(1,1),
name nvarchar(10),
gender nchar(1), -- 性別
salary float, -- 工資
join_date date, -- 入職日期
dept_id int foreign key (dept_id) references dept(id) -- 外鍵,關聯部門表(部門表的主鍵)
)
insert into emp(name,gender,salary,join_date,dept_id) values(N'狗蛋','男 ',7200,'2013-02-24',1);
insert into emp(name,gender,salary,join_date,dept_id) values(N'狗剩','男 ',3600,'2010-12-02',2);
insert into emp(name,gender,salary,join_date,dept_id) values(N'王倩','男',9000,'2008-08-08',2);
insert into emp(name,gender,salary,join_date,dept_id) values(N'李芳','女 ',5000,'2015-10-07',3);
insert into emp(name,gender,salary,join_date,dept_id) values(N'張凱','女 ',4500,'2011-03-14',1);
內連接
用左邊表的記錄去匹配右邊表的記錄,如果符合條件的則顯示。如:從表.外鍵=主表.主鍵
隱式內連接:看不到 JOIN 關鍵字,條件使用 WHERE 指定
格式:SELECT 字段名 FROM 左表, 右表 WHERE 條件
select * from emp,dept where emp.dept_id= dept.id;
顯式內連接:使用 INNER JOIN ... ON 語句, 可以省略 INNER
格式:SELECT 字段名 FROM 左表 [INNER] JOIN 右表 ON 條件
select * from emp inner join dept on emp.dept_id=dept.id;
總結內連接查詢步驟:
1) 確定查詢哪些表
2) 確定表連接的條件
3) 確定查詢的條件
4) 確定查詢的字段
左外連接:用左邊表的記錄去匹配右邊表的記錄,如果符合條件的則顯示;否則,顯示 NULL,可以理解爲:在內連接的基礎上保證左表的數據全部顯示
格式:SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 條件
準備:-- 在部門表中增加一個銷售部
insert into dept(name) values(N'銷售部')
select * from dept
-- 使用內連接查詢
select * from emp inner join dept on emp.dept_id=dept.id;
-- 使用左外連接查詢
select * from dept left outer join emp on dept.id=emp.dept_id
右外連接:用右邊表的記錄去匹配左邊表的記錄,如果符合條件的則顯示;否則,顯示 NULL,可以理解爲:在內連接的基礎上保證右表的數據全部顯示
格式:SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 條件
準備:-- 在員工表中增加一個趙柳
insert into emp(name,gender,salary,join_date,dept_id) values(N'趙柳','男 ',7200,'2013-02-24',null);
select * from emp;
-- 使用內連接查詢
select * from emp inner join dept on emp.dept_id=dept.id;
--使用右外連接查詢
select * from dept right outer join emp on dept.id=emp.dept_id
全連接查詢:可以理解爲左外連接+右外連接
格式:SELECT 字段名 FROM 左表 full JOIN 右表 ON 條件
--全連接查詢
select * from dept full join emp on dept.id=emp.dept_id
子查詢
子查詢的概念:
1) 一個查詢的結果做爲另一個查詢的條件
2) 有查詢的嵌套,內部的查詢稱爲子查詢
3) 子查詢要使用括號
子查詢結果的三種情況:
子查詢的結果是單行單列
子查詢結果只要是單行單列,肯定在 WHERE 後面作爲條件,父查詢使用:比較運算符,如:> 、<、<>、 = 等
格式:SELECT 查詢字段 FROM 表 WHERE 字段=(子查詢);
-- 根據最高工資到員工表查詢到對應的員工信息
select * from emp where salary = (select max(salary) from emp);
-- 1) 查詢平均工資是多少
select avg(salary) from emp;
-- 2) 到員工表查詢小於平均的員工信息
select * from emp where salary < (select avg(salary) from emp);
2. 子查詢的結果是多行單列
子查詢結果是單例多行,結果集類似於一個數組,父查詢使用 IN 運算符
格式 :SELECT 查詢字段 FROM 表 WHERE 字段 IN (子查詢);
-- 先查詢大於5000的員工所在的部門id
select dept_id from emp where salary > 5000;
-- 再查詢在這些部門id中部門的名字
--Subquery returns more than 1 row
select name from dept where id = (select dept_id from emp where salary > 5000);
--正確
select name from dept where id in (select dept_id from emp where salary > 5000);
--查詢開發部與財務部所有的員工信息
-- 先查詢開發部與財務部的id
select id from dept where name in(N'開發部',N'財務部');
-- 再查詢在這些部門id中有哪些員工
select * from emp where dept_id in (select id from dept where name in(N'開發部',N'財務部'));
3. 子查詢的結果是多行多列
子查詢結果只要是多列,肯定在 FROM 後面作爲表,子查詢作爲表需要取別名,否則這張表沒有名稱則無法訪問表中的字段。
格式:SELECT 查詢字段 FROM (子查詢) 表別名 WHERE 條件;
-- 查詢出2011年以後入職的員工信息,包括部門名稱
-- 在員工表中查詢2011-1-1以後入職的員工
select * from emp where join_date >='2011-1-1';
-- 查詢所有的部門信息,與上面的虛擬表中的信息組合,找出所有部門id等於的dept_id
select * from dept d, (select * from emp where join_date >='2011-1-1') e where d.id= e.dept_id ;
子查詢小結
子查詢結果只要是單列,則在 WHERE 後面作爲條件
子查詢結果只要是多列,則在 FROM 後面作爲表進行二次查詢
4 .TCL: Transaction Control Language
事務:一個或一組sql語句組成一個執行單元,這個執行單元要麼全部執行,要麼全部不執行。
事務的特性:
ACID
- 原子性:事務必須是一個自動工作的單元,要麼全部執行,要麼全部不執行。
- 一致性:事務結束的時候,所有的內部數據都是正確的。
- 隔離性:併發多個事務時,各個事務不干涉內部數據,處理的都是另外一個事務處理之前或之後的數據。
- 持久性:事務提交之後,數據是永久性的,不可再回滾。
然而在SQL Server中事務被分爲3類常見的事務:
- 自動提交事務:是SQL Server默認的一種事務模式,每條Sql語句都被看成一個事務進行處理,你應該沒有見過,一條Update 修改2個字段的語句,只修該了1個字段而另外一個字段沒有修改。。
- 顯式事務:T-sql標明,由Begin Transaction開啓事務開始,由Commit Transaction 提交事務、Rollback Transaction 回滾事務結束。
- 隱式事務:使用Set IMPLICIT_TRANSACTIONS ON 將將隱式事務模式打開,不用Begin Transaction開啓事務,當一個事務結束,這個模式會自動啓用下一個事務,只用Commit Transaction 提交事務、Rollback Transaction 回滾事務即可。
- Begin Transaction:標記事務開始。
- Commit Transaction:事務已經成功執行,數據已經處理妥當。
- Rollback Transaction:數據處理過程中出錯,回滾到沒有處理之前的數據狀態,或回滾到事務內部的保存點。
- Save Transaction:事務內部設置的保存點,就是事務可以不全部回滾,只回滾到這裏,保證事務內部不出錯的前提下。
事務的隔離級別 事務在操作時的理想狀態: 所有的事務之間保持隔離,互不影響。因爲併發操作,多個用戶同時訪問同一個 數據。可能引發併發訪問的問題:
髒讀 |
一個事務讀取到了另一個事務中尚未提交的數據 |
不可重複讀 |
一個事務中兩次讀取的數據內容不一致,要求的是一個事務中多次讀取時數據是一致的,這是事務update時引發的問題 |
幻讀 |
一個事務中兩次讀取的數據的數量不一致,要求在一個事務多次讀取的數據的數量是一致的,這是insert或delete時引發的問題 |
數據庫有四種隔離級別 上面的級別最低,下面的級別最高。“是”表示會出現這種問題,“否”表示不會出現這種問題
級別 | 名字 | 隔離級別 | 髒讀 | 不可重複讀 | 幻讀 | 數據庫默認隔離級別 | ||||||||||||||
1 | 讀未提交 | read uncommitted | 是 | 是 | 是 | |||||||||||||||
2 | 讀已提交 | read committed | 否 | 是 | 是 | Oracle 和 SQL Server | ||||||||||||||
3 | 可重複讀 | repeatable read | 否 | 否 | 是 | MySQL | ||||||||||||||
4 | 串行化 | serializable | 否 | 否 | 否 |
隔離級別越高,性能越差,安全性越高。
5.6.4 MySQL 事務
5 DCL: Data Control Language
授予權限操作——grant
SQL Server服務器通過授予權限表來控制用戶對數據庫的訪問。在數據庫中添加一個新用戶之後,若不進行額外操作,該用戶只有查詢系統表的權限,而不具有操作數據庫對象的任何權限。GRANT語句可以授予對數據庫對象的操作權限,這些數據庫對象包括:表,視圖,存儲過程,聚合函數等。允許執行的權限包括:查詢,更新,刪除等。
例:對名稱爲guest的用戶進行授權,允許其對stu_info表執行更新和刪除操作
GRANT UPDATE,DELETE ON stu_info
TO guest WITH GRANT OPTION
注:WITH GRANT OPTION意思是該用戶還可以向其他用戶授予其自身所擁有的權限。
拒絕權限操作——deny
例:禁止名稱爲guest的用戶對stu_info表的操作更新權限
DENY UPDATE ON stu_info TO guest CASCADE
收回權限操作——revoke
例:收回guest用戶對stu_info的刪除權限
REVOKE DELETE ON stu_info FROM guest
本次用的例子的數據庫是SQL server 爲啥不用mysql呢,因爲公司用的就是SQL server