SQL語句分類以及詳解

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) 子查詢要使用括號

 

子查詢結果的三種情況:

  1. 子查詢的結果是單行單列

   子查詢結果只要是單行單列,肯定在 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

 

 

 

 

 

 

 

 

 

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