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

--向表插入數據

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

 

*******************************************************************************

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM