SQL資料庫學習,常用語句查詢大全
資料庫學習
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