Ⅰ 寫一下簡單sql語句 見補充 快 在線
--1
CREATE TABLE [dbo].[學生情況表](
[學號] [char](7) COLLATE Chinese_PRC_CI_AS NOT NULL,
[姓名] [char](8) COLLATE Chinese_PRC_CI_AS NOT NULL,
[性別] [char](4) COLLATE Chinese_PRC_CI_AS NOT NULL CONSTRAINT [DF_學生情況表_性別] DEFAULT ('男'),
[出生日期] [smalldatetime] NOT NULL,
[班級] [char](5) COLLATE Chinese_PRC_CI_AS NULL CONSTRAINT [DF_學生情況表_班級] DEFAULT ((1)),
[總學分] [tinyint] NULL CONSTRAINT [DF_學生情況表_總學分] DEFAULT ((0)),
[備注] [text] COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_學生情況表] PRIMARY KEY CLUSTERED
(
[學號] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
--2
CREATE TABLE [dbo].[課程表](
[課程號] [char](3) COLLATE Chinese_PRC_CI_AS NOT NULL,
[課程名] [char](20) COLLATE Chinese_PRC_CI_AS NOT NULL,
[開課學期] [tinyint] NOT NULL CONSTRAINT [DF_課程表_開課學期] DEFAULT ((1)),
[學時] [tinyint] NOT NULL,
[學分] [tinyint] NOT NULL CONSTRAINT [DF_課程表_學分] DEFAULT ((0)),
CONSTRAINT [PK_課程表] PRIMARY KEY CLUSTERED
(
[課程號] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
--3
CREATE TABLE [dbo].[學生與課程表](
[學號] [char](7) COLLATE Chinese_PRC_CI_AS NOT NULL,
[課程號] [char](3) COLLATE Chinese_PRC_CI_AS NOT NULL,
[成績] [tinyint] NULL CONSTRAINT [DF_學生與課程表_成績] DEFAULT ((0)),
[學分] [tinyint] NULL CONSTRAINT [DF_學生與課程表_學分] DEFAULT ((0)),
CONSTRAINT [PK_學生與課程表] PRIMARY KEY CLUSTERED
(
[學號] ASC,
[課程號] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[課程表] WITH CHECK ADD CONSTRAINT [check_kkxq] CHECK (([開課學期]>=(1) AND [開課學期]<=(8)))
GO
ALTER TABLE [dbo].[課程表] CHECK CONSTRAINT [check_kkxq]
GO
ALTER TABLE [dbo].[學生與課程表] WITH CHECK ADD CONSTRAINT [FK_學生與課程表_課程表] FOREIGN KEY([課程號])
REFERENCES [dbo].[課程表] ([課程號])
GO
ALTER TABLE [dbo].[學生與課程表] CHECK CONSTRAINT [FK_學生與課程表_課程表]
GO
ALTER TABLE [dbo].[學生與課程表] WITH CHECK ADD CONSTRAINT [FK_學生與課程表_學生情況表] FOREIGN KEY([學號])
REFERENCES [dbo].[學生情況表] ([學號])
GO
ALTER TABLE [dbo].[學生與課程表] CHECK CONSTRAINT [FK_學生與課程表_學生情況表]
GO
ALTER TABLE [dbo].[學生與課程表] WITH CHECK ADD CONSTRAINT [check_score] CHECK (([成績]>=(0) AND [成績]<=(100)))
GO
ALTER TABLE [dbo].[學生與課程表] CHECK CONSTRAINT [check_score]
Ⅱ sql 語句大全
1、說明:創建資料庫
CREATE DATABASE database-name
2、說明:刪除資料庫
drop database dbname
3、說明:備份sql server
--- 創建 備份數據的 device
USE master
EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 開始 備份
BACKUP DATABASE pubs TO testBack
4、說明:創建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根據已有的表創建新表:
A:create table tab_new like tab_old (使用舊表創建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、說明:刪除新表
drop table tabname
6、說明:增加一個列
Alter table tabname add column col type
註:列增加後將不能刪除。DB2中列加上後數據類型也不能改變,唯一能改變的是增加varchar類型的長度。
7、說明:添加主鍵: Alter table tabname add primary key(col)
說明:刪除主鍵: Alter table tabname drop primary key(col)
8、說明:創建索引:create [unique] index idxname on tabname(col….)
刪除索引:drop index idxname
註:索引是不可更改的,想更改必須刪除重新建。
9、說明:創建視圖:create view viewname as select statement
刪除視圖:drop view viewname
10、說明:幾個簡單的基本的sql語句
選擇:select * from table1 where 范圍
插入:insert into table1(field1,field2) values(value1,value2)
刪除:delete from table1 where 范圍
更新:update table1 set field1=value1 where 范圍
查找:select * from table1 where field1 like 』%value1%』 ---like的語法很精妙,查資料!
排序:select * from table1 order by field1,field2 [desc]
總數:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、說明:幾個高級查詢運算詞
A: UNION 運算符
UNION 運算符通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重復行而派生出一個結果表。當 ALL 隨 UNION一起使用時(即 UNION ALL),不消除重復行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。
B: EXCEPT 運算符
EXCEPT運算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行並消除所有重復行而派生出一個結果表。當 ALL 隨 EXCEPT 一起使用時 (EXCEPT ALL),不消除重復行。
C: INTERSECT 運算符
INTERSECT運算符通過只包括 TABLE1 和 TABLE2 中都有的行並消除所有重復行而派生出一個結果表。當 ALL隨 INTERSECT 一起使用時 (INTERSECT ALL),不消除重復行。
註:使用運算詞的幾個查詢結果行必須是一致的。
12、說明:使用外連接
A、left (outer) join:
左外連接(左連接):結果集幾包括連接表的匹配行,也包括左連接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right (outer) join:
右外連接(右連接):結果集既包括連接表的匹配連接行,也包括右連接表的所有行。
C:full/cross (outer) join:
全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。
12、分組:Group by:
一張表,一旦分組 完成後,查詢後只能得到組相關的信息。
組相關的信息:(統計信息) count,sum,max,min,avg 分組的標准)
在SQLServer中分組時:不能以text,ntext,image類型的欄位作為分組依據
在selecte統計函數中的欄位,不能和普通的欄位放在一起;
13、對資料庫進行操作:
分離資料庫: sp_detach_db;附加資料庫:sp_attach_db 後接表明,附加需要完整的路徑名
14.如何修改資料庫的名稱:
sp_renamedb 'old_name', 'new_name'
Ⅲ SQL查詢語句
一、簡單查詢語句
1. 查看錶結構
SQL>DESC emp;
2. 查詢所有列
SQL>SELECT * FROM emp;
3. 查詢指定列
SQL>SELECT empmo, ename, mgr FROM emp;
SQL>SELECT DISTINCT mgr FROM emp; 只顯示結果不同的項
4. 查詢指定行
SQL>SELECT * FROM emp WHERE job='CLERK';
5. 使用算術表達式
SQL>SELECT ename, sal*13+nvl(comm,0) FROM emp;
nvl(comm,1)的意思是,如果comm中有值,則nvl(comm,1)=comm; comm中無值,則nvl(comm,1)=0。
SQL>SELECT ename, sal*13+nvl(comm,0) year_sal FROM emp; (year_sal為別名,可按別名排序)
SQL>SELECT * FROM emp WHERE hiredate>'01-1月-82';
6. 使用like操作符(%,_)
%表示一個或多個字元,_表示一個字元,[charlist]表示字元列中的任何單一字元,[^charlist]或者[!charlist]不在字元列中的任何單一字元。
SQL>SELECT * FROM emp WHERE ename like 'S__T%';
7. 在where條件中使用In
SQL>SELECT * FROM emp WHERE job IN ('CLERK','ANALYST');
8. 查詢欄位內容為空/非空的語句
SQL>SELECT * FROM emp WHERE mgr IS/IS NOT NULL;
9. 使用邏輯操作符號
SQL>SELECT * FROM emp WHERE (sal>500 or job='MANAGE') and ename like 'J%';
10. 將查詢結果按欄位的值進行排序
SQL>SELECT * FROM emp ORDER BY deptno, sal DESC; (按部門升序,並按薪酬降序)
二、復雜查詢
1. 數據分組(max,min,avg,sum,count)
SQL>SELECT MAX(sal),MIN(age),AVG(sal),SUM(sal) from emp;
SQL>SELECT * FROM emp where sal=(SELECT MAX(sal) from emp));
SQL>SELEC COUNT(*) FROM emp;
2. group by(用於對查詢結果的分組統計) 和 having子句(用於限制分組顯示結果)
SQL>SELECT deptno,MAX(sal),AVG(sal) FROM emp GROUP BY deptno;
SQL>SELECT deptno, job, AVG(sal),MIN(sal) FROM emp group by deptno,job having AVG(sal)<2000;
對於數據分組的總結:
a. 分組函數只能出現在選擇列表、having、order by子句中(不能出現在where中)
b. 如果select語句中同時包含有group by, having, order by,那麼它們的順序是group by, having, order by。
c. 在選擇列中如果有列、表達式和分組函數,那麼這些列和表達式必須出現在group by子句中,否則就是會出錯。
使用group by不是使用having的前提條件。
3. 多表查詢
SQL>SELECT e.name,e.sal,d.dname FROM emp e, dept d WHERE e.deptno=d.deptno order by d.deptno;
SQL>SELECT e.ename,e.sal,s.grade FROM emp e,salgrade s WHER e.sal BETWEEN s.losal AND s.hisal;
4. 自連接(指同一張表的連接查詢)
SQL>SELECT er.ename, ee.ename mgr_name from emp er, emp ee where er.mgr=ee.empno;
5. 子查詢(嵌入到其他sql語句中的select語句,也叫嵌套查詢)
5.1 單行子查詢
SQL>SELECT ename FROM emp WHERE deptno=(SELECT deptno FROM emp where ename='SMITH');查詢表中與smith同部門的人員名字。因為返回結果只有一行,所以用“=”連接子查詢語句
5.2 多行子查詢
SQL>SELECT ename,job,sal,deptno from emp WHERE job IN (SELECT DISTINCT job FROM emp WHERE deptno=10);查詢表中與部門號為10的工作相同的員工的姓名、工作、薪水、部門號。因為返回結果有多行,所以用“IN”連接子查詢語句。
in與exists的區別: exists() 後面的子查詢被稱做相關子查詢,它是不返回列表的值的。只是返回一個ture或false的結果,其運行方式是先運行主查詢一次,再去子查詢里查詢與其對 應的`結果。如果是ture則輸出,反之則不輸出。再根據主查詢中的每一行去子查詢里去查詢。in()後面的子查詢,是返回結果集的,換句話說執行次序和 exists()不一樣。子查詢先產生結果集,然後主查詢再去結果集里去找符合要求的欄位列表去。符合要求的輸出,反之則不輸出。
5.3 使用ALL
SQL>SELECT ename,sal,deptno FROM emp WHERE sal> ALL (SELECT sal FROM emp WHERE deptno=30);或SQL>SELECT ename,sal,deptno FROM emp WHERE sal> (SELECT MAX(sal) FROM emp WHERE deptno=30);查詢工資比部門號為30號的所有員工工資都高的員工的姓名、薪水和部門號。以上兩個語句在功能上是一樣的,但執行效率上,函數會高 得多。
5.4 使用ANY
SQL>SELECT ename,sal,deptno FROM emp WHERE sal> ANY (SELECT sal FROM emp WHERE deptno=30);或SQL>SELECT ename,sal,deptno FROM emp WHERE sal> (SELECT MIN(sal) FROM emp WHERE deptno=30);查詢工資比部門號為30號的任意一個員工工資高(只要比某一員工工資高即可)的員工的姓名、薪水和部門號。以上兩個語句在功能上是 一樣的,但執行效率上,函數會高得多。
5.5 多列子查詢
SQL>SELECT * FROM emp WHERE (job, deptno)=(SELECT job, deptno FROM emp WHERE ename='SMITH');
5.6 在from子句中使用子查詢
SQL>SELECT emp.deptno,emp.ename,emp.sal,t_avgsal.avgsal FROM emp,(SELECT emp.deptno,avg(emp.sal) avgsal FROM emp GROUP BY emp.deptno) t_avgsal where emp.deptno=t_avgsal.deptno AND emp.sal>t_avgsal.avgsal ORDER BY emp.deptno;
5.7 分頁查詢
資料庫的每行數據都有一個對應的行號,稱為rownum.
SQL>SELECT a2.* FROM (SELECT a1.*, ROWNUM rn FROM (SELECT * FROM emp ORDER BY sal) a1 WHERE ROWNUM<=10) a2 WHERE rn>=6;
指定查詢列、查詢結果排序等,都只需要修改最里層的子查詢即可。
5.8 用查詢結果創建新表
SQL>CREATE TABLE mytable (id,name,sal,job,deptno) AS SELECT empno,ename,sal,job,deptno FROM emp;
5.9 合並查詢(union 並集, intersect 交集, union all 並集+交集, minus差集)
SQL>SELECT ename, sal, job FROM emp WHERE sal>2500 UNION(INTERSECT/UNION ALL/MINUS) SELECT ename, sal, job FROM emp WHERE job='MANAGER';
合並查詢的執行效率遠高於and,or等邏輯查詢。
5.10 使用子查詢插入數據
SQL>CREATE TABLE myEmp(empID number(4), name varchar2(20), sal number(6), job varchar2(10), dept number(2)); 先建一張空表;
SQL>INSERT INTO myEmp(empID, name, sal, job, dept) SELECT empno, ename, sal, job, deptno FROM emp WHERE deptno=10; 再將emp表中部門號為10的數據插入到新表myEmp中,實現數據的批量查詢。
5.11 使用了查詢更新表中的數據
SQL>UPDATE emp SET(job, sal, comm)=(SELECT job, sal, comm FROM emp where ename='SMITH') WHERE ename='SCOTT';
Ⅳ 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
Ⅳ SQL查詢語句
SQL查詢語句精華大全 一、 簡單查詢
簡單的Transact-SQL查詢只包括選擇列表、FROM子句和WHERE子句。它們分別說明所查詢列、查詢的
表或視圖、以及搜索條件等。
例如,下面的語句查詢testtable表中姓名為「張三」的nickname欄位和email欄位。
SELECT nickname,email
FROM testtable
WHERE name='張三'(一) 選擇列表
選擇列表(select_list)指出所查詢列,它可以是一組列名列表、星號、表達式、變數(包括局部變
量和全局變數)等構成。1、選擇所有列
例如,下面語句顯示testtable表中所有列的數據:
SELECT *
FROM testtable2、選擇部分列並指定它們的顯示次序
查詢結果集合中數據的排列順序與選擇列表中所指定的列名排列順序相同。
例如:
SELECT nickname,email
FROM testtable3、更改列標題
在選擇列表中,可重新指定列標題。定義格式為:
列標題=列名
列名 列標題
如果指定的列標題不是標準的標識符格式時,應使用引號定界符,例如,下列語句使用漢字顯示列
標題:
SELECT 昵稱=nickname,電子郵件=email
FROM testtable4、刪除重復行
SELECT語句中使用ALL或DISTINCT選項來顯示表中符合條件的所有行或刪除其中重復的數據行,默認
為ALL。使用DISTINCT選項時,對於所有重復的數據行在SELECT返回的結果集合中只保留一行。5、限制返回的行數
使用TOP n [PERCENT]選項限制返回的數據行數,TOP n說明返回n行,而TOP n PERCENT時,說明n是
表示一百分數,指定返回的行數等於總行數的百分之幾。
例如:
SELECT TOP 2 *
FROM testtable
SELECT TOP 20 PERCENT *
FROM testtable(二) FROM子句
FROM子句指定SELECT語句查詢及與查詢相關的表或視圖。在FROM子句中最多可指定256個表或視圖,
它們之間用逗號分隔。
在FROM子句同時指定多個表或視圖時,如果選擇列表中存在同名列,這時應使用對象名限定這些列
所屬的表或視圖。例如在usertable和citytable表中同時存在cityid列,在查詢兩個表中的cityid時應
使用下面語句格式加以限定:
SELECT username,citytable.cityid
FROM usertable,citytable
WHERE usertable.cityid=citytable.cityid
在FROM子句中可用以下兩種格式為表或視圖指定別名:
表名 as 別名
表名 別名
例如上面語句可用表的別名格式表示為:
SELECT username,b.cityid
FROM usertable a,citytable b
WHERE a.cityid=b.cityid
SELECT不僅能從表或視圖中檢索數據,它還能夠從其它查詢語句所返回的結果集合中查詢數據。
例如:
SELECT a.au_fname+a.au_lname
FROM authors a,titleauthor ta
(SELECT title_id,title
FROM titles
WHERE ytd_sales>10000
) AS t
WHERE a.au_id=ta.au_id
AND ta.title_id=t.title_id
此例中,將SELECT返回的結果集合給予一別名t,然後再從中檢索數據。(三) 使用WHERE子句設置查詢條件
WHERE子句設置查詢條件,過濾掉不需要的數據行。例如下面語句查詢年齡大於20的數據:
SELECT *
FROM usertable
WHERE age>20
WHERE子句可包括各種條件運算符:
比較運算符(大小比較):>、>=、=、<、<=、<>、!>、!<
范圍運算符(表達式值是否在指定的范圍):BETWEEN…AND…
NOT BETWEEN…AND…
列表運算符(判斷表達式是否為列表中的指定項):IN (項1,項2……)
NOT IN (項1,項2……)
模式匹配符(判斷值是否與指定的字元通配格式相符):LIKE、NOT LIKE
空值判斷符(判斷表達式是否為空):IS NULL、NOT IS NULL
邏輯運算符(用於多條件的邏輯連接):NOT、AND、OR
1、范圍運算符例:age BETWEEN 10 AND 30相當於age>=10 AND age<=30
2、列表運算符例:country IN ('Germany','China')
3、模式匹配符例:常用於模糊查找,它判斷列值是否與指定的字元串格式相匹配。可用於char、
varchar、text、ntext、datetime和smalldatetime等類型查詢。
可使用以下通配字元:
百分號%:可匹配任意類型和長度的字元,如果是中文,請使用兩個百分號即%%。
下劃線_:匹配單個任意字元,它常用來限製表達式的字元長度。
方括弧[]:指定一個字元、字元串或范圍,要求所匹配對象為它們中的任一個。
[^]:其取值也[] 相同,但它要求所匹配對象為指定字元以外的任一個字元。
例如:
限制以Publishing結尾,使用LIKE '%Publishing'
限制以A開頭:LIKE '[A]%'
限制以A開頭外:LIKE '[^A]%'
4、空值判斷符例WHERE age IS NULL
5、邏輯運算符:優先順序為NOT、AND、OR
(四)查詢結果排序
使用ORDER BY子句對查詢返回的結果按一列或多列排序。ORDER BY子句的語法格式為:
ORDER BY {column_name [ASC|DESC]} [,…n]
其中ASC表示升序,為默認值,DESC為降序。ORDER BY不能按ntext、text和image數據類型進行排
序。
例如:
SELECT *
FROM usertable
ORDER BY age desc,userid ASC
另外,可以根據表達式進行排序。二、 聯合查詢
UNION運算符可以將兩個或兩個以上上SELECT語句的查詢結果集合合並成一個結果集合顯示,即執行聯
合查詢。UNION的語法格式為:
select_statement
UNION [ALL] selectstatement
[UNION [ALL] selectstatement][…n]
其中selectstatement為待聯合的SELECT查詢語句。
ALL選項表示將所有行合並到結果集合中。不指定該項時,被聯合查詢結果集合中的重復行將只保留一
行。
聯合查詢時,查詢結果的列標題為第一個查詢語句的列標題。因此,要定義列標題必須在第一個查詢語
句中定義。要對聯合查詢結果排序時,也必須使用第一查詢語句中的列名、列標題或者列序號。
在使用UNION 運算符時,應保證每個聯合查詢語句的選擇列表中有相同數量的表達式,並且每個查詢選
擇表達式應具有相同的數據類型,或是可以自動將它們轉換為相同的數據類型。在自動轉換時,對於數值類
型,系統將低精度的數據類型轉換為高精度的數據類型。
在包括多個查詢的UNION語句中,其執行順序是自左至右,使用括弧可以改變這一執行順序。例如:
查詢1 UNION (查詢2 UNION 查詢3)三、連接查詢
通過連接運算符可以實現多個表查詢。連接是關系資料庫模型的主要特點,也是它區別於其它類型
資料庫管理系統的一個標志。
在關系資料庫管理系統中,表建立時各數據之間的關系不必確定,常把一個實體的所有信息存放在
一個表中。當檢索數據時,通過連接操作查詢出存放在多個表中的不同實體的信息。連接操作給用戶帶
來很大的靈活性,他們可以在任何時候增加新的數據類型。為不同實體創建新的表,爾後通過連接進行
查詢。
連接可以在SELECT 語句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出連接時有助於
將連接操作與WHERE子句中的搜索條件區分開來。所以,在Transact-SQL中推薦使用這種方法。
SQL-92標准所定義的FROM子句的連接語法格式為:
FROM join_table join_type join_table
[ON (join_condition)]
其中join_table指出參與連接操作的表名,連接可以對同一個表操作,也可以對多表操作,對同一
個表操作的連接又稱做自連接。
join_type 指出連接類型,可分為三種:內連接、外連接和交叉連接。內連接(INNER JOIN)使用比
較運算符進行表間某(些)列數據的比較操作,並列出這些表中與連接條件相匹配的數據行。根據所使用
的比較方式不同,內連接又分為等值連接、自然連接和不等連接三種。
外連接分為左外連接(LEFT OUTER JOIN或LEFT JOIN)、右外連接(RIGHT OUTER JOIN或RIGHT JOIN)
和全外連接(FULL OUTER JOIN或FULL JOIN)三種。與內連接不同的是,外連接不只列出與連接條件相匹
配的行,而是列出左表(左外連接時)、右表(右外連接時)或兩個表(全外連接時)中所有符合搜索條件的
數據行。
交叉連接(CROSS JOIN)沒有WHERE 子句,它返回連接表中所有數據行的笛卡爾積,其結果集合中的
數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。
連接操作中的ON (join_condition) 子句指出連接條件,它由被連接表中的列和比較運算符、邏輯
運算符等構成。
無論哪種連接都不能對text、ntext和image數據類型列進行直接連接,但可以對這三種列進行間接
連接。例如:
SELECT p1.pub_id,p2.pub_id,p1.pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)(一)內連接
內連接查詢操作列出與連接條件匹配的數據行,它使用比較運算符比較被連接列的列值。內連接分
三種:
1、等值連接:在連接條件中使用等於號(=)運算符比較被連接列的列值,其查詢結果中列出被連接
表中的所有列,包括其中的重復列。
2、不等連接: 在連接條件使用除等於運算符以外的其它比較運算符比較被連接的列的列值。這些
運算符包括>、>=、<=、<、!>、!<和<>。
3、自然連接:在連接條件中使用等於(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢
結果集合中所包括的列,並刪除連接表中的重復列。
例,下面使用等值連接列出authors和publishers表中位於同一城市的作者和出版社:
SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
又如使用自然連接,在選擇列表中刪除authors 和publishers 表中重復列(city和state):
SELECT a.*,p.pub_id,p.pub_name,p.country
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
(二)外連接
內連接時,返回查詢結果集合中的僅是符合查詢條件( WHERE 搜索條件或 HAVING 條件)和連接條件
的行。而採用外連接時,它返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左外
連接時)、右表(右外連接時)或兩個邊接表(全外連接)中的所有數據行。
如下面使用左外連接將論壇內容和作者信息連接起來:
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username
下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們所在的城市:
SELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username(三)交叉連接
交叉連接不帶WHERE 子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回到結果集合中的數
據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。
例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數將等
於6*8=48行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY typeSQL核心語句(非常實用的幾個技巧)插入數據向表中添加一個新記錄,你要使用SQL INSERT 語句。這里有一個如何使用這種語句的例子:INSERT mytable (mycolumn) VALUES (『some data』)這個語句把字元串』some data』插入表mytable的mycolumn欄位中。將要被插入數據的欄位的名字在第一個括弧中指定,實際的數據在第二個括弧中給出。INSERT 語句的完整句法如下:INSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT VALUES |</p><p>Values_list | select_statement}如果一個表有多個欄位,通過把欄位名和欄位值用逗號隔開,你可以向所有的欄位中插入數據。假設表mytable有三個欄位first_column,second_column,和third_column。下面的INSERT語句添加了一條三個欄位都有值的完整記錄:INSERT mytable (first_column,second_column,third_column)VALUES (『some data』,』some more data』,』yet more data』)注意你可以使用INSERT語句向文本型欄位中插入數據。但是,如果你需要輸入很長的字元串,你應該使用WRITETEXT語句。這部分內容對本書來說太高級了,因此不加討論。要了解更多的信息,請參考Microsoft SQL Sever 的文檔。如果你在INSERT 語句中只指定兩個欄位和數據會怎麼樣呢?換句話說,你向一個表中插入一條新記錄,但有一個欄位沒有提供數據。在這種情況下,有下面的四種可能:如果該欄位有一個預設值,該值會被使用。例如,假設你插入新記錄時沒有給欄位third_column提供數據,而這個欄位有一個預設值』some value』。在這種情況下,當新記錄建立時會插入值』some value』。如果該欄位可以接受空值,而且沒有預設值,則會被插入空值。如果該欄位不能接受空值,而且沒有預設值,就會出現錯誤。你會收到錯誤信息:The column in table mytable may not be null.最後,如果該欄位是一個標識欄位,那麼它會自動產生一個新值。當你向一個有標識欄位的表中插入新記錄時,只要忽略該欄位,標識欄位會給自己賦一個新值。注意向一個有標識欄位的表中插入新記錄後,你可以用SQL變數@@identity來訪問新記錄的標識欄位的值。考慮如下的SQL語句:INSERT mytable (first_column) VALUES(『some value』)INSERT anothertable(another_first,another_second)VALUES(@@identity,』some value』)如果表mytable有一個標識欄位,該欄位的值會被插入表anothertable的another_first欄位。這是因為變數@@identity總是保存最後一次插入標識欄位的值。欄位another_first應該與欄位first_column有相同的數據類型。但是,欄位another_first不能是應該標識欄位。Another_first欄位用來保存欄位first_column的值。刪除記錄要從表中刪除一個或多個記錄,需要使用SQL DELETE語句。你可以給DELETE 語句提供WHERE 子句。WHERE子句用來選擇要刪除的記錄。例如,下面的這個DELETE語句只刪除欄位first_column的值等於』Delete Me』的記錄:DELETE mytable WHERE first_column=』Deltet Me』DELETE 語句的完整句法如下:DELETE [FROM] {table_name|view_name} [WHERE clause]在SQL SELECT 語句中可以使用的任何條件都可以在DELECT 語句的WHERE子句中使用。例如,下面的這個DELETE語句只刪除那些first_column欄位的值為』goodbye』或second_column欄位的值為』so long』的記錄:DELETE mytable WHERE first_column=』goodby』 OR second_column=』so long』如果你不給DELETE 語句提供WHERE 子句,表中的所有記錄都將被刪除。你不應該有這種想法。如果你想刪除應該表中的所有記錄,應使用第十章所講的TRUNCATE TABLE語句。注意為什麼要用TRUNCATE TABLE 語句代替DELETE語句?當你使用TRUNCATE TABLE語句時,記錄的刪除是不作記錄的。也就是說,這意味著TRUNCATE TABLE 要比DELETE快得多。更新記錄要修改表中已經存在的一條或多條記錄,應使用SQL UPDATE語句。同DELETE語句一樣,UPDATE語句可以使用WHERE子句來選擇更新特定的記錄。請看這個例子:UPDATE mytable SET first_column=』Updated!』 WHERE second_column=』Update Me!』這個UPDATE 語句更新所有second_column欄位的值為』Update Me!』的記錄。對所有被選中的記錄,欄位first_column的值被置為』Updated!』。下面是UPDATE語句的完整句法:UPDATE {table_name|view_name} SET [{table_name|view_name}]{column_list|variable_list|variable_and_column_list}[,{column_list2|variable_list2|variable_and_column_list2}…[,{column_listN|variable_listN|variable_and_column_listN}]][WHERE clause]注意你可以對文本型欄位使用UPDATE語句。但是,如果你需要更新很長的字元串,應使用UPDATETEXT語句。這部分內容對本書來說太高級了,因此不加討論。要了解更多的信息,請參考Microsoft SQL Sever 的文檔。如果你不提供WHERE子句,表中的所有記錄都將被更新。有時這是有用的。例如,如果你想把表titles中的所有書的價格加倍,你可以使用如下的UPDATE 語句:你也可以同時更新多個欄位。例如,下面的UPDATE語句同時更新first_column,second_column,和third_column這三個欄位:UPDATE mytable SET first_column=』Updated!』Second_column=』Updated!』Third_column=』Updated!』WHERE first_column=』Update Me1』技巧SQL忽略語句中多餘的空格。你可以把SQL語句寫成任何你最容易讀的格式。用SELECT 創建記錄和表你也許已經注意到,INSERT 語句與DELETE語句和UPDATE語句有一點不同,它一次只操作一個記錄。然而,有一個方法可以使INSERT 語句一次添加多個記錄。要作到這一點,你需要把INSERT 語句與SELECT 語句結合起來,象這樣:INSERT mytable (first_column,second_column)SELECT another_first,another_secondFROM anothertableWHERE another_first=』Copy Me!』這個語句從anothertable拷貝記錄到mytable.只有表anothertable中欄位another_first的值為』Copy Me!』的記錄才被拷貝。當為一個表中的記錄建立備份時,這種形式的INSERT 語句是非常有用的。在刪除一個表中的記錄之前,你可以先用這種方法把它們拷貝到另一個表中。如果你需要拷貝整個表,你可以使用SELECT INTO 語句。例如,下面的語句創建了一個名為newtable的新表,該表包含表mytable的所有數據:SELECT * INTO newtable FROM mytable你也可以指定只有特定的欄位被用來創建這個新表。要做到這一點,只需在欄位列表中指定你想要拷貝的欄位。另外,你可以使用WHERE 子句來限制拷貝到新表中的記錄。下面的例子只拷貝欄位second_columnd的值等於』Copy Me!』的記錄的first_column欄位。SELECT first_column INTO newtableFROM mytableWHERE second_column=』Copy Me!』使用SQL修改已經建立的表是很困難的。例如,如果你向一個表中添加了一個欄位,沒有容易的辦法來去除它。另外,如果你不小心把一個欄位的數據類型給錯了,你將沒有辦法改變它。但是,使用本節中講述的SQL語句,你可以繞過這兩個問題。例如,假設你想從一個表中刪除一個欄位。使用SELECT INTO 語句,你可以創建該表的一個拷貝,但不包含要刪除的欄位。這使你既刪除了該欄位,又保留了不想刪除的數據。如果你想改變一個欄位的數據類型,你可以創建一個包含正確數據類型欄位的新表。創建好該表後,你就可以結合使用UPDATE語句和SELECT 語句,把原來表中的所有數據拷貝到新表中。通過這種方法,你既可以修改表的結構,又能保存原有的數據。
Ⅵ 經典sql語句
、google是很好的學習搜索引擎,
推薦一下新手學習SQL的基礎技術,在搜索以下內容:
「一網打盡」通用SQL資料庫的查詢語句
實例講解SQL Server中"Update"的用法
三種資料庫利用SQL語句進行高效果分頁
深入講解SQL Server資料庫的嵌套子查詢
實現跨多個表格的數據進行組合的SQL語句
深入講解SQL Union和Union All的使用方法
還有一些基本的語法這里也簡單介紹一下,希望對你有用:
學習SQL應知道的動態SQL語句基本語法
1 、普通SQL語句可以用Exec執行
eg: Select * from tableName
Exec('select * from tableName')
Exec sp_executesql N'select * from tableName' -- 請注意字元串前一定要加N
2、欄位名,表名,資料庫名之類作為變數時,必須用動態SQL
eg:
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 錯誤,不會提示錯誤,但結果為固定值FiledName,並非所要。
Exec('select ' + @fname + ' from tableName') -- 請注意 加號前後的 單引號的邊上加空格
當然將字元串改成變數的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --設置欄位名
declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句會報錯
declare @s Nvarchar(1000) -- 注意此處改為nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正確
3、輸出參數
declare @num int,
@sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)
--如何將exec執行結果放入變數中?
declare @num int,
@sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num
此外,如果想要在SQL語句 字元串中使用 單引號 '' 可以 使用 ''''
Ⅶ 資料庫常用sql語句有哪些
資料庫常用sql語句有哪些
SQL語句有哪些?SQL語句無論是種類還是數量都是繁多的,很多語句也是經常要用到的,下文我為大家分享的就是SQL的常用語句,僅供參考!
50個常用的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”表中“葉平”老師教的課的成績都更改為此課程的平均成績;
update 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(char(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 S# having count(*)>2)group by S#;
49、檢索“004”課程分數小於60,按分數降序排列的同學學號
select S# from SC where C#='004'and score <60 order by score desc;
50、刪除“002”同學的“001”課程的成績
delete from Sc where S#='001'and C#='001';
;Ⅷ sql查詢語句,請高手做做,滿意加分
1.select datediff(yy,出生日期,getdate()) from 職工表
2.select 部門號 as depName,count(職工號) as num from 職工表 where 黨員否=(是黨員的那個標志) group by 部門號
3.select a.姓名,b.工資 from 職工表 a,職工工資表 b where a.職工號=b.職工號 and b.日期=(資料庫中存的2004年1月的日期)
4.select a.職工號,a.姓名,avg(b.工資) as avgSalary from 職工表 a,職工工資表 b where a.職工號=b.職工號 group by a.職工號,a.姓名
5.select a.職工號,a.姓名,b.部門名,c.工資 from 職工表 a,部門表 b,職工工資表 c where a.職工號=c.職工號 and a.部門號=b.部門號 and c.日期=(資料庫中存的2004年2月的日期) order by b.部門名
6.select b.部門名,avg(c.工資) as avgSalary from 職工表 a,部門表 b,職工工資表 c where a.職工號=c.職工號 and b.部門號=a.部門號 group by b.部門名
7.select b.部門名,avg(c.工資) as avgSalary from 職工表 a,部門表 b,職工工資表 c where a.職工號=c.職工號 and b.部門號=a.部門號 group by b.部門名 having avg(c.工資)>1200
8.select a.職工號,a.姓名,(case when b.部門名='財務處' then '管理部門' when b.部門名='人事處' then '管理部門' else '市場部門' end) as depType
from 職工表 a,部門表 b where b.部門號=a.部門號