1. 程式人生 > >SQL資料庫學習,常用語句查詢大全

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