SQL全称结构化查询语句,是一种在关系型数据库中定义和操作数据的标准语言。
注意:Oracle和Mysql虽然都使用标准sql语法,但具体细节有较大差异。本文以Oracle语句为例

SQL语句的特点

集合性:

所有SQL语句都接受集合作为输入,并且返回集合作为输出。SQL语句的集合特性容许一条SQL语句的结构作为另一条SQL语句的输入。

统一性:

SQL语言具有统一的语法格式。

易于移植:

在所有支持sql语法的数据库,可以很方便的移植。

数据库操作

数据库的操作任务通常包括以下几个方面
A,数据查询
B,插入、修改、删除记录
C,建立、修改、删除数据对象
D,控制对数据和数据对象的读写
E,保证数据库一致性和完整性

SQL语句的分类

数据查询语言(DQL)

用于检索数据库中的数据,主要是select语句。

数据操纵语言(DML)

用于修改数据库中的数据,主要包括insert、update、delete语句。
Oracle有merge语句用于更新插入(根据条件查找成功更新,查找失败则插入)。

事务控制语言(TCL)

用户维护数据的一致性,包括commit、rollback、savepoint语句。

数据定义语言(DDL)

用于建立、修改和删除数据库对象,例如create table、alter table、drop table等。

数据控制语言(DCL)

用于执行权限授予和收回操作,主要包括grant、revoke语句。

SQL语句书写

SQL关键字不区分大小写。
对象名和列名不区分大小写。
字符值区分大小写。
SQL语句输入完毕,以‘;’作为结束符。

检索数据

简单查询
检索所有列

select * from tablename;

检索指定列

select column1,column2 from tablename;

筛选查询

为查询语句设置where条件,只有满足where条件的纪录才能在结果中显示。

比较筛选

筛选条件(包含但不限于):a=b;a!=b;a>b;a<b;a>=b;a<=b;a=any(b);a<>all(b)
Select * from tablename where 1=2;
在进行比较筛选的过程中,字符串和日期格式的值必须使用单引号标识,否则Oracle会提示‘标识符无效’

特殊关键字筛选

筛选条件(包含但不限于):in;like;null;between;exists
Select * from tablename where column1 in (); --not in
Select * from tablename where column1 like ‘char%’;
下划线’
-'代表一个任意字符,‘%’代表任意数量字符。
Select * from tablename where column1 is null;-- not null
Select * from tablename where column1 between a and b;–not between and

逻辑筛选

筛选条件(包含但不限于):and;or;not;!
Select * from tablename where column1 = condition1 and column2=condition2;

分组查询

数据分组的目的是用来汇总数据或者为整个分组显示单行的汇总信息。
在select语句中,可以使用group by子句实现对检索结果的分组,该语句位于from子句之后。
Select colomn1,200,null,count(0) from tablename where colomn1>1 group by colomn1;
Group by子句可以基于指定的列的值将数据集合划分为多个分组,同一个分组内所有记录在分组属性上相同。
Group by常与聚合函数一同使用,当select子句包含聚合函数时,则计算每组的聚合值,当用户指定group by时,选择列表中任一非聚合表达式的列都应包含在group by列表中,或者group by表达式必须和选择列表表达式完全匹配。
可以用having子句对group by的子句进行再次筛选,having子句中可以包含聚合函数。
Select colomn1,count() from tablename where colomn1>1 group by colomn1 having count()>2;

排序查询

在select语句中,可以使用order by子句对检索的结果进行排序,该语句位于from子句之后。
Asc表示正序排序,desc表示倒序排序,如果不指定排序方式默认为asc升序。
Select colomn1,count(0) from tablename where colomn1>1 group by colomn1 having count(0)>2 order by colomn1 desc;
Order by 子句可以根据查询结果中的一个或多个列进行排序,并且第一个排序项为主要的排序依据,其他依次为次要的排序依据。
可以通过nulls first(空值最前显示)或者nulls last(空值最后显示)指定空值的展示。
Select colomn1,count(0) from tablename where colomn1>1 group by colomn1 having count(0)>2 order by colomn1 desc nulls first;

