高級SQL運用

:什麼是數據庫設計?html

數據庫設計就是將數據庫中的數據實體以及這些數據實體之間的關係,進行規範和結構化的過程.前端

:爲何要實施數據庫設計?shell

1:良好的數據庫設計能夠有效的解決數據冗餘的問題數據庫

2:效率高服務器

3:便於進一步擴展數據庫設計

4:使得應用程序開發變得容易ide

:設計數據庫的步驟函數

第一步    需求分析:  分析客戶的業務和數據處理需求(收集信息,標識實體,標識每一個實體須要存儲的詳細信息,標識實體間的關係)性能

第二步    概要設計:  繪製E-R,用於與客戶或團隊成員的交流spa

第三步    詳細設計:  E-R圖轉換成多張表,進行邏輯設計,應用數據庫設計的三大範式進行審覈,選擇具體的數據庫而後建庫建表建約束,建立完成開始編寫代碼,開發前端應用程序.

:繪製E-R

  (1) 什麼是實體?

      實體是指現實世界中具備區分其餘事物的特徵或屬性並與其餘實體有聯繫的實體(實體通常是名詞)

      嚴格來講,實體是指表中一行特定的數據,也經常把表稱爲一個實體

  (2)什麼是屬性?

      屬性能夠理解爲實體的特徵,屬性對應表中的列

  (3)什麼是聯繫?

      聯繫是兩個或多個實體之間的關聯關係(通常是動詞)

  (4)什麼是映射基數?

      映射基數是表示經過聯繫與該實體關聯的其餘實體的個數,具體有 一對一 ,  一對多,  多對一,  多對多.

  (5)什麼是關係實體圖?

      E-R圖以圖形的方式將數據庫的整個邏輯結構表示出來.     矩形表示實體集;橢圓表示屬性;菱形表示聯繫集;

       直線用來鏈接屬性和實體集,也用來聯繫實體集和聯繫集.

 

例如,酒店管理系統中E-R:

 

 

:繪製數據庫模型圖

例如:酒店管理系統數據庫模型圖

 

 

 

:數據規範化

規範設計

第一範式

第一範式的目標是確保每列的原子性,若是每列都是不可再分的最小單元(也稱爲最小的原子單元),則知足第一範式

第二範式:

若是一個關係知足第一範式,而且除主鍵之外的其餘列,都依賴於該主建,則知足第二範式,第二範式要求一張表只描述一件事情

第三範式:

若是一個關係知足第二範式,而且除了主鍵之外的其餘列都不傳遞依賴於主鍵列,則知足第三範式

 

:第二範式是其餘列都依賴於主鍵列可是沒有說明是直接依賴仍是間接依賴,也就是直接依賴和間接依賴都可,但第三範式明確指出只能是直接依賴,若是出現間接依賴的狀況,要單首創建一張表出來

 

:規範化和性能的關係

爲了知足某種商業目標,數據庫性能比規範數據庫更重要

具體策略和方法:

(1):經過在給定的表中添加額外字段,以大量減小須要從中搜索信息所須要的時間

(2):經過在給定的表中插入計算列(好比成績總分),以方便查詢

在數據庫規範時,要綜合考慮數據庫性能.

 

 

 

 

 

 

:建立數據庫

建立一個數據文件和一個日誌文件(MySchool)

create database MySchool
on primary      --默認屬於primary主文件組,可省略
(
--數據文件的具體描述

name = 'MySchool_data'    --主數據庫文件的邏輯名稱
filename = 'D:\project\MySchool_data.mdf', --主數據庫文件的物理名稱
size = 5MB,     --主數據庫文件的初始大小
maxsize = 100MB,     --主數據庫文件增加的最大值
filegrowth = 15%     --主數據文件的增加率

)
log on
(
--日誌文件的具體描述,各參數含義同上

name = 'MySchool_log',    --主數據庫文件的邏輯名稱
filename = 'D:\project\MySchool_data.ldf', --主數據庫文件的物理名稱
size=2MB,     --主數據庫文件的初始大小
filegrowth = 1MB    --主數據文件的增加速度

)
go

 

建立多個數據文件和多個日誌文件(employees)
create database employees
on primary
(
--主數據庫文件的具體描述
name='employee1',
filename='D:\project\employee1.mdf',
size=10,
filegrowth=10%
),
(
--次要數據庫文件的具體描述
name='employee2',
filename='D:\project\employee2.mdf',
size=20,
maxsize=100,
filegrowth=1
)           
log on
(
--日誌文件1的具體描述
name='employeelog1',
filename='D:\project\employee1_log.ldf',
size=10,
maxsize=50,
filegrowth=1
),
(
--日誌文件2的描述
name='employeelog2',
filename='D:\project\empolyee2_log.ldf',
size=10,
maxsize=50,
filegrowth=1
)
go

 

 

