SQL常用语句大全

2017-01-14 10:06:03来源:http://www.jianshu.com/p/67007daf2d94作者:甘邦人点击

第七城市
1. 简单查询语句
1.1 查询全部:

SELECT * FROM 表名称 ;


1.2 实际上简单查询语句语法格式就是:

SELECT * | 具体的列 别名FROM 表名称 ;



查询所有
1.3 如果现在假设,只需要查询出雇员的编号、姓名、工作的话,则就需要指定查询的列:

SELECT empno,ename,job FROM emp ;



返回列指定的名称
1.4 要求查询出某一列,肯定要查询的是某一个字段:

SELECT job FROM emp;



查询指定字段

以上的查询结果似乎有一些不妥。因为工作存在重复值,既然要查询的是工作,所以肯定应该将重复的内容消除掉,所以在查询的时候可以通过 DISTINCT 直接消除掉所有的重复列。


SELECT {DISTINCT} * | 具体的列 别名FROM 表名称 ;


但是,在消除重复列的时候,有一点必须说明,如果要同时查询多列,则必须保证所有列都重复才能消除掉。
例如:查询雇员的编号及工作


SELECT DISTINCT empno,job FROM emp ;



筛选掉重复的

因为雇员编号不重复,所以此时证明所有的列没有重复的,所以不能消除掉。


1.5 要求查询出雇员的编号,姓名,工作,但是显示的格式:
编号是:7369 的雇员,姓名是:SMITH,工作是:CLERK

要想实现此种功能,则可以使用 Oracle 中提供的字符串连接操作,使用“||”表示。如果要加入一些显示信息的话,所有的其他的固定信息要使用“'”括起来。


SELECT '编号是:' || empno || '的雇员,姓名是:' || ename || ',工作是:' || jobFROM emp ;



按指定格式返回
1.6 在查询中也可以使用四则运算功能,例如:要求,求出每个雇员的姓名及年薪。

SELECT ename , sal * 12 FROM emp ;



查询返回年薪

在程序中 sal*12 意义很不明确,所以最好为这个运算结果起一个别名,但是在起别名的时候一定要回避中文。


SELECT ename , sal * 12 incomeFROM emp ;


程序中可以支持+、-、*、/的语句,所有的语句要有优先顺序,先乘除后加减。


2. 限定查询(WHERE子句)
2.1 如果希望可以根据指定的条件查询的话,则必须指定限定查询。限定查询的语法:

SELECT {DISTINCT} * | 具体的列 别名FROM 表名称{WHERE 条件(s)}


2.1.1 范例:查询出工资大于 1500 的所有雇员信息
· 数学计算中,工资大于:sal>1500
SELECT * FROM emp WHERE sal>1500 ;



根据条件查询

2.1.2 范例:查询每月可以得到奖金的雇员信息
·奖金是 comm 字段
·只要字段中存在内容,则表示此内容不为空(null),如果存在内容,则会显示具体的值。
·不为空的表示:字段 IS NOT NULL
SELECT * FROM emp WHERE comm IS NOT NULL ;



查询每月可以得到奖金的雇员

2.1.3 范例:查询没有奖金的雇员
没有奖金则 comm 字段的内容肯定是 null,格式:字段 IS NULL
SELECT * FROM emp WHERE comm IS NULL ;



查询没有奖金的雇员

2.1.4 范例:要求查询出,基本工资大于 1500,同时可以领取奖金的雇员信息。
· 此时应该是两个条件,而且两个条件必须同时满足;
· 既然要求两个条件全部满足,则必须使用 AND 操作符进行条件的连接。
SELECT * FROM emp WHERE sal>1500 AND comm IS NOT NULL ;



基本工资大于 1500,同时可以领取奖金


同时指定了两个条件,两个条件必须同时满足才可以查询出结果。


2.1.5 范例:要求查询出,基本工资大于 1500,或者可以领取奖金的雇员信息。
· 如果要表现出或者的概念使用 OR 进行连接,表示两个条件有一个满足即可。
SELECT * FROM emp WHERE sal>1500 OR comm IS NOT NULL ;



基本工资大于 1500,或者可以领取奖金


之前使用 NOT 可以取反,把真的条件变为假的,假的变为真的。


2.1.6 范例:要求查询出,基本工资不大于 1500,同时不可以领取奖金的雇员信息。
· 此时相当于是整体的条件取反。
SELECT * FROM emp WHERE NOT (sal>1500 AND comm IS NOT NULL) ;



基本工资不大于 1500,同时不可以领取奖金


从程序中可以发现,通过括号表示一组的条件。


2.1.7 范例:查询基本工资大于 1500,但是小于 3000 的全部雇员信息
· 满足两个:sal > 1500 ,sal < 3000
SELECT * FROM emp WHERE sal>1500 AND sal<3000 ;



工资大于 1500,但是小于 3000 的全部雇员

在 SQL 语法中,提供了一个专门的指定范围查询的过滤语句:BETWEEN...AND....
语法格式:
字段 BETWEEN 最小值 AND 最大值


2.1.8 范例:使用 BETWEEN...AND 修改之前的操作
SELECT * FROM emp WHERE sal BETWEEN 1500 AND 3000;



1500-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' ;



1981年1月1日 ~ 1981年12月31日


结论:BETWEEN ... AND 查询除了可以支持数字之外,也可以支持日期的查询· 随着深入的学习会发现,日期实际上也是以数字的形式表示出来。


2.1.10 范例:要求查询出姓名是 smith 的雇员信息· 此时告诉了要查询的名字,条件:ename='smith'


SELECT * FROM emp WHERE ename='smith' ;


执行以上的查询语句之后,并不会返回查询结果,再次查询数据库表的信息,发现 smith 是采用大写的形式表示的,在 Oracle 中是对大小写敏感的,所以此时在查询的时候必须以大写的形式进行条件的编写。代码修改如下:


SELECT * FROM emp WHERE ename='SMITH' ;



大小写敏感

2.1.11 范例:要求查询出雇员编号是 7369、7499、7521 的雇员的具体信息· 如果此时按照之前的做法,则设置条件要使用 OR 连接:
|- empno=7369 OR empno=7499 OR empno=7521


SELECT * FROM empWHERE empno=7369 OR empno=7499 OR empno=7521 ;



多条件用OR连接


实际上,此时是指定了查询的范围,那么既然有范围了在 SQL 语法中就可以使用 IN 操作符完成。
语法格式:
字段 IN (值 1,值 2,.....,值 n)
如果现在要求查询的内容不在此范围之中,则可以使用 NOT IN,语法如下:
字段 NOT IN (值 1,值 2,.....,值 n)
范例:使用以上的格式进行修改
SELECT * FROM empWHERE empno IN (7369,7499,7521) ;



IN 和 NOT IN

2.1.12 范例:要求查询出雇员编号不是 7369、7499、7521 的雇员的具体信息
SELECT * FROM empWHERE empno NOT IN (7369,7499,7521) ;



查询出雇员编号不是

另外,需要说明的是,使用 IN 操作符不光可以用在数字上,也可以用在字符串的信息上。


2.1.13 范例:要求查询出姓名是 SMITH、ALLEN、KING 的雇员信息
SELECT * FROM empWHERE ename IN ('SMITH','ALLEN','KING') ;



85E0FF9C-1338-4822-8CC0-E3F04B6D4D7F.png


提示: 如果在指定的查询范围中指定了额外的内容,则不影响程序运行。


SELECT * FROM empWHERE ename IN ('SMITH','ALLEN','KING','#$#$$##$') ;


在一般的日常见到的站点中经常发现有模糊查找功能,即:输入一个指定的关键字,把符合的内容全部查询出来,在 SQL 中使用 LIKE 语句完成。


在使用 LIKE 语句的时候要注意通配符的问题,在 LIKE 语句中主要使用以下两种通配符:
· “%”:可以匹配任意长度的内容
· “_”:可以匹配一个长度的内容


2.1.14 范例:查询出所有雇员姓名中第二个字母包含“M”的雇员信息


SELECT * FROM empWHERE ename LIKE '_M%' ;



查询出所有雇员姓名中第二个字母包含“M”的雇员信息

2.1.15 范例:查询出雇员姓名中包含字母 M 的雇员信息· 此时,表示可以在任意的位置上出现字母 M


SELECT * FROM empWHERE ename LIKE '%M%' ;



任意的位置上出现字母 M

但是,要提醒大家的是:“如果在使用 LIKE 的时候没有指定查询的关键字,则表示查询全部”


SELECT * FROM empWHERE ename LIKE '%%' ;


将所有的记录都查询出来了。



所有记录


使用 LIKE 还可以方便的进行日期的查找功能。


2.1.16 范例:要求查询出在 1981 年雇佣的雇员信息


SELECT * FROM empWHERE hiredate LIKE '%81%' ;



在 1981 年雇佣的雇员信息

2.1.17 范例:查询工资中包含 6 的雇员信息


SELECT * FROM empWHERE sal LIKE '%5%' ;



工资中包含 6 的雇员信息


在操作条件中还可以使用:>、>=、=、<、<=等计算符号不等于符号:在 SQL 中如果要想使用不等于符号,可以有两种形式:“<>”、“!=”范例:查询雇员编号不是 7369 的雇员信息
· 使用“<>”完成


SELECT * FROM emp WHERE empno<>7369


· 使用“!=”完成


SELECT * FROM emp WHERE empno!=7369 ;



不等于
2.2 对结果进行排序(ORDER BY子句)

在 SQL 中可以使用 ORDER BY 子句对查询的结果进行排序,例如,现在使用查询全部的语句:
SELECT * FROM emp ;