多表关联查询
表别名

在多表关联查询时,如果多个表之间存在同名的列,则必须使用表名来限定列的引用。
一旦在from子句中为表指定了别名,则在剩余的子句中不允许再使用原来的表名。
Select a.colomn1,b.colomn1 from table1 a,table2 b where b.colomn2=a.colomn2;

内连接

使用关键字inner join来实现,可以省略inner关键字。
Select a.colomn1,b.colomn1 from table1 a inner join table2 b on b.colomn2=a.colomn2;
也可以直接写成
Select a.colomn1,b.colomn1 from table1 a,table2 b where b.colomn2=a.colomn2;
在内连接的检索结果中,所有记录都是满足连接条件的,检索结构是表的交集。

左连接

Left outer join 左连接,outer关键字可以省略。
Select a.colomn1,b.colomn1 from table1 a left outer join table2 b on b.colomn2=a.colomn2;
检索记录的结果为a的全集和b中与a相交的子集。

右连接

Right outer join 右连接,outer关键字可以省略。
Select a.colomn1,b.colomn1 from table1 a right outer join table2 b on b.colomn2=a.colomn2;
检索记录的结果为b的全集和a中与b相交的子集。

全连接

Full outer join 全连接,outer关键字可以省略。
Select a.colomn1,b.colomn1 from table1 a full outer join table2 b on b.colomn2=a.colomn2;
检索记录的结果为b和a的合集。
在执行全连接时,Oracle会执行一个完整的左连接和右连接查询,然后将查询结果合并,并消除重复的记录行。

自然连接

使用关键字natural join来实现。
Select a.colomn1,b.colomn1 from table1 a full natural join table2 b where a.column1=condition1;
在检索多个表时,Oracle会将第一个表中的列和第二个表中具有相同名称的列进行自动连接。
在自然连接中,用户不需要明确指定进行连接的列,这个任务由Oracle自动完成。
自然连接强制要求表之间必须具有相同的列名称。

自连接

‘自引用式’外键是指表中的一个列可以是该表主键的一个外键,通常在分级数据表上使用。
Select a.colomn1 ,b.colomn1 from table1 a left join talbe1 b on a.colomn2=b.colomn1;

交叉连接

交叉连接就是不需要任何连接条件的连接,使用cross join关键字实现。
Select * from table1 cross join table2;
交叉连接执行的结果为笛卡尔积,这种查询结果是十分冗余的,可以通过where子句过滤记录。

子查询

在SQL语句内的另外一条select子句,也被称为内查询或者是内select语句。在dql和dml语句中允许是一个表达式的地方都可以使用子查询,子查询甚至可以含在另一个子查询中。
子查询效率低于多表关联查询。
在使用子查询时还要注意以下规则:
1, 子查询必须用()括起来
2,子查询中不能包括order by 语句
3,子查询嵌套不能超过255层

单行子查询:返回一个值的子查询语句,可以使用单号比较运算符
多行子查询:返回多个值的子查询语句,必须使用多行运算符in、any、all
关联子查询:外查询不仅使用内查询的结果时,内查询和外查询相互影响的子查询为关联子查询。
select s.* from source_custom_fjxt s where s.salesum>(select avg(salesum) from source_custom_fjxt d where customtype=s.customtype );

常用函数
字符类函数

