數據庫學習
sql server數據庫基本概念
使用文件保存數據存在幾個缺點:
1、文件的安全性問題;
2、文件不利於查詢和對數據的管理;
3、文件不利於存放海量數據
4、文件在程序中控制不方便。
數據庫的定義(1)
嚴格地說,數據庫是“按照數據結構來組織、存儲和管理數據的倉庫”。在經濟管理的日常工作中,常常需要把某些相關的數據放進這樣的“倉庫”,並根據管理的需要進行相應的處理。例如,企業或事業單位的人事部門常常要把單位職工的基本情況(職工號、姓名、年齡、性別、籍貫、工資、簡歷等)存放在表中,這張表就可以看成一個數據庫。有了這個“數據倉庫”我們就可以根據需要隨時查詢某職工的基本情況,也可以查詢工資在某個范圍內的職工人數等等。這些工作如果都能在計算機上自動進行,那我們的人事管理就可以達到極高的水平。此外,在財務管理、倉庫管理、生產管理中也需要建立眾多的這種“數據庫”,使其可以利用計算機實現財務、倉庫、生產的自動化管理。
數據庫的定義(2)
J.Martin組數據庫下了一個比較完整的定義:數據庫是存儲在一起的相關數據的集合,這些數據是結構化的,無有害的或不必要的冗余,並為多種應用服務;數據的存儲獨立於使用它的程序;對數據庫插入新數據,修改和檢索原有的數據均能按一種公用的和可控制的方式進行。當某個系統中存在結構上完全分開的若干個數據庫時,則該系統包含一個“數據庫集合”。
數據庫的基本結構
數據庫的基本結構分三個層次,反映了觀察數據庫的三種不同角度。
1、物理數據層
它是數據庫的最內層,是物理存貯設備上實際存儲的數據的集合。這些數據的原始數據,是用戶加工的對象,由內部模式描述的指令操作處理的位串、字符和字組成。
2、概念數據層
它是數據庫的中間一層,是數據庫的整體邏輯表示。指出了每個數據的邏輯定義及數據間的邏輯聯系,是存貯記錄的集合。它所涉及的是數據庫所有對象的邏輯關系,而不是它們的物理情況,是數據庫管理員概念下的數據庫。
3、邏輯數據層
它是用戶所看到和使用的數據庫,表示了一個或一些特定用戶使用的數據集合,即邏輯記錄的集合。
數據庫不同層次之間的聯系是通過映射進行轉換的。
數據庫的基本特點
1、實現數據共享
數據共享包含所有用戶可同時存取數據庫中的數據,也包括用戶可以用各種方式通過接口使用數據庫,並提供數據共享。
2、減少數據的冗余度
同文件系統比,數據庫實現了數據共享,從而避免了用戶各自建立應用文件。減少了大量重復數據,減少了數據冗余,維護了數據的一致性
3、數據實現集中控制
文件管理方式中,數據處於一種分散的狀態,不同的用戶或同一用戶在不同處理中其文件之間毫無關系。利用數據庫可對數據進行集中控制和管理,並通過數據模型表示各種數據的組織以及數據間的聯系。
4、數據一致性和可維護性,以確保數據的安全性和可靠性。
5、故障恢復
目前主流數據庫
微軟: Sql Server和Access
瑞典MySQL: AB公司MySql
IBM公司: DB2
美國Sybase公司: Sybase
IBM公司: Informix
美國Oracle公司: Oracle
數據庫選擇:
1、成本;2、功能;3、並發性要求;4、安全性;
為什么學習SqlServer?
簡單易學
一般來講,學習數據庫很多人都是從微軟的sql server數據庫開始的,我們知道微軟的產品以簡單易用見長,事實也是如此,從sqlserver開始學習數據庫是正確的選擇,后面我們還要帶領大學學習oracle數據庫,如果一上手就學習oracle這種大型數據庫,會很吃力。
sql server介紹(1)
SQL是英文Structured Query Language的縮寫,意思為結構化查詢語言。SQL語言的主要功能就是同各種數據庫建立聯系,進行溝通。按照ANSI(美國國家標准協會)的規定,SQL被作為關系型數據庫管理系統的標准語言。SQL語句可以用來執行各種各樣的操作,例如更新數據庫中的數據,從數據庫中提取數據等。目前,絕大多數流行的關系型數據庫管理系統,如Oracle、Sybase、Microsoft SQL Server、Access等都采用了SQL語言標准。
sql server介紹(2)
SQL Server是一個關系數據庫管理系統。它最初是由Microsoft Sybase和Ashton-Tate三家公司共同開發的,於1988年推出了第一個OS/2版本。在Windows NT推出后,Microsoft與Sybase在SQLServer的開發上就分道揚鑣了,Microsoft將SQLServer移植到Windows NT系統上,專注於開發推廣SQLServer的Windows NT版本。Sybase則較專注於SQL Server在UNIX操作系統上的應用。
SQL Server2000是Microsoft公司推出的SQLServer數據庫管理系統,該版本繼承了SQL
Server7.0版本的優點,同時又比它增加了許多更先進的功能。
sql server開發工具
sql server2000為我們提供了兩種開發工具
1、企業管理器
企業管理器是微軟提供的圖形界面方式操作sql server2000的工具
2、查詢分析器
查詢分析器是微軟提供的用命令行(sql語句)操作sqlserver2000的工具
企業管理器的使用(1)
數據庫用戶和管理員的概念
1、管理員sa的介紹
2、如何修改sa的密碼
企業管理器的使用(2)
為了讓大家能迅速掌握企業管理器的使用,我們使用管理器。
以一個梁山好漢管理為例
1、建庫
2、建表
英雄表 hero
[這里涉及到對表的幾個重要概念:a、字段;b、字段類型(簡單介紹);c、表行;d、表列;e、記錄]
3、對表進行增加、刪除、修改、查詢的操作
這里可以針對真實班級的學生來做,並增加一定的互動,比如用點名機來抽學生操作,或是用點名機看看那個學生被刪除或是添加、修改...這樣可能學生更有興趣。
查詢分析器的使用(1)
企業管理器給用戶提供了一個很方便的圖形界面管理工具,大家用起來感覺直觀方便,可是它也有缺點,當一個表的記錄非常大的時候,對表的各種操作,都顯得不方便了,比如:
1、要求從1000行記錄中查詢是否存在名為“孫小明”的人
2、要求把1000行記錄中工資低於100的人,工資增加10%
3、要求把年齡大於30的人從數據表中刪除
這時,你會發現使用企業管理器是很不方便的
所以微軟為我們提供另外一個操作數據庫的工具,查詢分析器。查詢分析器可以非常方便的完成上述任務。
查詢分析器的使用(2)--sql語句
使用查詢分析器,我們就必需要了解sql語句。
什么是sql語句呢?
人與人交流是使用語言進行交流。我們與sql數據庫交流就要使用對應的計算機語言進行交流,所以訪問sql數據庫要使用sql語句進行指令的發送。
查詢分析器的使用(3)--sql語句
SQL全稱是“結構化查詢語言(Structured Query Language)”
SQL(Structured QueryLanguage)是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系數據庫系統。構化查詢語言(Structured Query Language)最早是IBM的聖約瑟研究實驗室為其關系數據庫管理系統SYSTEM R開發的一種查詢語言,它的前身是SQUARE語言。SQL語言結構簡潔,功能強大,簡單易學,所以自從IBM公司1981年推出以來,SQL語言得到了廣泛的應用。如今無論是像Oracle、Sybase、Informix、SQL Server這些大型的數據庫管理系統,還是像Visual Foxpro、PowerBuilder這些PC上常用的數據庫開發系統,都支持SQL語言作為查詢語言。
查詢分析器的使用(4)--sql語句
SQL語言包含4個部分:
數據定義語言(DDL),例如:CREATE、DROP、ALTER等語句。
數據操作語言(DML),例如:INSERT、UPDATE、DELETE語句。
數據查詢語言(DQL),例如:SELECT語句。
數據控制語言(DCL),例如:GRANT、REVOKE、COMMIT、ROLLBACK等語句。
查詢分析器的使用(5)
使用查詢分析器再次完成梁山好漢管理數據庫
1、建庫
2、建表
英雄表 hero
[這里涉及到對表的幾個重要概念:a、字段;b、字段類型(簡單介紹);c、表行;d、表列;e、記錄]
1、 對表進行增加、刪除、修改、查詢的操作
查詢分析器中創建數據庫
--創建數據庫
create database LiangshanHero2
--創建表
use LiangshanHero2--使用指定數據庫
go--執行
create table hero--表名
(heroId int ,--英雄排名
heroName varchar(50),--名字
heroNickName varchar(50),--綽號
sex char(2),--性別
sal int
)
--刪除一張表(把表的結構和表的數據刪除)
drop table hero
--使用sql語句來添加數據
insert into hero values(1,'宋江','及時雨','男',20000)
insert into hero values(2,'盧俊義','玉麒麟','男',15000)
insert into hero values(3,'吳用','智多星','男',30)
insert into hero values(4,'公孫勝','入雲龍','男',80)
--使用sql語句查詢數據,最基礎的查詢語句
select * from hero
--1、查詢工資低於100的同志
select * from hero where sal<100
--2、把工資低於100的人工資提高10%(update)
--語法結構:update表名 set 字段名1=?,字段名2=?...where 條件語句
update hero setsal=sal*1.1 where sal<100
--3、請刪除工資性別為女的
delete from hero where sex='男'
表的管理--表名和列的命名規則
1、必需以字母,_開頭
2、長度不能超過128個字符
3、不要使用sql server的保留字
4、只能使用如下字符A-Z,a-z,0-9,$,#,_等
表的管理--支持的數據類型
字符型
char 定長 最大8000字符(非unicode編碼)
char(10)'小韓'前四個字符放'小韓',后添6個空格補全
varchar變長 最大8000字符(非unicode編碼)
varchar(10)'小寒'sql server分配四個字符,這樣可以節省空間
ntext可變長度Unicode數據的最大長度為2的30次方-1(1,073,741,823)個字符
text可變長度非Unicode數據的最大長度為2的31次方-1(2,147,483,647)個字符
區別:
1、text是字節格式存儲英文的,也可以存中文但有時候會顯示成亂碼
2、ntext是多字節格式存儲unicode的,也就是存儲各種文字用的。
在什么時候使用char型而不使用varchar,在知道字段定長固定時就使用char
字符型
nchar 定長 最大4000字符(unicode編碼)
nchar(10)'小韓'前四個字符放'小韓',后添6個空格補全
nvarchar 變長 最大4000字符(unicode編碼)
nvarchar(10)'小寒'sql server分配四個字符,這樣可以節省空間
特別說明:
1、一般帶有漢字的字段用nvarchar,全英文或符號的用varchar,因為nvarchar為unicode字符集,該類型的字段無論是單個字母還是單個漢字都占兩個字節,而varchar,字母占一個字節,漢字占兩個,nvarchar處理漢字或其它unicode字符集的速度要比varchar字段快。
2、如果有一些特殊字符在nvarchar中沒有的,如日文的某些名片,那當然只能選合適的代碼頁用varchar了,而且這些特有語言特有的字符轉換到nvarchar會消失
表的管理--支持的數據類型
數字型
1、bit范圍 0到1
2、int范圍 負的2的31次方到正的 2的31次方-1
3、bigint范圍 負的2的63次方到正的 2的63次方-1
4、float存放小數,不推薦使用
5、numeric小數
強烈建議 如果要去存放小數最好使用numeric
日期類型
datetime(表示日期)
timestamp(時間戳)
一般情況下 用datetime表示日期
--sqlserver為我們提供一個專門的時間函數
getdate()
create table spname--建表
(bir datetime)--字段
insert into spnamevalues(getdate())--添加時間
圖片
image保存圖片,但是用的很少,一般用路徑保存圖片,在軟件公司往往使用圖片服務器和圖床技術
視頻
binary字段可以存放,但是我們往主,將視頻文件保存在文件服務器上,sql server中只保留文件路徑,存取效率高。
表的管理--怎樣創建表
建表(公司管理系統)
--職員表
sql server建議表的設計者,最好給表定義一個主鍵,用來標示唯一的一條記錄。
1、主鍵(primary key),不能夠重復出現;
2、主鍵必需給值,換言之主鍵不能為null
3、主鍵可以修改,但不能修改為同名的,同時要明確字段不有重復,否則報錯。
表的管理--查詢
查詢表是對表操作的最重要的操作,這個后面詳細講解
表的管理--添加數據
所有字段都插入
insert into emp values(7521,'ward','salesman',7698,'1981-2-22',1250.00,500.00,30)
插入部分字段(語法)
insertinto 表名 (字段名1,字段名2,...) values (對應字段數據1,對應字段數據2,...)
表的管理--修改數據
改一個字段(語法)
update 表名 set字段名='新值' where 字段='值'
例:update student set sex='女' where xh='A001'
update clerk set age=38 where cleName='賈政'
修改多個字段(語法)
update 表名 set字段名1='新值',字段名2='新值'... where 字段='值'
例:update student set sex='男',birthday='1980-04-01' where xh='A001'
update clerk set cleName='薛蟠',age=40 where cleId=2
修改含有null值的數據(語法)
update 表名 set字段名='新值' where 字段 isnull
例:update clerkset cleName='薛寶釵' where age is null
表的管理--刪除數據
刪除全部數據
deletefrom 表名
刪除指定數據
deletefrom 表名 where字段名='值'
刪除多個指定數據(and是條件滿足,or是前提條件不滿足時使用)
deletefrom 表名 where字段名1='值' and 字段名2='值' and或or ...
表的基本查詢--介紹(重點)
select語句在軟件編程中非常的有用,要好好掌握。
介紹主鍵和外鍵
主鍵,一張表中只能有一個主鍵
1、主鍵(primary key),不能夠重復出現;
2、主鍵必需給值,換言之主鍵不能為null
3、主鍵可以修改,但不能修改為同名的,同時要明確字段不有重復,否則報錯。
外鍵
1、外鍵只能指向主鍵
2、外鍵和主鍵的數據類型要一致
數據庫例解主鍵、外鍵、多功能查詢,見下例:
--建庫
create database test
--創建dept表
create table dept--部門表
(deptno int primary key,--部門編號
dname nvarchar(30),--部門名稱
loc nvarchar(30)--所在地
)
--建表emp
create table emp--表名
(empno int primarykey,--編號
ename nvarchar(30),--名字
job nvarchar(30),--職位
mgr int,--上級編號
hiredate datetime,--入職日期
sal numeric(10,2),--薪水
comm numeric(10,2),--獎金
deptno int foreign key references dept(deptno)--部門編號(做成外鍵)
)
--針對外鍵,請注意:
--1、外鍵只能指向主鍵
--2、外鍵和主鍵的數據類型要一致
--向dept表中添加數據
insert into deptvalues (10,'accounting','new york')
insert into deptvalues (20,'research','dallas')
insert into deptvalues (30,'sales','chicago')
insert into deptvalues (40,'operations','boston')
--向emp表中添加數據
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7369,'smith','clerk',7902,'1980-12-17',800.00,20)
insert into empvalues(7499,'allen','salesman',7698,'1981-2-20',1600.00,300.00,30)
insert into empvalues(7521,'ward','salesman',7698,'1981-2-22',1250.00,500.00,30)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7566,'jones','manager',7839,'1981-4-2',2975.00,20)
insert into empvalues(7654,'martin','salesman',7698,'1981-9-28',1250.00,1400.00,30)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7698,'blake','manager',7839,'1981-5-1',2850.00,30)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7782,'clark','manager',7839,'1981-6-9',2450.00,10)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7788,'scott','analyst',7566,'1987-4-19',3000.00,20)
insert into emp(empno,ename,job,hiredate,sal,deptno) values (7839,'king','president','1981-11-17',5000.00,10)
insert into empvalues (7844,'turner','salesman',7698,'1981-9-8',1500.00,0.00,30)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7876,'adams','clerk',7788,'1987-5-23',1100.00,20)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7900,'james','clerk',7698,'1981-12-3',950.00,30)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7902,'ford','analyst',7566,'1981-12-3',3000.00,20)
insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values (7934,'miller','clerk',7782,'1982-1-23',1300.00,10)
--查看dept表內容
select * from dept
--查看emp表內容
select * from emp
--查詢所有列
--語法:select * from表名 where 條件
select * from emp
--查詢指定列(sql sever不區分大小寫,oracle區分大小寫)
--語法:select字段1,字段2 from 表名 where 條件
--查詢smith的薪水,工作,所在部門
selectsal,job,deptno from emp where ename='smith'
--取消重復行(distinct只能消除完全一樣的行,保留一行)
--語法:select distinct字段 from 表名 where 條件
--統計共有多少個部門編號
select distinct deptno from emp
--使用算數表達式
--顯示每個雇員的年工資+獎金
select ename"姓名",sal*13+isnull(comm,0)*13"年收入" from emp
--使用where子句
--如何顯示工資高於3000的員工
select ename"員工姓名",sal"工資高於3000" from emp where sal>3000
--如何查找1982-1-1后入職的員工
select ename"員工姓名",hiredate"1982-1-1后入職日期" from emp where hiredate>'1982-1-1'
--如何顯示工資在2000到2500的員工情況
select * from empwhere sal>=2000 and sal<=2500
select * from empwhere sal between 2000 and 2500
--如何使用like操作符(模糊查詢)
--%:表示0到多個字符 _:表示單個字符
--如何顯示首字符為S的員工姓名和工資
select ename,salfrom emp where ename like 's%'
--如何顯示第三個字符為o的所有員工的姓名和工資
select ename,salfrom emp where ename like '__O%'
--在where條件中使用in
--如何顯示empno為123,345,800...的雇員情況
select * from empwhere empno in(123,345,800)
--使用is null的操作符
--如何顯示沒有上級的雇員的情況
select * from empwhere mgr is null
--使用邏輯操作符號
--查詢工資高於500或是崗位為manager的雇員,同時還要滿足他們的姓名首寫字母為大寫的J
select * from empwhere (sal>500 or job='manager') and ename like 'J%'
--使用order by字句(asc默認是升序排列,desc為降序排列)
--如何按照工資的從低到高的順序顯示雇員的信息
select sal from emporder by sal asc
--按照部門號升序而雇員的工資降序排列
--order by可以根據不同的字段排序
select deptno,salfrom emp order by deptno,sal desc
--使用列的別名排序(別名需要使用""號圈中)
select ename,sal*12"年薪"from emp order by "年薪"
表的復雜查詢
說明:
在實際應用中經常需要執行復雜的數據統計,經常需要顯示多張表的數據,現在我們給
大家介紹較為復雜的select語句
數據分組-max(最大),min(最小),avg(平均),sum(和),count(統計)
見下例:
--如何顯示所有員工中最高工資和最低工資
select min(sal)"最低工資",max(sal)"最高工資" from emp
--顯示最低工資並顯示出雇員名字
select ename"姓名",sal"工資" from emp where sal=(select min(sal) from emp)
--顯示所有員工的平均工資和工資總和
select avg(sal)"平均工資",sum(sal)"工資總和" from emp
--把高於平均工資的雇員的名字和他的工資顯示出來
select ename,salfrom emp where sal>(select avg(sal) from emp) order by sal
--計算共有多少員工
select count(*)"雇員數"from emp
--擴展要求
--請顯示工資最高的員工的名字、工作崗位
select ename,job from emp where sal=(select max(sal) from emp)
--請顯示工資高於平均工資的員工信息,並顯示平均工資(效率不高)
select ename"姓名",job"崗位",sal"工資",(select avg(sal)from emp)"平均工資" from emp where sal>(selectavg(sal) from emp) order by sal
表的復雜查詢
group by和having子句
group by用於對查詢的結果分組統計
having子句用於限制分組顯示結果
例:
--group by和having子句使用(having與group by結合使用,可以對分組后的查詢結果進行篩選)
--如何顯示每個部門的平均工資和最高工資
select deptno"部門號",avg(sal)"平均工資",max(sal)"最高工資",min(sal)"最低工資" from emp group by deptno
--如何顯示每個部門的平均工資和最高工資並顯示部門名稱(多表查詢)
select emp.deptno"部門號",avg(sal)"平均工資",max(sal)"最高工資",min(sal)"最低工資",dept.dname"部門名稱" from emp,dept where emp.deptno=dept.deptno group by emp.deptno,dept.dname
--顯示每個部門的每種崗位的平均工資和最低工資
select deptno"部門號",job"崗位",avg(sal)"平均工資",min(sal)"最低工資" from emp group by deptno,job order by deptno
--顯示平均工資低於2000的部門號和它的平均工資
select deptno"部門號",avg(sal)"平均工資" from emp group by deptno having avg(sal)<2000
--顯示平均工資大於2000的部門號和它的平均工資並按升序排列
select deptno"部門號",avg(sal)"平均工資" from emp group by deptno having avg(sal)>2000 order by"平均工資"
表的復雜查詢
對數據分組的總結
1、分組函數只能出現在選擇列表,having、order by子句中
2、如果在select語句中同時包含有group by,having,ovrderby那么他們的順序是group by,having,order by
3、在選擇列中如果有列、表達式、和分組函數,那么這些列和表達式必需有一個出現在group by子句中,否則就會出錯
如:selectdeptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000
這里deptno就一定要出現在group by中
表的復雜查詢--多表查詢
說明:
多表查詢是指基於兩個或兩個以上的表或是視圖的查詢,在實際應用中,查詢單個表可能不能滿足你的需求,(如顯示sales部門位置和其員工的姓名),這種情況下需要使用到(dept表和emp表)
--多表查詢
--如果多張表都有相同名字的字段,則需要帶表名(別名)
--顯示sales部門位置和其員工的姓名
select emp.ename"員工姓名",dept.dname"部門名稱",dept.loc"部門所在地" from emp,dept where dept.dname='sales' and emp.deptno=dept.deptno
--顯示雇員名,雇員工資及所在部門的名字
select emp.ename"雇員名",emp.sal"雇員工資",dept.dname"部門名稱" from emp,dept where emp.deptno=dept.deptno
--如何顯示部門號為10的部門名、員工名和工資
select emp.deptno"部門號",dept.dname"部門名稱",emp.ename"員工名稱",emp.sal"工資" from emp,dept where emp.deptno=dept.deptno and emp.deptno=10
--顯示雇員名、雇員工資及所在部門的名字並按部門排序
select e.ename"雇員名字",e.sal"工資",d.dname"部門名稱" from empe,dept d where e.deptno=d.deptno order by d.dname
表的復雜查詢--多表查詢
自連接
自連接是指在同一張表的連接查詢
例:
--自連接
--顯示某個員工的上級領導的姓名,比如顯示"ford"的上級
select (select enamefrom emp where ename='ford')"員工姓名",ename"上級領導" from emp where empno=(select mgr from emp where ename='ford')
--顯示公司每個員工姓名和他的上級的名字
--分析,把emp表看成兩張表分別是worker/boss
--外連接(左外連接、右外連接)
select worker.ename"員工名字",boss.ename"領導名字" from emp worker,emp boss where worker.mgr=boss.empno
表的復雜查詢--子查詢
什么是子查詢
子查詢是批嵌入在其它sql語句中的select語句,也叫嵌套查詢
單行子查詢
單行子查詢是指只返回一行數據的子查詢語句
--如何顯示與smith同一部門的所有員工?
select deptno"部門號",ename"員工名字" from emp where deptno=(select deptno from emp where ename='smith')
多行子查詢
多行子查詢指返回多行數據的子查詢
--如何查詢和部門10的工作相同的雇員的名字、崗位、工資、部門號
select * from emp where job in(select distinct job from emp where deptno=10)
在from子句中使用子查詢
--如何顯示高於部門平均工資的員工名字、薪水、部門的平均工資
--分析:1、首先要知道各個部門的平均工資
select avg(sal)"部門平均工資",deptno from emp group by deptno
--2、把上面的查詢結果當作一個臨時表對待
select e.ename"員工名字",e.sal"薪水",temp.myavg"部門平均工資",e.deptnofrom emp e,(select avg(sal) myavg,deptno from emp group by deptno) temp wheree.deptno=temp.deptno and e.sal>temp.myavg
在from子句中使用子查詢
這里需要說明的當在from子句中使用子查詢時,該子查詢會被作為一個臨時表來對待,當在from子句中使用子查詢時,必需給子查詢指定別名
分面查詢
按雇員的id號升序取出
--請顯示第5個到第10個入職的雇員信息(按照入職的時間先后順序查找)
--分析:1、顯示第1個到第4個入職的雇員
select top 4 * from emp order by hiredate
--top后的數表示要取出幾條記錄
select top 6 * from emp where empno not in(select top 4 empno from emp order by hiredate) order byhiredate
--請顯示第11個到13個入職的雇員信息
select top 3 * from emp where empno not in(select top 10 empno from emp order by hiredate) order byhiredate
--請顯示第5個到9個入職的雇員信息(按薪水高低排序)
select top 5 * from emp where empno not in(select top 4 empno from emp order by sal desc) order bysal desc
用查詢結果創建新表
這個命令是一種快捷的建表方法
select *(這里可以選擇字段) into另一個表名 from 表
--如何刪除掉一張表重復記錄
create table cat(
catId int,
catName varchar(40)
)
insert into catvalues(1,'aa')
select * from cat
--1、把cat表的記錄distinct后的結果,放到臨時表中
select distinct * into #temp from cat
--2、把cat表的記錄清空
delete from cat
--3、把臨時表中的數據信息加入到cat表中
insert into cat select * from #temp
--4、刪除臨時表
drop table#temp
--左外連接和右外連接
--思考題:顯示公司每個員工和他的上級領導的名字
--內連接的處理方式(內連接只顯示匹配的信息)
select worker.ename"員工名字",boss.ename"領導名字" from emp worker,emp boss where worker.mgr=boss.empno
--思考題:顯示公司每個員工和他的上級領導的名字,沒有上級領導的也要顯示出來
--左外連接:指如果左邊的表記錄全部顯示,如果沒有匹配的記錄,就用null填寫
select worker.ename"員工名字",boss.ename"領導名字" from emp worker left join emp boss on worker.mgr=boss.empno
--右外連接:指如果右邊的表記錄全部顯示,如果沒有匹配的記錄,就用null填寫
select worker.ename"員工名字",boss.ename"領導名字" from emp worker right join emp boss on worker.mgr=boss.empno
維護數據的完整性--約束
約束用於確保數據庫數據滿足特定的商業規則。在sql server和oracle中,約束包括:not null、unique,primary key,foreign key和check五種
維護數據的完整性--使用
not null(非空)
如果在列上定義了not null,那么當插入數據時,必需為列提供數據。
--約束機制--not null(非空)
--創建一張表
create table test1
(test1Id int primarykey identity(1,1),
testname varchar(30)not null,--not null不能為空
testpass varchar(30)not null,
testage int --不寫代表可以為空
)
create table test1
(test1Id int primarykey identity(1,1),--identity(1,1)自增長1條記錄
testnamevarchar(30),
testpassvarchar(30),
testage int --不寫代表可以為空
)
--刪除表
drop table test1
--向表插入數據
insert into test1(testage) values (3)
insert into test1 (testname,testpass,testage)values ('','',5)--''空與null空是不一樣的
--查詢表內容
select * from test1
unique(唯一)(一張表中可以有多個)
當定義了唯一約束后,該列值是不能重復的,但是可以為null,並只能有一個空值
--約束機制--unique(唯一)
--建表
create table test2
(test1Id int primarykey identity(1,1),--identity(1,1)自增長1條記錄
testname varchar(30)unique, --unique唯一的,數據不允許重復,但可以為空
testpassvarchar(30),
testage int --不寫代表可以為空
)
insert into test2(testname,testpass,testage) values ('aa','123',45)
insert into test2(testpass,testage) values ('123',45)
select * from test2
primarykey(主鍵)(一張表中只可以有一個主鍵)
用於唯一的標示表行的數據,當定義主鍵約束后,該列不但不能重復而且不能為null
需要說明的是:一張表最多只能有一個主鍵,但是可以有多個unqiue約束。
表可以有復合主鍵,有多個列構成一個主鍵
--復合主鍵
create table test3
(testId int,
testnamevarchar(30),
testpassvarchar(30),
testage int,
primary key(testId,testname)--復合主鍵,需單獨聲明
)
--行級定義和表級定義
create table test4
(testId int,--在字段中定義主鍵為行級定義.例:testId int primary key
testnamevarchar(30),
testpassvarchar(30),
testage int,
primarykey (testId,testname)--復合主鍵,需單獨聲明為表級定義
)
foreignkey(外鍵)(外鍵在從表上,要配合主表,但主表要有主鍵或unique約束)
用於定義主表和從表之間的關系。外鍵約束要定義在從表上,主表則必需具有主鍵約束或是unique約束,當定義外鍵約束后,要求外鍵列數據必需在主表的主鍵列存在或是null
check(強制條件)
用於強制行數據必需滿足的條件,假定在sal列上定義了check約束,並要求sal列值在1000-2000之間如果不再1000-2000之間就會提示出錯。
--check(強制條件)
create table test5
(testId int,
testnamevarchar(30),
testpass varchar(30),
sal intcheck(sal>=1000 and sal<=2000),--規定sal的值在1000-2000之間
)
insert into test5values (4,'aa','aa',1200)--可以加入sal值在范圍之內
insert into test5values (5,'bb','bb',2200)--不可加入sal值在范圍之外
select * from test5
default使用(默認值)
--default使用
create table mes
(mesId int primarykey identity(1,1),
mesccn varchar(2000)not null,
mesDate datetimedefault getdate()--在不指定值是default可以直接取默認值,也可以由用戶指定值
)
insert into mes(mesccn) values('abc')
insert into mes(mesccn,mesDate) values('cba','1976-1-6')
select * from mes
商店售貨系統表設計案例
現有一個商店的數據庫,記錄客戶及其購物情況,由下面三個表組成:
商品goods(商品號goodsId,商品名goodsName,單價unitprice,商品類別category,供應商provider);
客戶customer(客戶號customerId,姓名name,住址address,電郵email,性別sex,身份證cardId);
購買purchase(客戶號customerId,商品號goodsId,購買數量nums);
請使用sql語言完成下列功能:
1、建表,在定義中要求聲明:
1、每個表的主外鍵;
2、客戶的姓名不能為空值;
3、單價必需大於0,購買數量大於0;
4、電郵不能夠重復;
5、客戶的性別必需是男或者女,默認為男
6、商品類別是'食物','日用品'
--商店售貨系統表設計案例
create table goods--商品表
(goodsIdnvarchar(50) primary key,--商品Id為主鍵
goodsNamenvarchar(80) not null,--商品名不為空
unitpricenumeric(10,2) check (unitprice>0),--商品單價限制大於0
category nvarchar(3)check(category in('食物','日用品')),--商品類別需在指定的范圍內
provide nvarchar(50)--供應商
)
create tablecustomer--客戶表
(custcmerIdnvarchar(50) primary key,--客戶Id為主鍵
cusname nvarchar(50)not null,--客戶名不能為空
address nvarchar(100),--地址
email nvarchar(100)unique,--郵件不為重復
sex nchar(1)check(sex in('男','女')) default '男',--性別只能為男或女,默認為男
cardId nvarchar(18)--身份證
)
create tablepurchase--購買表
(custcmerIdnvarchar(50) foreign key references customer(custcmerId),--客戶Id為外鍵,並指向customer表的custcmerId主鍵
goodsId nvarchar(50)foreign key references goods(goodsId),--商品Id為外鍵,並指向goods表的goodsId主鍵
nums intcheck(nums>0)--購買數量限定大於0
)
表的管理--修改表
添加一個字段
ALTERTABLE distributors ADD COLUMN address varchar(30);
修改字段的類型/或是名字(不能有數據)
ALTERTABLE distributors
ALTER COLUMN address TYPE varchar(80),
ALTER COLUMN name TYPE varchar(100);
ALTERTABLE distributors RENAME COLUMN address TO city;
刪除一個字段
ALTERTABLE distributors DROP COLUMN address RESTRICT;
修改表的名字
ALTERTABLE distributors RENAME TO suppliers;
刪除表
drop table表名;
數據庫的備份和恢復
使用企業管理器完成備份和恢復
使用企業管理器有兩種方式完成備份和恢復
1、分離/附加
分離完后,請到sql server安裝的目錄下去找兩個文件數據庫名.mdf和數據庫名.ldf,這兩個文件就是分離后的文件,數據庫分離后,該數據庫就不能再使用了。
附加是指,當用戶需要重新使用某個分離的數據庫時進行的操作,就是讓sql server數據庫重新關聯該數據庫。
2、備份/恢復
備份數據庫是指,把某個數據庫文件從sql server中備份出來,這樣用戶可以根據需要再使用(用於恢復、復用..),備份數據庫不會影響到源數據庫的使用
恢復數據庫是指,當源數據庫因為某種原因(比如源數據庫毀壞、數據丟失、系統崩潰)需要恢復時進行的操作
使用查詢分析器完成備份和恢復
用企業管理器完成對數據庫的備份和恢復簡單直觀,同樣我們也可以在查詢分析器中完成類似的任務。
--使用查詢分析器對數據庫進行備份和恢復
--數據庫備份
--語法:backup database數據庫名 to disk='存儲路徑'
backup database LiangshanHero2 to disk='f:/liangshan.bak'
--數據庫恢復
--語法:restore database數據庫名 from disk='讀取路徑'
restore database LiangshanHero2 from disk='f:/liangshan.bak'
--新建數據庫
--語法:create datebase數據庫名
create database LiangshanHero2
--刪除數據庫
--語法:drop database數據庫名
drop database LiangshanHero2
*******************************************************************************