由于本人对于plSQL理解有限,如果在文章中出现什么什么漏洞,或者问题欢迎大家指出。
(1) 基本语法
select 目标列 (別名) from 表名 (別名)
多列select:
select username 姓名 ,nickname 昵称 from s_customer
多行select:
select * from s_customer
在语句中能够进行一系列的操作,如字符串的链接,基础的算数运算(这个点等到分组的时候再进行概括)等
字符串的链接
select username || ’ is ’ || id “person’s id” from person where username = ‘tom’
person’s id |
---|
tom is 5 |
(2) 多表链接
————————表person————————
username | nickname | id |
---|---|---|
tom | to | 5 |
kitty | ki | 12 |
ninic | ni | 23 |
————————表school————————
school | school_id |
---|---|
primary school | 5 |
middle school | 12 |
high school | 20 |
* 交叉链接(也称为笛卡儿积链接)
select a.* , b.* from person a inner join school b on a.id=b.school_id
或者
select a.* , b.* from person a , school b where a.id=b.school_id
(经过筛选后的链接)链接结果为
username | nickname | id | school | school_id |
---|---|---|---|---|
tom | to | 5 | primary school | 5 |
kitty | ki | 12 | middle school | 12 |
* 左外链接
select a.* , b.* from person a left outer join school b on a.id = b.school_id
链接结果为
username | nickname | id | school | school_id |
---|---|---|---|---|
tom | to | 5 | primary school | 5 |
kitty | ki | 12 | middle school | 12 |
ninic | ni | 23 |
* 右外链接
select a.* , b.* from person a right outer join school b on a.id = b.school_id
链接结果为
username | nickname | id | school | school_id |
---|---|---|---|---|
tom | to | 5 | primary school | 5 |
kitty | ki | 12 | middle school | 12 |
high school | 20 |
*全外链接
select a.* , b.* from person a full outer join school b on a.id=b.school_id
username | nickname | id | school | school_id |
---|---|---|---|---|
tom | to | 5 | primary school | 5 |
kitty | ki | 12 | middle school | 12 |
ninic | ni | 23 | ||
high school | 20 |
*内链接
select
a.username a_username, a.nickname a_nickname,
b.username b_username , b.id b_id
from person a inner join person b
on a.username = b.username
链接结果为
a_username | a_nickname | b_username | b_id |
---|---|---|---|
tom | to | tom | 5 |
kitty | ki | kitty | 12 |
ninic | ni | ninic | 23 |
基本语法
select 列名 from 表名 where 限制条件
举例:选取person表中的id为5的username,nickname
select username , nickname from person where id = 5;
1)限制条件——逻辑范围
常用的有 > , < , = , <= ,>= , <>(不等于) ,between … and … , in(a,b,c),like(模糊查询,可使用统配符%),is null (注意不能使用 = null)
主要需要注意的like的使用
* %表示代替 0 个或 多 个字符
* _ 表示 1 个字符
* 当需要表示含有字符 % 时,需要使用标识转移字符 escape
* select * from table where name like '%\%%' escape ''
举例:在person表中查找username中含有o,开头为k,第二个字母为i的人员的所有信息
select * from person username like ‘%o%’
select * from person username like ‘k%’
select * from person username like ‘_i%’
2)限制条件——逻辑判断
常用的有 AND , OR , NOT
* AND 表示返回的结果几个条件全需要满足
* OR 表示返回的结果满足条件中的其中一个即可
* NOT 表示返回的结果不能包含目标条件
基本语法
select 列名 form 表名 where 限制条件 order by 排序条件
举例:请将person表中的所有数据根据进行排序
select * from person order by id desc;
敏感的数据库我们就要用敏感的方式去对待他,滑稽
(1)相关操作函数
1)字符串函数
* TRIM()/LTRIM()/RTIRM():去空格。只能去掉头和尾的空格,中间的不理。
trim('heoArefdou')-->heoArefdou
* CONCAT:合成。双竖线只能在select语句里面用,这个可用于任何语句。
Concat('Good','String')-->GoodString
* SUBSTR:截取。
Substr('String',1,3)-->Str
第一个数字“1”,表示从第几个开始截取;
若要从倒数第几个开始,用负数,如“-2”表示倒数第2个。
上式中第2个数字“3”表示截取多少个。
* LENGTH:统计长度。
Length('String')-->6
* NVL:转换空值,上面已有
* INSTR : 计算当前字符在字符串中所处的位
Instr('HelloWorld', 'W') ----> 6
* LPAD:表示10位数,不足的使用 * 补足 ,数字在后
LPAD (salary,10,'*') ----> *****24000
* RPAD:表示10位数,不足的使用 * 补足 ,数字在前
RPAD (salary, 10, '*') ----> 24000*****
* TRIM : 还有将指定字符从字符串中删除的功能
TRIM('H' FROM 'HelloWorld') ----> elloWorld
* ---------------------------------------------------
* NVL(ex1,ex2) : 如果 ex1 为空,则返回 ex2 ;ex1 不为空,则返回ex1
* NVL2(ex1,ex2,ex3) : 如果 ex1 为空 ,则返回 ex3 ; ex1不为空 ,则返回 ex2
* NULLIF(ex1,ex2) : 如果 ex1 = ex2 则返回 null ,否则返回 ex1,ex1 不能为空
* COALESCE(ex1,ex2,ex3,....) : 如果 ex1 不为空,则返回 ex1 否则返回 NULL,否则直到找到一个值不为空,返回该值,若全为空则返回 NULL
2)大小写函数
* LOWER:转小写
lower('SQLCourse')-->sqlcourse
* UPPER:转大写
upper('SQLCourse')--->SQLCOURSE
*INITCAP:首字母转大写,其余转小写
initcap('SQLCourse')-->SqlCourse
3)数字操作函数
* Round : 用于四舍五入的进位操作
Round(10.2126,3) -----> 10.213
* Trunc :用于数字的截取操作
Trunc(10.2126, 3) -----> 10.212
* Mod : 用于数字的求余运算
Mod (1600,300) -----> 100
4)日期操作函数
* MONTHS_BETWEEN :计算两个月份之间月份间隔,可使用Tranc或Round进行截断
Months_Between('01-SEP-95','11-JAN-94')--->19.6774194
* ADD_MONTHS : 计算当前月份加上指定月份后所得的日期
Add_Months('11-JAN-94',6)---> 11-Jul-94
* NEXT_DAY : 计算当前日期的下个指定礼拜
Next_Day('01-SEP-95','FRIDAY') ---> 8-Sep-95
NEXT_DAY ('01-SEP-95',1) ---> 3-Sep-95
NEXT_DAY (to_date('1995-09-01','YYYY-MM-DD'),1) ---> 3-Sep-95
* LAST_DAY: 计算当前月份的最后一天
Last_Day('01-FEB-95') ---> 28-Feb-95
* ROUND : 按照月份进行四舍五入,一般在15号之后则进至下个月,之前的则仍留在本月;按年进行四舍五入则,在6月后的进至下个月,6月及之前的仍留在本年
Round('25-JUL-95','MONTH') ---> 1-Aug-95
ROUND('25-JUL-95' ,'YEAR') ---> 1-Jan-96
* TRUNC: 对当前月份进行截断
Trunc('25-JUL-95' ,'MONTH') ---> 1-Jul-95
*TRUNC: 对当前的年份进行截断
Trunc('25-JUL-95','YEAR') ---> 1-Jan-95
<1> 在语句外进行对sql全局变量的修改使用以下语句(语句内要修改文件类型则是使用类型转换)
alter session set () = ‘()’
例如更改当前系统日期格式
alter session set NLS_DATE_FORMAT = ‘DD-MON-RR’
<2>对日期进行数据运算以 1 为一天,1/24 为一小时进行加减乘除
5)数据类型的转换
* YYYY 4位数字表示的年份
* YEAR 英文描述的年份
* MM 2位数字表示的月份
* MONTH 英文描述的月份
* MON 三个字母的英文描述月份简称
* DD 2位数字表示的日期
* DAY 英文描述的星期几
* DY 三个字母的英文描述的星期几简
* HH24:MI:SS AM 时分秒的格式化
* DDspth 英文描述的月中第几天
* fm 格式化关键字,可选
举例:
select username , to_char(hire_date, ’ fmDD “is of ” MONTH YYYY’) hire_date from person
注意:
日期格式转换还存在着 YY 与 RR 这两种年份日期格式,要注意这两种格式的区别:
* 9 表示一个数字
* 0 强制显示0
* $ 放一个美元占位符
* L 使用浮点本地币种符号
* . 显示一个小数点占位符
* , 显示一个千分位占位符
举例:
select to_char(money , ‘$999.999.00’) salary from person
6)条件表达式
CASE语句语法及举例
语法
select username
case 条件列
when ‘条件列的条件’ then 所期望改变的目标数据
….
else 所期望改变的目标数据 “别名”
from employee ;举例
select username ,salary
case id
when ‘1’ then salary * 1.1
when ‘2’ then salary * 1.2
else salary * 1.3 “new_salary”
from employee ;
DECODE语句语法及举例
语法
select username
decode (条件列
‘条件列的条件’ 所期望改变的目标数据 ,
….
所期望改变的目标数据) 别名
from employee ;举例
select username , salary
decode ( id
‘1’ salary * 1.1,
‘2’ salary * 1.2,
‘salary * 1.3) new_salary
from employee ;