什麼是SQL語言
結構化查詢語言(Structured Query Language)(發音ˈes kjuːˈ)
SQL是最重要的關系資料庫操作語言,是所有關系資料庫管理系統的标準語言
許多資料庫廠商在使用SQL的同時,都對SQL進行了擴充,比如ORACLE的PL/SQL語言,MS SQL-Server的T-SQL語言
SQL語言是一種非過程化語言,隻需要提出”做什麼”,而不需要指明“怎麼做”
SQL可以做什麼
資料庫資料的增删改查操作(CRUD)
資料庫對象的建立,修改和删除操作
使用者權限/角色的授予和取消
事務控制
1974年,IBM的Ray Boyce和Don Chamberlin将E.F.Codd關系資料庫的12條準則的數學定義以簡單的關鍵字文法表現出來,裡程碑式地提出了結構化查詢語言(Structured Query Language,SQL)。
SQL語言的功能包括查詢、操縱、定義和控制,是一個綜合的、通用的關系資料庫語言,同時又是一種高度非過程化的語言,隻要求使用者指出做什麼而不需要指出怎麼做。SQL內建實作了資料庫生命周期中的全部操作,自産生之日起,SQL語言便成了檢驗關系資料庫的試金石,而SQL語言标準的每一次變更都指導着關系資料庫産品的發展方向。在SQL語言取得進展的同時,IBM研究中心于1973年開始着手System R項目。其目标是論證一個全功能關系DBMS的可行性。該項目結束于1979年,完成了第一個實作SQL的DBMS。
1986年,ANSI把SQL作為關系資料庫語言的美國标準,同年公布了标準SQL文本。基本SQL定義是ANSIX3135-89,“Database Language - SQL with Integrity Enhancement”[ANS89],一般叫做SQL-89标準(也稱為SQL1)。SQL-89定義了模式、資料操作和事務處理。SQL-89和随後的ANSIX3168-1989,“Database Language-Embedded SQL”構成了第一代SQL标準。
1992年,ISO 和 IEC 釋出了 SQL 的國際标準,稱為 SQL-92。ANSI 随之釋出的相應标準是 ANSI SQL-92。ANSI SQL-92 有時被稱為 ANSI SQL。ANSIX3135-1992[ANS92]描述了一種增強功能的SQL,現在叫做SQL-92标準(也稱為SQL2)。SQL-92包括模式操作,動态建立和SQL語句動态執行、網絡環境支援等增強特性。SQL Server 使用 ANSI SQL-92 的擴充集,稱為 T-SQL,其遵循 ANSI 制定的 SQL-92 标準。
在完成SQL-92标準後,ANSI和ISO即開始合作在1999年釋出了SQL-99标準(也稱為SQL3)。SQL3的主要特點在于抽象資料類型的支援,為新一代對象關系資料庫提供了标準。
目前SQL的最新标準是SQL-2003。
到目前為止,SQL共推出四代标準,分别是SQL-89、SQL-92、SQL-99、SQL-2003。
SQL語言的分類
DQL(資料查詢語言)
select
DML(資料操作語言)
insert、update、delete
DDL(資料定義語言)
create、alter、drop
DCL(資料控制語言)
grant、revoke
TCL(事務控制語言)
SAVEPOINT 、 ROLLBACK、SET TRANSACTION ,COMMIT
資料操作語言針對表中的資料,而資料定義語言針對資料庫對象(表、索引、視圖、觸發器、存儲過程、函數、表空間等)
關系資料庫基本概念
關系:整個二維表
關系名:表格名稱
元組:行資料(記錄)
屬性:列資料(字段)
屬性名:列名稱(字段名)
主鍵:唯一确定元組的屬性組(關鍵字)
域:屬性的取值範圍
select * from emp;
select * from emp order by sal desc ;
select * from emp where ename like ‘S%’;
select avg(sal), max(sal), min(sal), sum(sal) from emp;
select deptno, avg(sal) from emp group by deptno;
insert into student (id,name,age) values(2,‘lkl’,45);
update student set score=88 where id=2;
delete from student where id=2;
CREATE USER bjsxt IDENTIFIED BY bjsxt;
GRANT connect,resource TO bjsxt;
最簡單的查詢方式
select * from emp;
select * from dept;
select empno, ename,sal from emp;
使用算術表達式
select empno, ename,sal,sal1.08 from emp;
select empno, ename,sal, sal12 from emp;
select empno, ename,sal, sal*12 +1000 from emp;
注:在Select語句中,對數值型資料可以使用算術運算符建立表達式
使用字段别名
select empno as 員工編号, ename 員工姓名, sal12 年薪 from emp;
select empno, ename “Ename”, sal12 “Anual Salary” from emp;
select sal*12+5000 as “年度工資(加年終獎)” from emp;
字段别名
重命名查詢結果中的字段,以增強可讀性
别名如果含有空格或其他特殊字元或大小寫敏感,需用雙引号引起來。
AS可以省略
預設情況下,查詢結果中包含所有符合條件的記錄行,包括重複行
select deptno from emp;
使用DISTINCT關鍵字可從查詢結果中清除重複行
select distinct deptno from emp;
select distinct job from emp;
DISTINCT的作用範圍是後面所有字段的組合
select, distinct deptno job from emp;
使用order by 子句對查詢結果進行排序
排序方式包括升序(asc,預設)和降序(desc)兩種:
select empno, ename, sal from emp order by sal;
select empno, ename, sal from emp order by sal desc ;
按多字段排序
select deptno, empno, ename, sal from emp order by deptno, sal;
使用字段别名排序
select empno, ename, sal*12 annsal from emp order by annsal;
指定查詢條件使用where子句
用法舉例
select * from emp where deptno=10;
select * from emp where ename = ‘SMITH’;
select * from emp where hiredate = ‘02-4月-81’;
注意:
字元串和日期值要用單引号擴起來
字元串大小寫敏感
日期值格式敏感,預設的日期格式是’DD-MON-RR‘
查詢條件中可以使用比較運算符
select * from emp where sal > 2900;
select * from emp where deptno <> 30;
select * from emp where sal between 1600 and 2900;
select * from emp where ename in(‘SMITH’,‘CLARK’,‘KING’);
使用LIKE運算符執行模糊查詢(通配查詢)
% 表示零或多個字元 _ 表示一個字元
對于特殊符号可使用ESCAPE 辨別符來查找
用法舉例
select * from emp where ename like ‘S%’;
select * from emp where ename like ‘_A%’;
select * from emp where ename like ‘%_%’ escape ‘’;
使用IS NULL運算符進行空值判斷
用法舉例
select * from emp where comm is null;
select * from emp where comm is not null;
查詢條件中可以使用邏輯運算符
select * from emp where deptno = 10 and sal > 1000;
select * from emp where deptno = 10 or job = ‘CLERK’;
select * from emp where sal not in (800, 1500, 2000);
SQL優化問題:
AND: 把檢索結果較少的條件放到後面
OR: 把檢索結果較多的條件放到後面
共計四種運算符:算術>連接配接>比較>邏輯
可使用小括号強行改變運算順序
select * from emp where job=‘SALESMAN’ or job=‘CLERK’ and sal>=1280;
select * from emp where (job=‘SALESMAN’ or job=‘CLERK’) and sal>=1280;
使用函數可以大大提高SELECT語句操作資料庫的能力;
它給資料的轉換和處理提供了友善。
函數隻是将取出的資料進行處理,不會改變資料庫中的值。
Oracle函數分為單行函數和多行函數兩大類
單行函數分類
字元函數 數值函數 日期函數
轉換函數 通用函數
多行函數
sum() avg() 僅适用數值型
count() max() min() 适用任何類型資料