:刪除數據庫
usr master
if exists(select * from sysdatabases where name='....')
drop database ......

 

 

:建立和刪除表

use MySchool    --Myschool中建立表
go

create table Student
(
StudentNo int not null.   --學號,int 類型,不容許爲空
LoginPwd nvarchar(50) not null,  --密碼 nvarchar類型,不容許爲空
StudentName nvarchar(50) not null, --名字,nvarchar類型,步容許爲空
Sex bit not null,   --性別,取值01
Email nvarchar(20)   --郵箱,可爲空
)
go

刪除表
use MySchool
go
if exists(select * from sysobjects where naem='Student')
drop table Student
  
                                                                                                                                                                                                                                                                                                                                                                                                   
:建立和刪除約束
主鍵約束(Primary Key Constraint)
非空約束(Not Null)
惟一約束(Unique Constaraint)
檢查約束(Check Constaraint)
默認約束(Default Constaraint)
外建約束(Foreign Key Constarint):用於在兩表之間創建關係,須要指定引用主表的哪一列

alter table 表名
add constraint 約束名  約束類型  具體的約束說明

:
--添加主鍵約束
alter table Student
add constraint PK_StudentNo Primary Key(StudentNo)

--添加惟一約束
alter table student
add constraint UQ_IdentityCard unique(IdentityCard)

--添加默認約束
alter table Student
add constraint DF_Address default('地址不詳') for address

--添加檢查約束
alter table Student
add constraint CK_BornDate checke(BornDate>='1980-01-01')

--添加外鍵約束(Result是從表,Student是主表)
alter table Result
add constraint FK_StudentNo
foreign key(StudentNo) references Student(StudentNo)
go


刪除約束
alter table 表名
drop constraint 約束名

:刪除學生表中的默認約束
alter tablte Student
drop constraint DF_Address


怎樣向已存在數據的表中添加約束
alter table Employee with nocheck ( whit nocheck不向已存在的數據約束)
add constraint

向已存在的數據表中插入一列
alter table 表名
add 列名 數據類型  null

 

 

在數據庫中用SQL語句建立文件夾(:E盤建立一個project文件夾)

exec sp_configure 'show advanced option',1

go

reconfigure

go

exec sp_configure 'xp_cmdshell',1

go

reconfigure

go

exec xp_cmdshell 'mkdir D:\project'

 

 

 

 

 

 

使用變量 數據類型轉換 邏輯控制語句(begin ...end; case...end; if...else; while)

:變量

變量分爲局部變量和全局變量  (全局變量是系統自定的,不可手動給值的,若想本身定義全局變量可考慮建立全局臨時表!)

局部變量的定義:  declare @變量名  數據類型    (局部變量只能用於同一批處理當中!!!!!!!)

全局變量: @@

@@error        最後一個T-SQL語句錯誤的錯誤號

@@identity     最後一次插入的標識值

@@rowcount   受上一個SQL語句影響的行數

@@servicename   該計算機上SQl服務器的名稱

@@version    SQL Server的版本信息

@@transcount   當前鏈接打開的事務數

@@timeticks    當前計算機上每刻度的微秒數

@@max_connections 能夠建立的,同時鏈接的最大數目

@@language     當前使用的語言的名稱

 :給變量賦值  (set  seklect)

setselect的區別

1:set不支持多個變量賦值,select支持

2:表達式返回多個值時,set出錯,select返回最後一條數據

3:表達式未返回任何值時,set賦值爲null(沒有) select 保持不變

 

:輸出語句

print @變量名 或

select @變量名

通常從數據庫中查找數據後賦值使用select賦值方法

:數據類型轉換

隱式轉換: 類型相同或相兼容,自動轉換

顯式轉換: 類型不一樣,可用convert 函數  cast 函數

相同點: 都用於某種數據類型的表達式轉換爲另外一種數據類型

不一樣點: 在轉換日期的時候,convert能夠轉化爲指定的格式

cast (變量名 as 數據類型)

convert(數據類型, 變量名)

:邏輯控制語句

流程控制語句  begin....end  

一般使用在if判斷和while循環中,至關於C#中的 {}

分支結構   if..else 

     case ...end(多重選擇)

eg:

  select 成績=case

        when 條件一  then 結果一

        when 條件二  then 結果二

        else 其餘結果(可省略)

相關文章
相關標籤/搜索