《黑執(zhí)事》雙生子篇((SQL版)平行世界與幻想線)第1話 :SQL常用語句大全(超重要合集)

SQL性別限制只能寫男女,怎么寫?
create table 表名
(
sex char(2) check(sex='男' or sex='女')?not null
)
默認性別為男的代碼如下:
create table 學(xué)生表
(
學(xué)號 char(5) not null primary key,
姓名 varchar(10) not null,
性別 char(2) default '男' check (性別 in ('男','女'))? ? ?//其中default '男'? 就是默認性別為男。
)

擴展資料
使用其他方法限制性別只能寫男或女:
ALTER?TALBE?[表名]
ADD?CONSTRAINT?約束名?CHECK(列名?in?('男',?'女'))?not null
注意:CHECK 約束可以應(yīng)用于一個或者多個列,也可以將多個CHECK 約束應(yīng)用于一個列。
當(dāng)除去某個表時,對這個表的CHECK 約束也將同時被去除。
創(chuàng)建數(shù)據(jù)庫與創(chuàng)建數(shù)據(jù)表的方法
1.創(chuàng)建數(shù)據(jù)庫
create
?database
?stuDB??
--stuDB是數(shù)據(jù)庫的名稱
on
??primary
??--?默認就屬于primary文件組,可省略
(
/*
--數(shù)據(jù)文件的具體描述--*/
????
name
=
'stuDB_data'
,??
--?主數(shù)據(jù)文件的邏輯名稱
????
filename=
'D:\stuDB_data.mdf'
,?
--?主數(shù)據(jù)文件的物理路徑和名稱
????
size
=5mb,?
--主數(shù)據(jù)文件的初始大小
????
maxsize=100mb,?
--?主數(shù)據(jù)文件增長的最大值
????
filegrowth=15%
--主數(shù)據(jù)文件的增長率
)
log?
on
(
/*
--日志文件的具體描述,各參數(shù)含義同上--*/
????
name
=
'stuDB_log'
,
????
filename=
'D:\stuDB_log.ldf'
,
????
size
=2mb,
????
filegrowth=1mb
)
??
?
-----2.創(chuàng)建數(shù)據(jù)表
use?StuDB???
--使用某個數(shù)據(jù)庫(在某個數(shù)據(jù)庫下建表)
go?
if?exists(
select
?*?
from
?sysobjects?
where
?name
=
'stuMarks'
)
--查詢數(shù)據(jù)庫是否已存在此表
drop
?table
?stuMarks
--如果存在該表則刪除,不存在不執(zhí)行此句
create
?table
?stuMarks??
--stuMarks是表的名稱
(
????
ExamNo??????
int
?????identity(1,1)?
primary
?key
,
--列名????數(shù)據(jù)類型???約束
????
stuNo???????
char
(6)?
not
?null
,
--列名???數(shù)據(jù)類型???是否允許插入Null值
????
writtenExam?
int
?????not
?null
,
????
LabExam?????
int
?????not
?null
)
go
????
?
--?其中,列屬性"identity(起始值,遞增量)"?表示"ExamNo"列為自動編號,?也稱為標識列alter?table?表名
add
?constraint
?約束名?約束類型?具體的約束說明
alter
?table
?表名
drop
?constraint
?約束名
創(chuàng)建SQL數(shù)據(jù)庫學(xué)生個人信息表student
以下是方法與步驟:
(1)新建表:單擊數(shù)據(jù)庫“studentDb”前圖標,然后右鍵“表”文件包,單擊“新建表”選項,進入“新建表”窗口。
(2)設(shè)定表標識字段id:填寫第一個列名“id”,設(shè)定數(shù)據(jù)類型為“int”,同時在“列屬性”位置中“標識規(guī)范”中設(shè)定“是標識”的值為“是”。
(3)設(shè)定表其它字段:依次填寫字段學(xué)號stuNumber(varchar(50),不為空)、姓名stuName(varchar(50),可為空)、性別stuXb(varchar(50),可為空)、年齡stuAge(int,可為空)、出生日期stuBirth(datetime,可為空)。
(4)單擊表的右上角“??×?? ”圖標,進入“保存對以下各項的更改嗎”對話框。
(5)單擊“是”,進入“選擇名稱”對話框,填寫表名為“student”。特別強調(diào):表名不能采用常見的關(guān)鍵詞(如for、name、where、to等)命名。
(6)單擊“確定”,學(xué)生個人信息student表創(chuàng)建完成。
(7)單擊數(shù)據(jù)庫“studentDb”前面“×”圖標,然后單擊“表”前面的“”圖標,右鍵“student”表,單擊“打開表”選項,即可向表中填入數(shù)據(jù),如圖1.28所示。注意:id字段值自動填入,不能手填。
(8)單擊student表的右上角“× ”圖標,關(guān)閉表同時自動保存學(xué)生個人信息。
【友情提示】如何修改student表中字段名或數(shù)據(jù)類型?
實現(xiàn)過程:首先單擊數(shù)據(jù)庫“studentDb”前面的“× ”圖標,其次單擊“表”前面的“”圖標,然后右鍵“student”表,單擊“設(shè)計”,進入“表設(shè)計”窗口,便可以修改student表中字段名或數(shù)據(jù)類型。特別強調(diào):必須先刪除表中數(shù)據(jù),才能修改字段的數(shù)據(jù)類型。
舉幾個例子
1. 簡單查詢語句
1.1 查詢?nèi)?
SELECT * FROM 表名稱 ;
1.2 實際上簡單查詢語句語法格式就是:
SELECT * | 具體的列 別名FROM 表名稱 ;
(查詢所有)
1.3 如果現(xiàn)在假設(shè),只需要查詢出雇員的編號、姓名、工作的話,則就需要指定查詢的列:
SELECT empno,ename,job FROM emp ;
(返回列指定的名稱)
1.4 要求查詢出某一列,肯定要查詢的是某一個字段:
SELECT job FROM emp;
(查詢指定字段)
以上的查詢結(jié)果似乎有一些不妥。因為工作存在重復(fù)值,既然要查詢的是工作,所以肯定應(yīng)該將重復(fù)的內(nèi)容消除掉,所以在查詢的時候可以通過 DISTINCT 直接消除掉所有的重復(fù)列。
SELECT {DISTINCT} * | 具體的列 別名FROM 表名稱 ;
但是,在消除重復(fù)列的時候,有一點必須說明,如果要同時查詢多列,則必須保證所有列都重復(fù)才能消除掉。
例如:查詢雇員的編號及工作
SELECT DISTINCT empno,job FROM emp ;
(篩選掉重復(fù)的)
因為雇員編號不重復(fù),所以此時證明所有的列沒有重復(fù)的,所以不能消除掉。
1.5 要求查詢出雇員的編號,姓名,工作,但是顯示的格式:
編號是:7369 的雇員,姓名是:SMITH,工作是:CLERK
要想實現(xiàn)此種功能,則可以使用 Oracle 中提供的字符串連接操作,使用“||”表示。如果要加入一些顯示信息的話,所有的其他的固定信息要使用“'”括起來。
SELECT '編號是:'? ?|| empno ||? ?'的雇員,姓名是:'? ?|| ename ||?? ',工作是:'? ? || jobFROM emp ;
(按指定格式返回)
1.6 在查詢中也可以使用四則運算功能,例如:要求,求出每個雇員的姓名及年薪。
SELECT ename , sal * 12 FROM emp ;
(查詢返回年薪)
在程序中 sal*12 意義很不明確,所以最好為這個運算結(jié)果起一個別名,但是在起別名的時候一定要回避中文。
SELECT ename , sal * 12? income? FROM emp ;(
income為別名,之前可加as或不加
)
程序中可以支持+、-、*、/的語句,所有的語句要有優(yōu)先順序,先乘除后加減。
2. 限定查詢(WHERE子句)
2.1 如果希望可以根據(jù)指定的條件查詢的話,則必須指定限定查詢。限定查詢的語法:
SELECT {DISTINCT} * | 具體的列 別名FROM 表名稱{WHERE 條件(s)}
2.1.1 范例:查詢出工資大于 1500 的所有雇員信息
· 數(shù)學(xué)計算中,工資大于:sal>1500SELECT * FROM emp WHERE sal>1500 ;
(根據(jù)條件查詢)
2.1.2 范例:查詢每月可以得到獎金的雇員信息
·獎金是 comm 字段
·只要字段中存在內(nèi)容,則表示此內(nèi)容不為空(null),如果存在內(nèi)容,則會顯示具體的值。
·不為空的表示:字段 IS NOT NULLSELECT * FROM emp WHERE comm IS NOT NULL ;
查詢每月可以得到獎金的雇員
2.1.3 范例:查詢沒有獎金的雇員
沒有獎金則 comm 字段的內(nèi)容肯定是 null,格式:字段 IS NULLSELECT * FROM emp WHERE comm IS NULL ;
查詢沒有獎金的雇員
2.1.4 范例:要求查詢出,基本工資大于 1500,同時可以領(lǐng)取獎金的雇員信息。
· 此時應(yīng)該是兩個條件,而且兩個條件必須同時滿足;
· 既然要求兩個條件全部滿足,則必須使用 AND 操作符進行條件的連接。SELECT * FROM emp WHERE sal>1500 AND comm IS NOT NULL ;
基本工資大于 1500,同時可以領(lǐng)取獎金
同時指定了兩個條件,兩個條件必須同時滿足才可以查詢出結(jié)果。
2.1.5 范例:要求查詢出,基本工資大于 1500,或者可以領(lǐng)取獎金的雇員信息。
· 如果要表現(xiàn)出或者的概念使用 OR 進行連接,表示兩個條件有一個滿足即可。SELECT * FROM emp WHERE sal>1500 OR comm IS NOT NULL ;
基本工資大于 1500,或者可以領(lǐng)取獎金
之前使用 NOT 可以取反,把真的條件變?yōu)榧俚?,假的變?yōu)檎娴摹?/strong>
2.1.6 范例:要求查詢出,基本工資不大于 1500,同時不可以領(lǐng)取獎金的雇員信息。
· 此時相當(dāng)于是整體的條件取反。SELECT * FROM emp WHERE NOT (sal>1500 AND comm IS NOT NULL) ;
基本工資不大于 1500,同時不可以領(lǐng)取獎金
從程序中可以發(fā)現(xiàn),通過括號表示一組的條件。
2.1.7 范例:查詢基本工資大于 1500,但是小于 3000 的全部雇員信息
· 滿足兩個:sal > 1500 ,sal < 3000SELECT * FROM emp WHERE sal>1500 AND sal<3000 ;
在 SQL 語法中,提供了一個專門的指定范圍查詢的過濾語句:BETWEEN...AND....
語法格式:字段 BETWEEN 最小值 AND 最大值
2.1.8 范例:使用 BETWEEN...AND 修改之前的操作SELECT * FROM emp WHERE sal BETWEEN 1500 AND 3000;
實際上 BETWEEN ... AND 操作等價:sal>=1500 AND sal<=3000,包含了等于的功能。
2.1.9 范例:查詢出在 1981 年雇傭的全部雇員信息
· 1981年1月1日 ~ 1981年12月31日之間雇傭的雇員· 日期表示的時候要加“ ' ”SELECT * FROM empWHERE hiredate BETWEEN '1-1 月 -81' AND '31-12 月-81' ;
結(jié)論:BETWEEN ... AND 查詢除了可以支持數(shù)字之外,也可以支持日期的查詢· 隨著深入的學(xué)習(xí)會發(fā)現(xiàn),日期實際上也是以數(shù)字的形式表示出來。
2.1.10 范例:要求查詢出姓名是 smith 的雇員信息· 此時告訴了要查詢的名字,條件:ename='smith'
SELECT * FROM emp WHERE ename='smith' ;
執(zhí)行以上的查詢語句之后,并不會返回查詢結(jié)果,再次查詢數(shù)據(jù)庫表的信息,發(fā)現(xiàn) smith 是采用大寫的形式表示的,在 Oracle 中是對大小寫敏感的,所以此時在查詢的時候必須以大寫的形式進行條件的編寫。代碼修改如下:
SELECT * FROM emp WHERE ename='SMITH' ;
2.1.11 范例:要求查詢出雇員編號是 7369、7499、7521 的雇員的具體信息· 如果此時按照之前的做法,則設(shè)置條件要使用 OR 連接:
|- empno=7369 OR empno=7499 OR empno=7521
SELECT * FROM empWHERE empno=7369 OR empno=7499 OR empno=7521 ;
實際上,此時是指定了查詢的范圍,那么既然有范圍了在 SQL 語法中就可以使用 IN 操作符完成。
語法格式:字段 IN (值 1,值 2,.....,值 n)
如果現(xiàn)在要求查詢的內(nèi)容不在此范圍之中,則可以使用 NOT IN,語法如下:字段 NOT IN (值 1,值 2,.....,值 n)
范例:使用以上的格式進行修改SELECT * FROM empWHERE empno IN (7369,7499,7521) ;
2.1.12 范例:要求查詢出雇員編號不是 7369、7499、7521 的雇員的具體信息SELECT * FROM empWHERE empno NOT IN (7369,7499,7521) ;
另外,需要說明的是,使用 IN 操作符不光可以用在數(shù)字上,也可以用在字符串的信息上。
2.1.13 范例:要求查詢出姓名是 SMITH、ALLEN、KING 的雇員信息SELECT * FROM empWHERE ename IN ('SMITH','ALLEN','KING') ;
提示: 如果在指定的查詢范圍中指定了額外的內(nèi)容,則不影響程序運行。
SELECT * FROM emp? WHERE ename IN ('SMITH','ALLEN','KING','#$#$$##$') ;
模糊查詢
在一般的日常見到的站點中經(jīng)常發(fā)現(xiàn)有模糊查找功能,即:輸入一個指定的關(guān)鍵字,把符合的內(nèi)容全部查詢出來,在 SQL 中使用 LIKE 語句完成。
在使用 LIKE 語句的時候要注意通配符的問題,在 LIKE 語句中主要使用以下兩種通配符:
· “%”:可以匹配任意長度的內(nèi)容
· “_”:可以匹配一個長度的內(nèi)容
2.1.14 范例:查詢出所有雇員姓名中第二個字母包含“M”的雇員信息
SELECT * FROM empWHERE ename LIKE '_M%' ;
2.1.15 范例:查詢出雇員姓名中包含字母 M 的雇員信息· 此時,表示可以在任意的位置上出現(xiàn)字母 M
SELECT * FROM empWHERE ename LIKE '%M%' ;
但是,要提醒大家的是:“如果在使用 LIKE 的時候沒有指定查詢的關(guān)鍵字,則表示查詢?nèi)?
SELECT * FROM empWHERE ename LIKE '%%' ;
使用 LIKE 還可以方便的進行日期的查找功能。
2.1.16 范例:要求查詢出在 1981 年雇傭的雇員信息
SELECT * FROM empWHERE hiredate LIKE '%81%' ;
2.1.17 范例:查詢工資中包含 6 的雇員信息
SELECT * FROM empWHERE sal LIKE '%5%' ;
在操作條件中還可以使用:>、>=、=、<、<=等計算符號不等于符號:在 SQL 中如果要想使用不等于符號,可以有兩種形式:“<>”、“!=”
范例:查詢雇員編號不是 7369 的雇員信息
· 使用“<>”完成,比如:
SELECT * FROM emp WHERE empno<>7369
· 使用“!=”完成,比如:
SELECT * FROM emp WHERE empno!=7369 ;
(″!=″表示″不等于)? ″
?
你知道如何對結(jié)果進行排序(ORDER BY子句)嗎??
?
在 SQL 中可以使用 ORDER BY 子句對查詢的結(jié)果進行排序,例如,現(xiàn)在使用查詢?nèi)康恼Z句:SELECT * FROM emp ;
以上就是返回所有數(shù)據(jù)。
此時,從查詢結(jié)果可以發(fā)現(xiàn),是按照雇員的編號進行排序的,那么此時如果要對使用指定的列進行排序,則就必須使用 ORDER BY 語句,語法格式如下:
SELECT {DISTINCT} * | 具體的列 別名 FROM 表名稱 {WHERE 條件(s)} {ORDER BY 排序的字段 1,排序的字段 2 ASC|DESC} ASC 表示升序、DESC 表示降序
范例:要求按照工資由低到高排序
SELECT * FROM emp ORDER BY sal ;
以上就是排序后返回
之前是按照由低到高的順序完成,是采用的升序的形式,現(xiàn)在要求使用降序的形式完成。實際上如果在排序的時候沒有指定排序規(guī)則,則默認的排序規(guī)則是升序排列。
SELECT * FROM emp ORDER BY sal ASC ;
(默認是升序)
要想使用降序的方式完成,則使用 DESC 即可。
SELECT * FROM emp ORDER BY sal DESC ;
以上就是降序。
范例:要求查詢出 10 部門的所有雇員信息,查詢的信息按照工資由高到低排序,如果工資相等,則按照雇傭日期由早到晚排序。(此時存在兩個排序條件,第一個是降序,第二個升序)
SELECT * FROM emp WHERE deptno=10 ORDER BY sal DESC,hiredate ASC ;
以上就是兩個條件排序。″
塞巴斯接著說道:″我還能補充一些哦,以下是關(guān)于函數(shù)的知識:
單行函數(shù)
數(shù)據(jù)庫系統(tǒng)中,每個數(shù)據(jù)庫之間唯一不同的最大區(qū)別點就在與函數(shù)的支持上,使用函數(shù)可以完成一系列的操作功能。
單行函數(shù)語法:
function_name(column|expression,[arg1,arg2,...])
參數(shù)說明:
· function_name:函數(shù)名稱
· column:數(shù)據(jù)庫列名
· expression:字符串或計算表達式
· arg1,arg2:在函數(shù)中使用參數(shù)
單行函數(shù)分類:
· 字符函數(shù):接受字符輸入并且返回字符或數(shù)值
· 數(shù)值函數(shù):接受數(shù)值輸入并返回數(shù)值
· 日期函數(shù):對日期型數(shù)據(jù)進行操作
· 轉(zhuǎn)換函數(shù):從一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型
· 通用函數(shù):NVL 函數(shù)、DECODE 函數(shù)
字符函數(shù)
字符函數(shù)是專門處理字符的,例如,可以將大寫字符變?yōu)樾?,還能求出字符的長度。
范例:將小寫字母變?yōu)榇髮懽帜?/span>
SELECT UPPER('smith') FROM DUAL ;
范例:一般用戶在查詢一個人姓名的時候有可能考慮到這個人的姓名是大寫字母存的還是小寫字母保存的呢?
· 那么此時,為了方便用戶的使用就可以使用 upper 函數(shù)完成。
SELECT * FROM emp WHERE ename=UPPER('Smith') ;
還可以使用 lower()函數(shù)將一個字符串變?yōu)樾懽帜副硎尽?/span>
SELECT LOWER('HELLO WORLD') FROM dual ;
還可以使用 initcap()函數(shù)將單詞的第一個字母大寫
SELECT INITCAP('HELLO WORLD') FROM dual ;
范例;使用此函數(shù)將雇員表中的雇員姓名變?yōu)殚_頭字母大寫
SELECT INITCAP(ename) FROM emp ;
字符串除了可以使用“||”連接之外,還可以使用 CONCAT()函數(shù)進行連接操作。
SELECT CONCAT('hello ','world') FROM DUAL ;
此時已經(jīng)完成了連接,但是此種方式肯定不如“||”好使。
在字符函數(shù)中可以進行字符串的截取、求出字符串的長度、進行指定內(nèi)容的替換
· 字符串截取:substr()
· 字符串長度:length()
· 內(nèi)容替換:replace()
SELECT substr('hello',1,3) 截取字符串 , length('hello') 字符串長度 , replace('hello','l','x') 字符串替換 FROM DUAL ;
· Oracle 中 substr()函數(shù)的截取點是從 0 還是從 1 開始。
從 0 或從 1 開始效果是一樣的,因為 Oracle 比較智能。
范例:要求顯示所有雇員的姓名及姓名的后三個字符
(因為雇員姓名的字符串長度不一樣,所以只能求出整個的長度再減去 2,這樣進行截取操作。)
SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp ;
(此時,功能已經(jīng)實現(xiàn)了,但是操作比較麻煩。實際上在 substr()函數(shù)中提供了一種非常方便的機制,可以采用倒著截取的方式,只要輸入的位置是負數(shù)就表示倒著進行。)
SELECT ename,SUBSTR(ename,-3,3) FROM emp ;
數(shù)值函數(shù)
數(shù)值函數(shù)只要是包含以下幾種:
· 四舍五入:ROUND()
· 截斷小數(shù)位:TRUNC()
· 取余(取模):MOD
范例:執(zhí)行四舍五入操作
SELECT ROUND(789.536) FROM dual ;
當(dāng)然,在 ROUND()函數(shù)中也可以指定四舍五入的位數(shù)
范例:保留兩位小數(shù)
SELECT ROUND(789.536,2) FROM dual ;
在使用 ROUND()函數(shù)中還有一點非常有意思,可以直接對整數(shù)進行四舍五入的進位。
SELECT ROUND(789.536,-2) FROM dual ;
TRUNC()與 ROUND()不同的是,在 TRUNC()操作中,不會保留任何的小數(shù),而且小數(shù)點也不會執(zhí)行四舍五入的操作。
范例:驗證 TRUNC()函數(shù)
SELECT TRUNC(789.536) FROM DUAL ;
范例:通過 TRUNC()也可以指定小數(shù)點的保留位數(shù)
SELECT TRUNC(789.536,2) FROM DUAL ;
范例:使用負數(shù)表示位數(shù)
SELECT TRUNC(789.536,-2) FROM DUAL ;
back
范例:使用 MOD()函數(shù)可以進行取余的操作
SELECT MOD(10,3) FROM DUAL ;