sqlserver基礎

數據庫事務?
爲數據庫操作序列提供了一個從失敗中到恢復正常狀態的方法,還有就是如果真的出現了異常仍然能夠保證一致性的方法

當有多個應用程序訪問同一數據庫時能夠爲這些操作做好隔離,防止多個應用程序互相干擾
數據庫事務擁有四個特性
原子性:事務作爲一個整體被執行,要麼都執行要麼都不執行
一致性:事務執行完必須是由一個狀態轉變成另外一個狀態,一致性的含義是數據庫中的數據要滿足完整性約束
隔離性:多個事務併發執行,事務之間互不影響
持久性:事務執行完畢就是永久性的,也修改的數據永久地保存在數據庫中

Select語句:

  1. 查詢所有記錄

Select *from 表名;

*代表所有字段也可寫成

Select 學號,姓名,性別,成績 from student;

  1. 查詢滿足一定條件的記錄(查詢滿足成績在[60,70]),並列出他們的姓名,成績信息

Select 姓名,成績 from student

Where 成績>=60 and 成績<=70;

  1. 對查詢結果進行排序

查詢成績合格的學生,並按成績降序顯示查詢結果

Select * from student

Where 成績>=60

Order by 成績 DESC;

說明:DESC 降序

  ASC  升序(默認好像是升序的)

  1. 模糊查詢

需要通過通配符來實現,通配符 “%” 可以匹配任意的字符串

例:查詢所有姓王的學生

Select * from student

Where 姓名 like ‘王%’;

統配符”_”則只能匹配一個字符

例:查詢姓王並且姓名僅由兩個字構成的學生

Select *from student

Where 姓名 like ‘王_’;

SQL windows 身份驗證

SQLserver 身份(在其他地方也可以登錄)

創建用戶:

普通用戶不可以再創建用戶

(強制密碼過期去掉)

數據庫是如何處理存儲問題的?

把能夠唯一標識事物的屬性稱爲主鍵(例如學號)

軟件最賺壟斷部門(煤炭石油)

設計任何一個事物都需要主鍵

唯一的標識符

數據庫研究的就是事物要怎麼存,關係怎麼存

個體與個體之間的關係

關係型數據庫

Java 面向對象的

關係是通過外鍵(連接兩個表的字段)來表示的

多對一:將外鍵多的一方

寫在例如

員工表

員工姓名

員工工資

員工性別

員工編號(主鍵)

部門編號(外鍵)

張三

1000

10001

1

李四

2000

10002

2

 

部門表

部門名稱

部門人數

部門地址

部門編號(主鍵)

市場部

1000

西安

1

研發部

50

西安

2

 

設置成外鍵的字段不能隨便更改

列就稱爲字段或者屬性

行稱爲記錄也稱爲元組

字段:一個事物的某一個(靜態的)特徵。

記錄:字段的組合,表示的是一個具體的事物。

表:記錄的組合,表示的是同一類事物的集合。

表和字段記錄的關係:

字段是事物的屬性

記錄是事物本身

表是事物的集合

建表兩種:①鼠標點②寫命令

nvarchar() 表示是可變的字符類型

表 dbo. 系統的身份權限最大當前用戶本身

給表起名不能是user(因爲user爲系統用戶名,是一個關鍵字)

 

Update 表 set 屬性 = xxx

約束有:

非空約束

主鍵約束

外鍵約束

Check約束(設置範圍約束)

爲什麼設置主鍵??

防止事物冗餘(有重複)

外鍵實際上就是關係

外有外鍵字段的表叫做外鍵表

設置完外鍵之後外記得保存

在SQLserver中註釋是二槓 “--”

主流編程都源自於C語言,但是數據庫與C無關係

使用命令來建表:

Create table emp

(

emp_id int primary key,   --主鍵

Emp_name nvarchar(20) not null, --非空約束(存漢字必須把n添上)

emp_sex nchar(1)

)

寫好表之後先點√號分析一下,然後再執行

dept_id int constraint fk_dept_id_height foreign key references dept(dept_id)

如果沒有給鍵起名,那麼系統會自動產生一個

什麼是約束??

定義:對一個表中的屬性操作的限制叫做約束

分類:

主鍵約束

外鍵約束

非空約束

Check約束

emp_sal int check(emp_sal>=1000 and emp_sal <=8000)

 

插入數據:

Insert into 表名 values()

Default 約束

stu_sex nchar(2) default(‘男’) -- 括號可以不寫

在數據庫中字符串用單引號’’

名字(也就是字段名)使用雙引號””

唯一約束與主鍵有什麼區別?

主鍵不能爲NULL 而unique約束可以爲NULL

如何合理利用主鍵和唯一鍵建表?

用有實際意義的鍵當主鍵不好

一般都是使用編號來作爲主鍵

有實際意義的而且還不允許重複的鍵當unique(唯一)鍵

stu_id int primary key identity    --自動增長不需要設置值了

stu_name nvarchar(20) unique not null

刪除表:

drop table 表名

 

master 庫

Insert 數據沒有指定輸入幾個屬性,不管是否有default 默認約束必須給每個屬性都賦值

數據庫是通過表來解決事物的存儲問題的

 

 

一對一:  (假設是A表和B表)

既可以把A表的主鍵充當B表的外鍵也可以反過來,都行

一對多:

把表A的主鍵當做表B的外鍵,將外鍵設置在多的一方

多對多:

例 班級與老師的關係

不可以在班級表或老師表中添加外鍵,必須要再創建一個表來表示多對多這種關係

 

班級表

Id

人數

1

20

2

30

3

40

4

50

老師表

Id

姓名

1001

A

1002

B

1003

C

1004

D

新建表

班級

老師

課程

1

1001

C

1

1002

PHP

2

1001

Java

3

1001

SQL

任何一個表一定有主鍵,但是不一定有外鍵

數據庫最終討論的就是數據的存儲問題,如何用表來描述事物之間的關係

 

表名一般寫單數

Mapping 映射

不允許一個表有兩個屬性爲外鍵

Create table BanJi_jiaoshi_mapping

(

Banji_id int constraint fk_banji_id foreign key references banji(banji_id),

Jioashi_id int foreign key references jiaoshi(jiaoshi_id),

Kecheng nchar(20),

Constraint pk_banji_id_jiaoshi_id primary key (banji_id,jiaoshi_id),

)

設置banji_id,jiaoshi_id 整體爲主鍵

從數據庫中刪除關係就是刪除的約束條件,並不刪除字段

查詢:

  1. 計算列
  2. Distinct
  3. Between
  4. In
  5. Top
  6. Null
  7. Order by
  8. 模糊查詢
  9. 聚合函數
  10. Group by
  11. Having
  12. 連接查詢

嵌套查詢:

Select ename,sal*12 as “年薪” from emp;

as 可以省略,最好寫成”” 雙引號

Select deptno from emp;

Select 1000 from emp;

先找到emp表,找第一套記錄,找deptno 值,找到就輸出,如果有14行記錄,那麼就輸出14行1000

Select distinct deptno from emp;

Distinct 也可以過濾掉空,有多個空則只輸出一個空

Select distinct comm,deptno from emp;

這樣是對comm,deptno 整體進行過濾掉,使comm deptno兩個值不相同

Select deptno distinct comm from emp;

這樣不可以執行,邏輯上有錯誤

 

Select *from emp

Where sal between 1500 and 5000; --可以不寫分號

 

Where sal in(1500,3000,5000)

查詢sal值爲1500,3000,5000的記錄

或者這樣寫

Where sal =1500 or sal =3000 or sal=5000

 

Select top 2 *from emp --查詢前兩條記錄

Select top 15 percent* from emp --查詢整個表中的15%的記錄,如果不是整數,則取整

 

6、null 不能參與 < 、>、 !=、 = 運算

可以參與 is isnot

Select *from emp

Where comm is null

datatime 也是個數據類型

Null 不能參與參與任何運算,否則結果都是null

任何數據類型都可爲null

  1. order by deptno sal;

先將deptnno 升序排列,如果 deptno相同,再將sal升序排列

Order by deptno asc,sal;

先將deptno 降序排列,如果deptno 相同再將相同的記錄給sal進行默認升序排列

Order by deptno ,sal desc;

  1. select * from emp

Where ename like ‘%A%’ --含有A的

格式:

Select 字段的集合from 表名

Where 某個字段的名字like 匹配的條件

 

通配符:

①%:表示任意0個或者多個只讀

Where ename like ‘%A’; ename 尾字母爲A的記錄

②_(下劃線)表示任意單個字符

Select *from emp

Where ename like ‘_A%’   --第二個字符爲A的記錄

③[A-F]

Select * from emp

Where ename like ‘_[A-F]%’  --ename 中第二個字符是A~F之間的記錄

④[a-f]

⑤[^a-c] ^表示取反,不是a~c之間的字符

注意匹配的條件必須用單引號括起來

 

escape ‘\’ 表示\符號被當做特殊字符

 

  1. Select lower(ename) from emp; --轉成小寫
  2. Select max(sal) from emp; --sal最大的記錄

聚合函數:

max()

Sum()

Min()

Arg() --平均值

Count() --求個數

例:

Select count(*) from 表名; --返回表共有多少記錄

Count()函數重複的記錄也會被計算,空值不會被重複計算

Count(distinct 字段名)

返回字段不重複且非空的記錄個數

