什么是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, sal
12 from emp;
select empno, ename,sal, sal*12 +1000 from emp;
注:在Select语句中,对数值型数据可以使用算术运算符创建表达式

使用字段别名
select empno as 员工编号, ename 员工姓名, sal12 年薪 from emp;
select empno, ename “Ename”, sal
12 “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() 适用任何类型数据