Dual表是Oracle系统内部提供的一个用于实现临时数据计算的特殊表。
Ascll(c)返回字符c的ascll码。
Chr(i)返回ascll码i的字符。
Concat(s1,s2)将字符串s1连接到s2的后面,可以直接使用’||'将字符串连接起来。
Initcap(s)将字符串s的每个单词首字母大写,其他字母小写。单词之间用空格、控制字符、标点符号区分。
Instr(s1,s2[,i][,j])返回从字符串s1的第i位起字符串s2出现第j次的位置。i为负数表示从右往左进行比对,但返回的位置依旧是从左开始。当没有发现字符串s2,返回0.
Length(s)返回字符串s的长度。
Lower(s)返回字符串的小写形式。
Upper(s)返回字符串的大写形式。
Ltrim(s1,s2) 删除字符串s1左边的字符串s2.
Rtrim(s1,s2)删除字符串s1右边的字符串s2.
trim(s1,s2)删除字符串s1两边的字符串s2.
_Trim函数函数若不指定s2,则表示删除相应方位的空格。
Replace(s1,s2[,s3])使用字符串s3替换出现在s1中的字符串s2。如果s3为null,表示移除s1中的s2字符串。
Substr(s,i[,j])从字符串s的i位起截取长度为j的子串。如果省略参数j,则直接截取到尾部。I,j均为正整数。
更多字符函数

数字类函数

Abs(n)返回数字n的绝对值
Ceil(n)返回大于等于数字n的最小整数
Cos(n)返回弧度n的余弦值
Exp(n)返回e的n次幂
Floor(n)返回小于等于数字n的最大整数
Log(n1,n2)返回以n1为底n2的对数
Mod(n1,n2)返回n1除以n2的余数
Power(n1,n2)返回n1的n2次方
Round(n,m)返回数字n舍掉小数点右边m位的值。如果m为负数则舍掉小数点左边相应位置。m必须为整数。
Sign(n)返回数字n的符号,正数返回1,负数返回-1,若n=0,返回0
Sin(n)返回弧度n的正弦值
Sqrt(n)返回正数n的平方根
Trunc(n,m)截取到m位的值。

日期、时间类函数

Add_months(d,i) 返回日期d加上整数i个月后的日期
Last_day(d) 返回日期d所在月份的最后一天
Months_between(d1,d2) 返回日期d1和d2之间的月份。d1>d2为正数,d1<d2为负数,d1=d2为0
Sysdate返回系统当前日期
更多日期函数

转换类函数

To_char(x[,format])将表达式x按format格式转换成字符串
To_date(x[,format])将字符串s按format格式转换成日期
Select to_date(‘20180301’,’yyyymmdd’) from dual;
转换时Oracle系统会自动判断日期的有效性
To_number(s[,format])返回字符串s代表的数字

聚合类函数

Avg()返回选择列表表达式的平均值
Count()返回查询结果的记录数
Max()返回选择列表表达式的最大值
Min()返回选择列表表达式的最小值
Sum()返回选择列表表达式的和
Variance()返回选择列表表达式的统计方差
Stddev()返回选择列表表达式的标准方差

数据库操作

插入数据(insert语句)
单条插入

Insert into table1(column1,column2) values(value1,value2);

批量插入

insert into table1 (column1,column2) select column1,column2 from table2;
Table1可以指定全部列也可以指定部分列,但属性为not null的列必须指定。
当table1和table2、values列属性一一对应时可以不指定table1的列。

更新数据(update语句)

Update table1 set column1=value1 where column2=condition1;
Update语句可以使用select子查询,但子查询的返回值必须是单一的值。
Update table1 set column1=(select sysdate from dual)where column2=condition1;

插入更新(merge)

merge into table1 a
using (select column1, column2, column3 from table2) b
on (a.column1 = b.column1 and a.column2 = b.column2)
when matched then
update set a.column3 = b.column3
when not matched then
insert
(a.column1, a.column2, a.column3)
values
(b.column1, b.column2, b.column3)
使用table2的查询结果更新table1的内容,如果查询成功更新相关列column2,否则插入相关记录。

删除数据(delete和truncate语句)

Delete语言用来删除指定范围或者全部的记录
Delete from table1 where 1=1;
Truncate 语句用来删除全表数据
Truncate table table1;
Delete语句删除数据时会产生回滚记录,可以使用rollback语句撤销删除。删除数据后需要使用commit语句提交。
Truncate语句删除数据时不会产生回滚记录,效率较delete语句高。