Select max(sal) lower (ename) from 表名

這樣使用會出錯,單行函數和多行函數通用會出錯

進行 min() 操作是會忽略空值

Having 短語一般與group by 混用

 

向已經建好的表中添加新的列或添加約束

Alter table 表名

Alter column 字段名 類型

Add 字段名 類型

Drop column 字段名

添加索引

Create index 字段名 on 表名

 

  1. 聚合函數

函數的分類

①單行函數: 每一行返回一個值

②多行函數:多行返回一個值

例:

Select max(sal) from emp;

聚合函數是多行函數

聚合函數分類:

Max()

Min()

Arg()

Count()

Select count(*) from emp; --返回emp表記錄的個數

Select count(deptno) from emp;

Select count(distinct deptno) from emp; --重複的記錄不在進行計算

Select count(comm) from emp;

 

Count(*) 返回表中所有記錄的個數

Count(字段名) 返回字段非空的記錄個數,重複的記錄也會被重複計算

Count(distinct 字段名)

注意的問題:

Select max(sal , lower(ename)) from emp;

出錯,單行函數不能與多行函數混用

 

  1. group by

Having 對分組後的數據進行過濾

例:

輸出每個部門編號和平均工資

Select deptno,arg(sal) as “部門平均工資” from emp

Group by deptno;

按deptno 分組 ,分完組輸出deptno arg(sal)

分組後統計的是組的信息

Select deptno,ename from emp

Group by deptno

出錯!不能寫deptno內部的信息

總結:使用了group by 之後,select 只能出現分組後的整體信息,不能出現組內的信息

 

求部門相同,並且工作相同的平均工資:

Select deptno ,job,arg(sal) ,count(*),sum(sal),min(sal) from emp

Group by deptno,job; --先按照部門分組,部門如果一樣,在按照工作分組

 

Group by

格式:group by 字段的集合

功能:把表中的記錄按照字段分成不同的組

 

Group by a,b,b

最終統計的是最小分組的信息

  1. having 對分組之後的信息進行過濾

例:

輸出部門平均工資>2500的部門便你好,部門的平均工資

Select deptno ,arg(sal) from emp

Group by deptno

Having arg(sal)>2500

Having 和where 的區別?

例:

把姓名不包括A的所有員工按部門分組,輸出部門工資>2000的部門編號,平均工資

Select deptno,arg(sal),count(*),max(sal) from emp

Where sal > 2000

Group by deptno

Having arg(sal) > 3000

Where 對原始記錄過濾

Having 對分組後的記錄進行過濾

順序不能改變

  1. 連接查詢

定義:將兩個表或者兩個以上的表以一定的連接條件連接起來,從而檢索出滿足條件的數據

分類:

內連接

外連接

①select * from A表 , B表產生的是笛卡爾集

產生的共有行數=A錶行數*B錶行數

列數=A列+B列

沒有什麼連接條件的話,那麼就是A表的每一條記錄與B表的每一條記錄都有連接

②select *from A , B

Where A.emmpno=1000    --根據條件進行連接

③select ……from A join B on ……用法

Join 是表與表進行連接 on後面的是連接條件

④select ……from A , B where……

這樣寫和③中的寫法結果都是一樣的

On 指定連接條件

Where 對連接表進行過濾

左連接與右連接

例:

A表

Aid

Adata

1

a1

2

a2

3

a3

B表

Bid

Bdata

1

b1

2

b2

4

b4

 

左連接

Select * from a left join b

Where a.aid=b.bid;

執行過程是先取出a表中的所有數據在取出b中的滿足條件的數據,然後合成一個表結果爲:

 

1

a1

b1

2

a2

b2

3

a3

null

 

右連接

Select* from a right join b

Where a.aid=b.bid  結果爲:

1

b1

a1

2

b2

a2

4

B4

null

 

  • 查詢選修了課程名爲數據庫的學生的姓名和年齡

Select sname , sage from student , sc , course

Where student.sno=sc.scno and sc.cno=course.cno and cname=’數據庫’

  • 查詢選修了2課程與3課程的學生的姓名和學號

Select sname,student.sno from student ,sc

Where sno in (select sno from sc where cno=2) and sno in (select sno from sc.where cno =3);

③查詢選修了全部課程的學生姓名

Select sname from student

Where sno in(select sno from sc  

group by sno

Having count(cno)=(select count(*) from course) )

該問題是先在sc表中找滿足全選課程的學號,然後在查看該學號在student中的學生姓名

 

 

將查詢到的數據添加到另一個表中去:

Insert into 要添加數據表名(字段列表)

Select 字段列表 from 原始表

注意的是:insert into 目標表(字段列表)

不是insert into 目標表 values(字段)

 

 

發佈了48 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章