返回所有数据

此时,从查询结果可以发现,是按照雇员的编号进行排序的,那么此时如果要对使用指定的列进行排序,则就必须使用 ORDER BY 语句,语法格式如下:


SELECT {DISTINCT} * | 具体的列 别名
FROM 表名称
{WHERE 条件(s)}
{ORDER BY 排序的字段 1,排序的字段 2 ASC|DESC} ASC 表示升序、DESC 表示降序


范例:要求按照工资由低到高排序


SELECT * FROM emp ORDER BY sal ;



排序后返回

之前是按照由低到高的顺序完成,是采用的升序的形式,现在要求使用降序的形式完成。实际上如果在排序的时候没有指定排序规则,则默认的排序规则是升序排列。


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 ;



两个条件排序
3. 单行函数

数据库系统中,每个数据库之间唯一不同的最大区别点就在与函数的支持上,使用函数可以完成一系列的操作功能。


单行函数语法:


function_name(column|expression,[arg1,arg2,...])


参数说明:
· function_name:函数名称
· column:数据库列名
· expression:字符串或计算表达式
· arg1,arg2:在函数中使用参数


单行函数分类:
· 字符函数:接受字符输入并且返回字符或数值
· 数值函数:接受数值输入并返回数值
· 日期函数:对
·日期型数据进行操作
· 转换函数:从一种数据类型转换为另一种数据类型
· 通用函数:NVL 函数、DECODE 函数


3.1 字符函数

字符函数是专门处理字符的,例如,可以将大写字符变为小 ,还能求出字符的长度。
范例:将小写字母变为大写字母


SELECT UPPER('smith') FROM DUAL ;



返回

范例:一般用户在查询一个人姓名的时候有可能考虑到这个人的姓名是大写字母存的还是小写字母保存的呢?
· 那么此时,为了方便用户的使用就可以使用 upper 函数完成。


SELECT * FROM emp WHERE ename=UPPER('Smith') ;



返回

还可以使用 lower()函数将一个字符串变为小写字母表示。


SELECT LOWER('HELLO WORLD') FROM dual ;



返回

还可以使用 initcap()函数将单词的第一个字母大写


SELECT INITCAP('HELLO WORLD') FROM dual ;



返回

范例;使用此函数将雇员表中的雇员姓名变为开头字母大写


SELECT INITCAP(ename) FROM emp ;



大写字母开头

字符串除了可以使用“||”连接之外,还可以使用 CONCAT()函数进行连接操作。


SELECT CONCAT('hello ','world') FROM DUAL ;



连接

此时已经完成了连接,但是此种方式肯定不如“||”好使。在字符函数中可以进行字符串的截取、求出字符串的长度、进行指定内容的替换
· 字符串截取:substr()
· 字符串长度:length()
· 内容替换:replace()


SELECT substr('hello',1,3) 截取字符串 ,
length('hello') 字符串长度 ,
replace('hello','l','x') 字符串替换
FROM DUAL ;



截取字符串

· Oracle 中 substr()函数的截取点是从 0 还是从 1 开始。
|- 从 0 或从 1 开始效果是一样的,因为 Oracle 比较智能。


范例:要求显示所有雇员的姓名及姓名的后三个字符
· 因为雇员姓名的字符串长度不一样,所以只能求出整个的长度再减去 2,这样进行截取操作。


SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp ;



截取

此时,功能已经实现了,但是操作比较麻烦。实际上在 substr()函数中提供了一种非常方便的机制,可以采用倒着截取的方式,只要输入的位置是负数就表示倒着进行。


SELECT ename,SUBSTR(ename,-3,3) FROM emp ;


3.2 数值函数

数值函数只要是包含以下几种:
· 四舍五入:ROUND()
· 截断小数位:TRUNC()
· 取余(取模):MOD


范例:执行四舍五入操作


SELECT ROUND(789.536) FROM dual ;



四舍五入

当然,在 ROUND()函数中也可以指定四舍五入的位数
范例:保留两位小数


SELECT ROUND(789.536,2) FROM dual ;



保留两位小数

在使用 ROUND()函数中还有一点非常有意思,可以直接对整数进行四舍五入的进位。


SELECT ROUND(789.536,-2) FROM dual ;



back

TRUNC()与 ROUND()不同的是,在 TRUNC()操作中,不会保留任何的小数,而且小数点也不会执行四舍五入的操作。


范例:验证 TRUNC()函数


SELECT TRUNC(789.536) FROM DUAL ;



back

范例:通过 TRUNC()也可以指定小数点的保留位数


SELECT TRUNC(789.536,2) FROM DUAL ;



back

范例:使用负数表示位数


SELECT TRUNC(789.536,-2) FROM DUAL ;



back

范例:使用 MOD()函数可以进行取余的操作


SELECT MOD(10,3) FROM DUAL ;



back

喜欢的朋友可以点一点关注。




第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台