A. sql語句語法大全
我整理的一些比較常用的SQL語句語法 需要的朋友可以過來參考下
一 數據控制語句 (DML) 部分
INSERT (往數據表裡插入記錄的語句)
INSERT INTO 表名(欄位名 欄位名 ……) VALUES ( 值 值 ……);
INSERT INTO 表名(欄位名 欄位名 ……) SELECT 欄位名 欄位名 …… FROM 另外的表名;
字元串類型的欄位值必須用單引號括起來 例如: GOOD DAY
如果欄位值里包含單引號 需要進行字元串轉換 我們把它替換成兩個單引號
字元串類型的欄位值超過定義的長度會出錯 最好在插入前進行長度校驗
日期欄位的欄位值可以用當前資料庫的系統時間SYSDATE 精確到秒
或者用字元串轉換成日期型函數TO_DATE(『 YYYY MM DD )
TO_DATE()還有很多種日期格式 可以參看ORACLE DOC
年 月 日 小時:分鍾:秒 的格式YYYY MM DD HH :MI:SS
INSERT時最大可操作的字元串長度小於等於 個單位元組 如果要插入更長的字元串 請考慮欄位用CLOB類型
方法借用ORACLE里自帶的DBMS_LOB程序包
INSERT時如果要用到從 開始自動增長的序列號 應該先建立一個序列號
CREATE SEQUENCE 序列號的名稱 (最好是表名+序列號標記) INCREMENT BY START WITH
MAXVALUE CYCLE NOCACHE;
其中最大的值按欄位的長度來定 如果定義的自動增長的序列號 NUMBER( ) 最大值為
INSERT 語句插入這個欄位值為: 序列號的名稱 NEXTVAL
DELETE (刪除數據表裡記錄的語句)
DELETE FROM表名 WHERE 條件;
注意 刪除記錄並不能釋放ORACLE里被佔用的數據塊表空間 它只把那些被刪除的數據塊標成unused
如果確實要刪除一個大表裡的全部記錄 可以用 TRUNCATE 命令 它可以釋放佔用的數據塊表空間
TRUNCATE TABLE 表名;
此操作不可回退
UPDATE (修改數據表裡記錄的語句)
UPDATE表名 SET 欄位名 =值 欄位名 =值 …… WHERE 條件;
如果修改的值N沒有賦值或定義時 將把原來的記錄內容清為NULL 最好在修改前進行非空校驗;
值N超過定義的長度會出錯 最好在插入前進行長度校驗
注意事項:
A 以上SQL語句對表都加上了行級鎖
確認完成後 必須加上事物處理結束的命令 MIT 才能正式生效
否則改變不一定寫入資料庫里
如果想撤回這些操作 可以用命令 ROLLBACK 復原
B 在運行INSERT DELETE 和 UPDATE 語句前最好估算一下可能操作的記錄范圍
應該把它限定在較小 (一萬條記錄) 范圍內 否則ORACLE處理這個事物用到很大的回退段
程序響應慢甚至失去響應 如果記錄數上十萬以上這些操作 可以把這些SQL語句分段分次完成
其間加上MIT 確認事物處理
二 數據定義 (DDL) 部分
CREATE (創建表 索引 視圖 同義詞 過程 函數 資料庫鏈接等)
ORACLE常用的欄位類型有
CHAR 固定長度的字元串
VARCHAR 可變長度的字元串
NUMBER(M N) 數字型M是位數總長度 N是小數的長度
DATE 日期類型
創建表時要把較小的不為空的欄位放在前面 可能為空的欄位放在後面
創建表時可以用中文的欄位名 但最好還是用英文的欄位名
創建表時可以給欄位加上默認值 例如 DEFAULT SYSDATE
這樣每次插入和修改時 不用程序操作這個欄位都能得到動作的時間
創建表時可以給欄位加上約束條件
例如 不允許重復 UNIQUE 關鍵字 PRIMARY KEY
ALTER (改變表 索引 視圖等)
改變表的名稱
ALTER TABLE 表名 TO 表名 ;
在表的後面增加一個欄位
ALTER TABLE表名 ADD 欄位名 欄位名描述;
修改表裡欄位的定義描述
ALTER TABLE表名 MODIFY欄位名 欄位名描述;
給表裡的欄位加上約束條件
ALTER TABLE 表名 ADD CONSTRAINT 約束名 PRIMARY KEY (欄位名);
ALTER TABLE 表名 ADD CONSTRAINT 約束名 UNIQUE (欄位名);
把表放在或取出資料庫的內存區
ALTER TABLE 表名 CACHE;
ALTER TABLE 表名 NOCACHE;
DROP (刪除表 索引 視圖 同義詞 過程 函數 資料庫鏈接等)
刪除表和它所有的約束條件
DROP TABLE 表名 CASCADE CONSTRAINTS;
TRUNCATE (清空表裡的所有記錄 保留表的結構)
TRUNCATE 表名;
三 查詢語句 (SELECT) 部分
SELECT欄位名 欄位名 …… FROM 表名 [表名 ……] WHERE 條件;
欄位名可以帶入函數
例如: COUNT(*) MIN(欄位名) MAX(欄位名) AVG(欄位名) DISTINCT(欄位名)
TO_CHAR(DATE欄位名 YYYY MM DD HH :MI:SS )
NVL(EXPR EXPR )函數
解釋:
IF EXPR =NULL
RETURN EXPR
ELSE
RETURN EXPR
DECODE(AA﹐V ﹐R ﹐V ﹐R )函數
解釋:
IF AA=V THEN RETURN R
IF AA=V THEN RETURN R
…
ELSE
RETURN NULL
LPAD(char n char )函數
解釋:
字元char 按制定的位數n顯示 不足的位數用char 字元串替換左邊的空位
欄位名之間可以進行算術運算
例如: (欄位名 *欄位名 )/
查詢語句可以嵌套
例如: SELECT …… FROM
(SELECT …… FROM表名 [表名 ……] WHERE 條件) WHERE 條件 ;
兩個查詢語句的結果可以做集合操作
例如: 並集UNION(去掉重復記錄) 並集UNION ALL(不去掉重復記錄) 差集MINUS 交集INTERSECT
分組查詢
SELECT欄位名 欄位名 …… FROM 表名 [表名 ……] GROUP BY欄位名
[HAVING 條件] ;
兩個以上表之間的連接查詢
SELECT欄位名 欄位名 …… FROM 表名 [表名 ……] WHERE
表名 欄位名 = 表名 欄位名 [ AND ……] ;
SELECT欄位名 欄位名 …… FROM 表名 [表名 ……] WHERE
表名 欄位名 = 表名 欄位名(+) [ AND ……] ;
有(+)號的欄位位置自動補空值
查詢結果集的排序操作 默認的排序是升序ASC 降序是DESC
SELECT欄位名 欄位名 …… FROM 表名 [表名 ……]
ORDER BY欄位名 欄位名 DESC;
字元串模糊比較的方法
INSTR(欄位名 『字元串 )>
欄位名 LIKE 『字元串% [『%字元串% ]
每個表都有一個隱含的欄位ROWID 它標記著記錄的唯一性
四 ORACLE里常用的數據對象 (SCHEMA)
索引 (INDEX)
CREATE INDEX 索引名ON 表名 ( 欄位 [欄位 ……] );
ALTER INDEX 索引名 REBUILD;
一個表的索引最好不要超過三個 (特殊的大表除外) 最好用單欄位索引 結合SQL語句的分析執行情況
也可以建立多欄位的組合索引和基於函數的索引
ORACLE 字元串可以索引的最大長度為 單位元組
ORACLE 字元串可以索引的最大長度為 單位元組
ORACLE DOC上說字元串最大可以建索引的長度約是:數據塊的大小(db_block_size)* %
視圖 (VIEW)
CREATE VIEW 視圖名AS SELECT … FROM … ;
ALTER VIEW視圖名 PILE;
視圖僅是一個SQL查詢語句 它可以把表之間復雜的關系簡潔化
同義詞 (SYNONMY)
CREATE SYNONYM同義詞名FOR 表名;
CREATE SYNONYM同義詞名FOR 表名@資料庫鏈接名;
資料庫鏈接 (DATABASE LINK)
CREATE DATABASE LINK資料庫鏈接名CONNECT TO 用戶名 IDENTIFIED BY 密碼 USING 『資料庫連接字元串 ;
資料庫連接字元串可以用NET EASY CONFIG或者直接修改TNSNAMES ORA里定義
資料庫參數global_name=true時要求資料庫鏈接名稱跟遠端資料庫名稱一樣
資料庫全局名稱可以用以下命令查出
SELECT * FROM GLOBAL_NAME;
查詢遠端資料庫里的表
SELECT …… FROM 表名@資料庫鏈接名;
五 許可權管理 (DCL) 語句
GRANT 賦於許可權
常用的系統許可權集合有以下三個:
CONNECT(基本的連接) RESOURCE(程序開發) DBA(資料庫管理)
常用的數據對象許可權有以下五個:
ALL ON 數據對象名 SELECT ON 數據對象名 UPDATE ON 數據對象名
DELETE ON 數據對象名 INSERT ON 數據對象名 ALTER ON 數據對象名
GRANT CONNECT RESOURCE TO 用戶名;
GRANT SELECT ON 表名 TO 用戶名;
GRANT SELECT INSERT DELETE ON表名 TO 用戶名 用戶名 ;
REVOKE 回收許可權
REVOKE CONNECT RESOURCE FROM 用戶名;
REVOKE SELECT ON 表名 FROM 用戶名;
lishixin/Article/program/MySQL/201311/29570
B. sql查詢語句大全
SELECT * FROM TWS2F14CCC260D71 WHERE 地類='1999資源清查有林地'
C. SQL的一些查詢語句
--1、列出訂單明細表中訂單ID列表,要求去掉所有重復值。
SELECT DISTINCT 訂單ID FROM 訂單明細
--2、列出產品的最高庫存量、最低庫存量和平均庫存量
SELECT MAX(庫存量) 最高庫存量,MIN(庫存量) 最低庫存量,AVG(庫存量) 平均庫存量 FROM 產品
--3、統計訂單數量。
SELECT COUNT(*) 訂單數量 FROM 訂單
--4、按貨主地區統計訂單數量。
SELECT 貨主地區,COUNT(*) 訂單數量 FROM 訂單 GROUP BY 貨主地區
--5、列出所有訂閱大米的客戶名稱。
SELECT 公司名稱 AS 客戶名稱 FROM 客戶 JOIN 訂單 ON 客戶.客戶ID=訂單.客戶ID
JOIN 訂單明細 ON 訂單明細.訂單ID=訂單.訂單ID
JOIN 產品 ON 產品.產品ID=訂單明細.訂單ID
WHERE 產品名稱='大米'
--6、列出庫中的所有訂單的客戶ID,產品ID和發貨日期。
SELECT 客戶ID,產品ID,發貨日期 FROM 訂單 JOIN 訂單明細 ON 訂單明細.訂單ID=訂單.訂單ID
--7、按發貨日期的順序,列出所有的所有訂單的客戶ID,產品ID。
SELECT 客戶ID,產品ID FROM 訂單 JOIN 訂單明細 ON 訂單明細.訂單ID=訂單.訂單ID
ORDER BY 發貨日期
--8、顯示供應商表中姓「徐」的聯系人的地址,城市,電話,公司名稱以及郵編。(用三種方法實現)
SELECT 地址,城市,電話,公司名稱,郵政編碼 FROM 客戶 WHERE 聯系人姓名 LIKE '徐%'
SELECT 地址,城市,電話,公司名稱,郵政編碼 FROM 客戶 WHERE LEFT(聯系人姓名,1)='徐'
SELECT 地址,城市,電話,公司名稱,郵政編碼 FROM 客戶 WHERE CHARINDEX('徐',聯系人姓名)>0
--9、 查找產品表中含有「米」的相關記錄。
SELECT * FROM 產品 WHERE 產品名稱 LIKE '%米%'
--10、在客戶表中查找電話號碼含有「010」的記錄。(至少用兩種方法實現)
SELECT * FROM 客戶 WHERE 電話 LIKE '%010%'
SELECT * FROM 客戶 WHERE CHARINDEX('010',電話)>0
--11、查找客戶「黃雅玲」所訂購的產品名稱,定購量,及該客戶的所在公司,職務,電話。
SELECT 產品名稱,數量,公司名稱,聯系人職務,電話 FROM 客戶 JOIN 訂單 ON 客戶.客戶ID=訂單.客戶ID
JOIN 訂單明細 ON 訂單明細.訂單ID=訂單.訂單ID
JOIN 產品 ON 產品.產品ID=訂單明細.訂單ID
WHERE 聯系人姓名='黃雅玲'
--12、統計客戶所訂購的訂單數,並顯示相應的客戶名,客戶ID,訂單數,並且根據訂單數進行升序排序。
SELECT 公司名稱 AS 客戶名,客戶ID,COUNT(*) 訂單數 FROM 客戶 JOIN 訂單 ON 客戶.客戶ID=訂單.客戶ID
ORDER BY 3
D. sql簡單查詢語句
1、首先打開資料庫,建立好表。
E. SQL的一些查詢語句
13、select 客戶名,客戶id,count(訂單id)
from 客戶,訂單
where 客戶.客戶id=訂單.客戶id
group by 客戶名,客戶id
having count(訂單id)>10
14、update 訂單數量
set 數量=數量+10
where 訂單id in(select 訂單id
from 訂單,客戶
where 訂單.客戶id=客戶。客戶id
and 公司名稱='東南實業')
15、select max(數量),min(數量)
from 訂單明細
16、select * into 客戶備份
from 客戶
where 地區='華北'
17、select *
from 訂單
where datediff(day,訂購日期,發貨日期)<=5
三、1、select avg(庫存量)
case when avg(庫存量)>30 then '不必進貨' else'需要進貨' end
from 產品
F. 求幾個簡單的SQL單表分組查詢語句
如果最高分不只一個呢.....
select * from Result where grade=1 and gender='男' and score = (select max(score) from result);
select * from Result where grade=1 and score=(select max(score) from Result);
select * from Result where gender='女'and score=(select max(score) from Result);
select * from Result where score in (select max(score) from Result group by grade);
註:
grade 年級
name 姓名
gender 性別
score 分數
誰用誰知道!
G. SQL常用增刪改查語句
SQL常用增刪改查語句大全
SQL常用的增刪改查語句有哪些?為方便同學們復習SQL語句,我為大家分享SQL增刪改查語句如下:
1增
1.1【插入單行】
insert [into] <表名> (列名) values (列值)
例:insert into Strdents (姓名,性別,出生日期) values ('開心朋朋','男','1980/6/15')
1.2【將現有表數據添加到一個已有表】
insert into <已有的新表> (列名) select <原表列名> from <原表名>
例:insert into tongxunlu ('姓名','地址','電子郵件')
select name,address,email
from Strdents
1.3【直接拿現有表數據創建一個新表並填充】
select <新建表列名> into <新建表名> from <源表名>
例:select name,address,email into tongxunlu from strdents
1.4【使用union關鍵字合並數據進行插入多行】
insert <表名> <列名> select <列值> tnion select <列值>
例:insert Students (姓名,性別,出生日期)
select '開心朋朋','男','1980/6/15' union(union表示下一行)
select '藍色小明','男','19**/**/**'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2刪
2.1【刪除<滿足條件的>行】
delete from <表名> [where <刪除條件>]
例:delete from a where name='開心朋朋'(刪除表a中列值為開心朋朋的行)
2.2【刪除整個表】
truncate table <表名>
truncate table tongxunlu
注意:刪除表的所有行,但表的結構、列、約束、索引等不會被刪除;不能用語有外建約束引用的表
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3改
update <表名> set <列名=更新值> [where <更新條件>]
例:update tongxunlu set 年齡=18 where 姓名='藍色小名'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4查
4.1``精確(條件)查詢
select <列名> from <表名> [where <查詢條件表達試>] [order by <排序的列名>[asc或desc]]
4.1.1【查詢所有數據行和列】
例:select * from a
說明:查詢a表中所有行和列
4.1.2【查詢部分行列--條件查詢】
例:select i,j,k from a where f=5
說明:查詢表a中f=5的所有行,並顯示i,j,k3列
4.1.3【在查詢中使用AS更改列名】
例:select name as 姓名 from a where xingbie='男'
說明:查詢a表中性別為男的所有行,顯示name列,並將name列改名為(姓名)顯示
4.1.4【查詢空行】
例:select name from a where email is null
說明:查詢表a中email為空的所有行,並顯示name列;SQL語句中用is null或者is not null來判斷是否為空行
4.1.5【在查詢中使用常量】
例:select name, '唐山' as 地址 from Student
說明:查詢表a,顯示name列,並添加地址列,其列值都為'唐山'
4.1.6【查詢返回限制行數(關鍵字:top percent)】
例1:select top 6 name from a
說明:查詢表a,顯示列name的前6行,top為關鍵字
例2:select top 60 percent name from a
說明:查詢表a,顯示列name的60%,percent為關鍵字
4.1.7【查詢排序(關鍵字:order by , asc , desc)】
例:select name
from a
where chengji>=60
order by desc
說明:查詢a表中chengji大於等於60的所有行,並按降序顯示name列;默認為ASC升序
4.2``模糊查詢
4.2.1【使用like進行模糊查詢】
注意:like運算副只用於字元串,所以僅與char和varchar數據類型聯合使用
例:select * from a where name like '趙%'
說明:查詢顯示表a中,name欄位第一個字為趙的記錄
4.2.2【使用between在某個范圍內進行查詢】
例:select * from a where nianling between 18 and 20
說明:查詢顯示表a中nianling在18到20之間的記錄
4.2.3【使用in在列舉值內進行查詢】
例:select name from a where address in ('北京','上海','唐山')
說明:查詢表a中address值為北京或者上海或者唐山的記錄,顯示name欄位
4.3``.分組查詢
4.3.1【使用group by進行分組查詢】
例:select studentID as 學員編號,AVG(score) as 平均成績 (注釋:這里的score是列名)
from score (注釋:這里的score是表名)
group by studentID
說明:在表score中查詢,按strdentID欄位分組,顯示strdentID欄位和score欄位的平均值;select語句中只允許被分組的'列和為每個分組返回的一個值的表達式,例如用一個列名作為參數的聚合函數
4.3.2【使用having子句進行分組篩選】
例:select studentID as 學員編號,AVG(score) as 平均成績 (注釋:這里的score是列名)
from score (注釋:這里的score是表名)
group by studentID
having count(score)>1
說明:接上面例子,顯示分組後count(score)>1的行,由於where只能在沒有分組時使用,分組後只能使用having來限制條件。
4.4``.多表聯接查詢
4.4.1內聯接
4.4.1.1【在where子句中指定聯接條件】
例:select a.name,b.chengji
from a,b
where a.name=b.name
說明:查詢表a和表b中name欄位相等的記錄,並顯示表a中的name欄位和表b中的chengji欄位
4.4.1.2【在from子句中使用join…on】
例:select a.name,b.chengji
from a inner join b
on (a.name=b.name)
說明:同上
4.4.2外聯接
4.4.2.1【左外聯接查詢】
例:select s.name,c.courseID,c.score
from strdents as s
left outer join score as c
on s.scode=c.strdentID
說明:在strdents表和score表中查詢滿足on條件的行,條件為score表的strdentID與strdents表中的sconde相同
4.4.2.2【右外聯接查詢】
例:select s.name,c.courseID,c.score
from strdents as s
right outer join score as c
on s.scode=c.strdentID
說明:在strdents表和score表中查詢滿足on條件的行,條件為strdents表中的sconde與score表的strdentID相同
;H. SQL查詢語句大全(一)
Select --從資料庫表中檢索數據行和列
Insert --向資料庫表添加新數據行
Delete --從資料庫表中刪除數據行
Update --更新資料庫表中的數據
Create TABLE --創建一個資料庫表
Drop TABLE --從資料庫中刪除表
Alter TABLE --修改資料庫表結構
Create VIEW --創建一個視圖
Drop VIEW --從資料庫中刪除視圖
Create INDEX --為資料庫表創建一個索引
Drop INDEX --從資料庫中刪除索引
Create PROCEDURE --創建一個存儲過程
Drop PROCEDURE --從資料庫中刪除存儲過程
Create TRIGGER --創建一個觸發器
Drop TRIGGER --從資料庫中刪除觸發器
Create SCHEMA --向資料庫添加一個新模式
Drop SCHEMA --從資料庫中刪除一個模式
Create DOMAIN --創建一個數據值域
Alter DOMAIN --改變域定義
Drop DOMAIN --從資料庫中刪除一個域
GRANT --授予用戶訪問許可權
DENY --拒絕用戶訪問
REVOKE --解除用戶訪問許可權
COMMIT --結束當前事務
ROLLBACK --中止當前事務
SET TRANSACTION --定義當前事務數據訪問特徵
DECLARE --為查詢設定游標
EXPLAN --為查詢描述數據訪問計劃
OPEN --檢索查詢結果打開一個游標
FETCH --檢索一行查詢結果
CLOSE --關閉游標
PREPARE --為動態執行准備 SQL 語句
EXECUTE --動態地執行 SQL 語句
DESCRIBE --描述准備好的查詢
declare @id char(10)
--set @id = '10010001'
select @id = '10010001'
---必須以@@開頭
declare @x int @y int @z int
select @x = 1 @y = 2 @z=3
if @x > @y
print 'x > y' --列印字元串'x > y'
else if @y > @z
print 'y > z'
else print 'z > y'
use pangu
update employee
set e_wage =
case
when job_level = 』1』 then e_wage*1.08
when job_level = 』2』 then e_wage*1.07
when job_level = 』3』 then e_wage*1.06
else e_wage*1.05
end
declare @x int @y int @c int
select @x = 1 @y=1
while @x < 3
begin
print @x --列印變數 x 的值
while @y < 3
begin
select @c =100*@x+ @y
print @c --列印變數 c 的值
select @y = @y + 1
end
select @x = @x + 1
select @y = 1
end
--例 等待 1 小時 2 分零 3 秒後才執行 Select 語句
waitfor delay 』01:02:03』
select * from employee
--例 等到晚上 11 點零 8 分後才執行 Select 語句
waitfor time 』23:08:00』
select * from employee
select *(列名) from table_name(表名) where column_name operator value
ex:(宿主)
select * from stock_information where stockid = str(nid)
stockname = 'str_name'
stockname like '% find this %'
stockname like '[a-zA-Z]%' --------- ([]指定值的范圍)
stockname like '[^F-M]%' --------- (^排除指定范圍)
--------- 只能在使用 like 關鍵字的 where 子句中使用通配符)
or stockpath = 'stock_path'
or stocknumber < 1000
and stockindex = 24
not stocksex = 'man'
stocknumber between 20 and 100
stocknumber in(10,20,30)
order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
order by 1,2 --------- by 列號 stockname = (select stockname from stock_information where stockid = 4)
--------- 子查詢
--------- 除非能確保內層 select 只返回一個行的值,
--------- 否則應在外層 where 子句中用一個 in 限定符
select distinct column_name form table_name --------- distinct 指定檢索獨有的列值,不重復
select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name
select stockname , "stocknumber" = count(*) from table_name group by stockname
--------- group by 將表按行分組,指定列中有相同的值
having count(*) = 2 --------- having 選定指定的組
select *
from table1, table2
where table1.id *= table2.id -------- 左外部連接,table1 中有的而 table2 中沒有得以 null 表示
table1.id =* table2.id -------- 右外部連接
select stockname from table1
union [all] ----- union 合並查詢結果集,all-保留重復行
select stockname from table2
insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx")
value (select Stockname , Stocknumber from Stock_table2)---value 為 select 語句
update table_name set Stockname = "xxx" [where Stockid = 3]
Stockname = default
Stockname = null
Stocknumber = Stockname + 4
delete from table_name where Stockid = 3
truncate table_name ----------- 刪除表中所有行,仍保持表的完整性
drop table table_name --------------- 完全刪除表
alter table database.owner.table_name add column_name char(2) null .....
sp_help table_name ---- 顯示表已有特徵
create table table_name (name char(20), age smallint, lname varchar(30))
insert into table_name select ......... ----- 實現刪除列的方法(創建新表)
alter table table_name drop constraint Stockname_default ---- 刪除 Stockname 的 default 約束
I. 資料庫常用sql語句有哪些
資料庫常用sql語句
Student(S#,Sname,Sage,Ssex) 學生表
Course(C#,Cname,T#) 課程表
SC(S#,C#,score) 成績表
Teacher(T#,Tname) 教師表
問題:
1、查詢「001」課程比「002」課程成績高的所有學生的學號;
select a.S# from (select s#,score from SC where C#='001') a,(select s#,score
from SC where C#='002') b
where a.score>b.score and a.s#=b.s#;
2、查詢平均成績大於60分的同學的學號和平均成績;
select S#,avg(score)
from sc
group by S# having avg(score) >60;
3、查詢所有同學的學號、姓名、選課數、總成績;
select Student.S#,Student.Sname,count(SC.C#),sum(score)
from Student left Outer join SC on Student.S#=SC.S#
group by Student.S#,Sname
4、查詢姓「李」的老師的個數;
select count(distinct(Tname))
from Teacher
where Tname like '李%';
5、查詢沒學過「葉平」老師課的同學的學號、姓名;
select Student.S#,Student.Sname
from Student
where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='葉平');
6、查詢學過「001」並且也學過編號「002」課程的同學的學號、姓名;
select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');
7、查詢學過「葉平」老師所教的所有課的同學的學號、姓名;
select S#,Sname
from Student
where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='葉平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname='葉平'));
8、查詢課程編號「002」的成績比課程編號「001」課程低的所有同學的學號、姓名;
Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2
from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2<score;
9、查詢所有課程成績小於60分的同學的學號、姓名;
select S#,Sname
from Student
where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);
10、查詢沒有學全所有課的同學的學號、姓名;
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);
11、查詢至少有一門課與學號為「1001」的同學所學相同的同學的學號和姓名;
select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001';
12、查詢至少學過學號為「001」同學所有一門課的其他同學學號和姓名;
select distinct SC.S#,Sname
from Student,SC
where Student.S#=SC.S# and C# in (select C# from SC where S#='001');
13、把「SC」表中「葉平」老師教的課的成績都更改為此課程的平均成績;
SC set score=(select avg(SC_2.score)
from SC SC_2
where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='葉平');
14、查詢和「1002」號的同學學習的課程完全相同的其他同學學號和姓名;
select S# from SC where C# in (select C# from SC where S#='1002')
group by S# having count(*)=(select count(*) from SC where S#='1002');
15、刪除學習「葉平」老師課的SC表記錄;
Delect SC
from course ,Teacher
where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='葉平';
16、向SC表中插入一些記錄,這些記錄要求符合以下條件:沒有上過編號「003」課程的同學學號、2、
號課的平均成績;
Insert SC select S#,'002',(Select avg(score)
from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');
17、按平均成績從高到低顯示所有學生的「資料庫」、「企業管理」、「英語」三門的課程成績,按如下形式顯示: 學生ID,,資料庫,企業管理,英語,有效課程數,有效平均分
SELECT S# as 學生ID
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 資料庫
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企業管理
,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英語
,COUNT(*) AS 有效課程數, AVG(t.score) AS 平均成績
FROM SC AS t
GROUP BY S#
ORDER BY avg(t.score)
18、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分
SELECT L.C# As 課程ID,L.score AS 最高分,R.score AS 最低分
FROM SC L ,SC AS R
WHERE L.C# = R.C# and
L.score = (SELECT MAX(IL.score)
FROM SC AS IL,Student AS IM
WHERE L.C# = IL.C# and IM.S#=IL.S#
GROUP BY IL.C#)
AND
R.Score = (SELECT MIN(IR.score)
FROM SC AS IR
WHERE R.C# = IR.C#
GROUP BY IR.C#
);
19、按各科平均成績從低到高和及格率的百分數從高到低順序
SELECT t.C# AS 課程號,max(course.Cname)AS 課程名,isnull(AVG(score),0) AS 平均成績
,100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分數
FROM SC T,Course
where t.C#=course.C#
GROUP BY t.C#
ORDER BY 100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC
20、查詢如下課程平均成績和及格率的百分數(用"1行"顯示): 企業管理(001),馬克思(002),OO&UML (003),資料庫(004)
SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企業管理平均分
,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企業管理及格百分數
,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 馬克思平均分
,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 馬克思及格百分數
,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分
,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分數
,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 資料庫平均分
,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 資料庫及格百分數
FROM SC
21、查詢不同老師所教不同課程平均分從高到低顯示
SELECT max(Z.T#) AS 教師ID,MAX(Z.Tname) AS 教師姓名,C.C# AS 課程ID,MAX(C.Cname) AS 課程名稱,AVG(Score) AS 平均成績
FROM SC AS T,Course AS C ,Teacher AS Z
where T.C#=C.C# and C.T#=Z.T#
GROUP BY C.C#
ORDER BY AVG(Score) DESC
22、查詢如下課程成績第 3 名到第 6 名的學生成績單:企業管理(001),馬克思(002),UML (003),資料庫(004)
[學生ID],[學生姓名],企業管理,馬克思,UML,資料庫,平均成績
SELECT DISTINCT top 3
SC.S# As 學生學號,
Student.Sname AS 學生姓名 ,
T1.score AS 企業管理,
T2.score AS 馬克思,
T3.score AS UML,
T4.score AS 資料庫,
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 總分
FROM Student,SC LEFT JOIN SC AS T1
ON SC.S# = T1.S# AND T1.C# = '001'
LEFT JOIN SC AS T2
ON SC.S# = T2.S# AND T2.C# = '002'
LEFT JOIN SC AS T3
ON SC.S# = T3.S# AND T3.C# = '003'
LEFT JOIN SC AS T4
ON SC.S# = T4.S# AND T4.C# = '004'
WHERE student.S#=SC.S# and
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
NOT IN
(SELECT
DISTINCT
TOP 15 WITH TIES
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
FROM sc
LEFT JOIN sc AS T1
ON sc.S# = T1.S# AND T1.C# = 'k1'
LEFT JOIN sc AS T2
ON sc.S# = T2.S# AND T2.C# = 'k2'
LEFT JOIN sc AS T3
ON sc.S# = T3.S# AND T3.C# = 'k3'
LEFT JOIN sc AS T4
ON sc.S# = T4.S# AND T4.C# = 'k4'
ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);
23、統計列印各科成績,各分數段人數:課程ID,課程名稱,[100-85],[85-70],[70-60],[<60]
SELECT SC.C# as 課程ID, Cname as 課程名稱
,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85]
,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70]
,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60]
,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -]
FROM SC,Course
where SC.C#=Course.C#
GROUP BY SC.C#,Cname;
24、查詢學生平均成績及其名次
SELECT 1+(SELECT COUNT( distinct 平均成績)
FROM (SELECT S#,AVG(score) AS 平均成績
FROM SC
GROUP BY S#
) AS T1
WHERE 平均成績 > T2.平均成績) as 名次,
S# as 學生學號,平均成績
FROM (SELECT S#,AVG(score) 平均成績
FROM SC
GROUP BY S#
) AS T2
ORDER BY 平均成績 desc;
25、查詢各科成績前三名的記錄:(不考慮成績並列情況)
SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數
FROM SC t1
WHERE score IN (SELECT TOP 3 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
26、查詢每門課程被選修的學生數
select c#,count(S#) from sc group by C#;
27、查詢出只選修了一門課程的全部學生的學號和姓名
select SC.S#,Student.Sname,count(C#) AS 選課數
from SC ,Student
where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;
28、查詢男生、女生人數
Select count(Ssex) as 男生人數 from Student group by Ssex having Ssex='男';
Select count(Ssex) as 女生人數 from Student group by Ssex having Ssex='女';
29、查詢姓「張」的學生名單
SELECT Sname FROM Student WHERE Sname like '張%';
30、查詢同名同性學生名單,並統計同名人數
select Sname,count(*) from Student group by Sname having count(*)>1;;
31、1981年出生的學生名單(註:Student表中Sage列的類型是datetime)
select Sname, CONVERT(char (11),DATEPART(year,Sage)) as age
from student
where CONVERT(11),DATEPART(year,Sage))='1981';
32、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列
Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;
33、查詢平均成績大於85的所有學生的學號、姓名和平均成績
select Sname,SC.S# ,avg(score)
from Student,SC
where Student.S#=SC.S# group by SC.S#,Sname having avg(score)>85;
34、查詢課程名稱為「資料庫」,且分數低於60的學生姓名和分數
Select Sname,isnull(score,0)
from Student,SC,Course
where SC.S#=Student.S# and SC.C#=Course.C# and Course.Cname='資料庫'and score<60;
35、查詢所有學生的選課情況;
SELECT SC.S#,SC.C#,Sname,Cname
FROM SC,Student,Course
where SC.S#=Student.S# and SC.C#=Course.C# ;
36、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;
SELECT distinct student.S#,student.Sname,SC.C#,SC.score
FROM student,Sc
WHERE SC.score>=70 AND SC.S#=student.S#;
37、查詢不及格的課程,並按課程號從大到小排列
select c# from sc where scor e<60 order by C# ;
38、查詢課程編號為003且課程成績在80分以上的學生的學號和姓名;
select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003';
39、求選了課程的學生人數
select count(*) from sc;
40、查詢選修「葉平」老師所授課程的學生中,成績最高的學生姓名及其成績
select Student.Sname,score
from Student,SC,Course C,Teacher
where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='葉平' and SC.score=(select max(score)from SC where C#=C.C# );
41、查詢各個課程及相應的選修人數
select count(*) from sc group by C#;
42、查詢不同課程成績相同的學生的學號、課程號、學生成績
select distinct A.S#,B.score from SC A ,SC B where A.Score=B.Score and A.C# <>B.C# ;
43、查詢每門功成績最好的前兩名
SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數
FROM SC t1
WHERE score IN (SELECT TOP 2 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
44、統計每門課程的學生選修人數(超過10人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,查詢結果按人數降序排列,若人數相同,按課程號升序排列
select C# as 課程號,count(*) as 人數
from sc
group by C#
order by count(*) desc,c#
45、檢索至少選修兩門課程的學生學號
select S#
from sc
group by s#
having count(*) > = 2
46、查詢全部學生都選修的課程的'課程號和課程名
select C#,Cname
from Course
where C# in (select c# from sc group by c#)
47、查詢沒學過「葉平」老師講授的任一門課程的學生姓名
select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='葉平');
48、查詢兩門以上不及格課程的同學的學號及其平均成績
select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score<60 group="" by="" having="">2)group by S#;
49、檢索「004」課程分數小於60,按分數降序排列的同學學號
select S# from SC where C#='004'and score<60 order by score desc;
50、刪除「002」同學的「001」課程的成績
from Sc where S#='001'and C#='001';
一、SQL語言簡介
1、SQL語言簡介
SQL是結構化查詢語言(Structured Query Language),是用於訪問和處理資料庫的標準的計算機語言。
SQL語言的功能如下:
A、SQL面向資料庫執行查詢
B、SQL可從資料庫取回數據
C、SQL可在資料庫中插入新的記錄
D、SQL可更新資料庫中的數據
E、SQL可從資料庫刪除記錄
F、SQL可創建新資料庫
G、SQL可在資料庫中創建新表
H、SQL可在資料庫中創建存儲過程
I、SQL可在資料庫中創建視圖
J、SQL可以設置表、存儲過程和視圖的許可權
SQL是一門ANSI的標准計算機語言,用來訪問和操作資料庫系統。SQL語句用於取回和更新資料庫中的數據。SQL可與資料庫程序協同工作,比如MS Access、DB2、Informix、MS SQL Server、Oracle、MySQL、Sybase以及其他資料庫系統。
每一種資料庫有自己版本的SQL語言,但是為了與ANSI標准相兼容,SQL必須以相似的方式共同地來支持一些主要的關鍵詞(比如 SELECT、UPDATE、DELETE、INSERT、WHERE等等)。
除了SQL標准之外,大部分SQL資料庫程序都擁有自己的私有擴展。
2、SQL語言分類
SQL語言分為數據定義語言、數據控制語言、數據操作語言、數據查詢語言,分別實現對資料庫數據操作。
二、SQL語言基礎
1、數據定義語言(DDL)
DDL:Data Definition Language
用於定義和管理數據對象,包括資料庫、數據表、函數、視圖、索引、觸發器等。例如:CREATE、DROP、ALTER等語句。
create table student
(
sid INT,
sname var20)
);
alter table student add age int default 20;
student;
drop database student;
2、數據控制語言(DCL)
DCL:Data Control Language
用來管理資料庫的語言,包含授權用戶訪問、拒絕用戶訪問、撤銷授予的許可權。例如:GRANT、DENY、REVOKE、COMMIT、ROLLBACK等語句。
創建用戶
create user 『wang』@『localhost』 identified by 『a1!』;
許可權設置
grant select on db.student to 『wang』@『localhost』;
撤銷許可權
revoke select on db.student from 『wang』@『localhost』;
3、數據操作語言(DML)
DML:Data Manipulation Language
用於操作資料庫對象中所包含的數據,增、刪、改。例如:INSERT、DELETE、UPDATE語句。
4、數據查詢語言(DQL)
DQL:Data Query Language
用於查詢資料庫對象中所包含的數據,能夠進行單表查詢、連接查詢、嵌套查詢,以及集合查詢等各種復雜程度不同的資料庫查詢,並將數據返回到客戶機中顯示。例如:SELECT語句。
三、常量和變數
1、常量
A、字元常量
字元串常量使用單引號或雙引號,數值常量不用加引號。
如果字元串常量中需要換行、有單引號、雙引號 % _
前面需要加轉義字元
換行
』 一個單引號
」 一個雙引號
一個 如果沒有轉義字元 就認為是一個轉義字元
% 一個% 如果沒有轉義字元就認為這是一個通配符
_ 一個_ 如果沒有轉移字元 就認為是一個通配符
select 『hanli』gang001』
select 『han ligang001』
select 『han ligang001』
select 「han"ligang001」
select 「韓立剛001」
B、數值常量
數值常量不用添加引號,
select 100+100+200
C、布爾常量
布爾型常量取值 true 和 false
在SQL中使用1和0表示
select true,false
在表達式中
select 100>200
select 100<200
2、變數
用戶自定義變數使用@開始,使用set給變數賦值。
set @name=『孫悟空』;
select @name;
select * from student;
into student values (6,『孫悟空』,20);
into student values (8,@name,20);
set @sid=9,@nid=10
into student values (@sid,@name,20);
select @sid+@nid;
set @sid=@sid+1;
select @sid;
set @sname3=(select sname from student where sid=9);
select @sname3;
3、系統變數
系統變數分為全局系統變數和會話系統變數。
全局系統變數:針對所有默認設置
會話系統變數:針對當前用戶生效,用戶登錄MySQL會使用全局系統變數,如果會話中更改了變數值,使用更改後的值,不過只針對當前用戶生效。
show variables 顯示會話系統變數
show global variables 顯示全局系統變數
show session variables 顯示會話系統變數
show global variables like 『sql_select_limit』;使用通配符顯示匹配的變數設置
show session variables like 『sql_select_limit』;系統變數使用@@標識
select @@global.sql_select_limit 查看某個全局系統變數設置
select @@session.sql_select_limit 查看某個會話系統變數設置
set @@session.sql_select_limit=2 設置會話系統變數
全局系統變數需要在/etc/my.cnf配置文件中修改。
J. 簡單介紹幾個常用的SQL查詢語句
我們使用資料庫的時候,最常用的就是SQL語句了,那麼在SQL語句中比較常用的有哪些呢?下面我給大家分享一下。
首先是select語句,它經常被用於數據查詢,通過select我們可以快速的檢索自己想要的數據,如下圖所示
然後是update語句,update是進行數據更新的語句,更新的時候一定要指定where條件,如下圖所示
接下來是insert語句,insert被用來進行數據插入,運用它的時候一定注意插入的欄位順序,如下圖所示
最後是delete語句,delete被用來刪除表中的數據,進行刪除操作的時候也要注意指定刪除條件,如下圖所示