数据库(database、db)指的是长期存在计算机内、有组织、可共享的、大量数据的集合。数据是按照特定的数据模型来组织、存储在数据库中的。
关系型数据库:它是将数据以关联关系或者二维表的形式存储的数据库。如 oracle、mysql、db2、sql server、等; 非关系型数据库:一般是以键值对方式存储数据的数据库。如 redis、hadoop(hbase) 等
Oracle Database,又名Oracle RDBMS,或简称Oracle。Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。
SQL 是 Structured Query Language(结构化查询语言)的首字母缩写词,SQL 是数据库语言,通过 SQL可以实现与 Oracle 服务器的通信。可以执行CRUD等操作。
注:CRUD是指增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)
SQL分类:
DDL(Data Definition Language):数据定义语言,用来定义表、列等;如:创建数据表...
DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);如:添加数据,修改数据,删除数据
DQL(Data Query Language):数据查询语言,用来查询记录(数据)。如:查询数据
DTL (Data Transaction Language):数据事务语言,用来操作事务。 如:开启事务,提交事务
DCL (Data Control Language):数据控制语言。用来操作用户和权限。如:创建用户,授权。
select 列名,列名,... from 表名
1、最基础的查询语法关键字:select.....from ;
2、select后面跟是你要从数据库里取的数据;from后面跟表名,表示你要从哪张中读取这些数据
注意:如果要查询表中所有列的信息,那么select和from之间的列名可以用 * 来表示,注意:* 号的执行效率比写列名时的执行效率低,(* 在执行sql语句时,oracle会去查数据库中的数据字典,查询这个张表都有哪些列,然后查出这张表的所有列的数据)
3、 注解
单行注释:--
多行注释:以/* 开始,以*/结尾
4、别名
语法:
对象名 as 别名
对象名 别名
注意:给表和视图取别名时不能加 as
5、带条件查询
where 条件:
select 列名,列名,...,列名 from 表名 where 条件表达式;
条件表达式跟表中的列名相关。条件表达式:>;<;>=;<=;!=,<>(表示不等于);=;
说明:在oracle数据库中,数字类型直接写就可以,字符串类型的数据要用单引号括起来。
in:后面跟一个集合或者子查询;(必须满足数据集合里的所有数据)
not in:和in是相反的
like:它只用在字符串列,表示对字符串进行模糊匹配
not like:和like相反
有两个点位符:
%:表示在这个%出现的地方可以有0个或者多个字符
_: 表示在_出现的地方有且只能一个任意字符
like中的转义字符:\
在新版的oracle中,使用转义字符需要手动去定义 定义 escape '\';转义字符,它会把紧跟在它后面的字符当作一个普通的字符去处理
exists:它不和任何列一起使用,后面跟的是一个子查询(查询语句select语句),如果子查询能查出结果,那么这个条件就是成立的,查不出结果条件不成立
not exists:和exists相反
条件连接符:
and:表示并且,and两边同时成立时,总条件才算成立,只要有一个条件不成立,整体不成立
or:表示或者,两个条件有一个条件成立,整体条件成立,只有两个条件都不成立时,整体才不成立
between value1 and value2:value1的值比value2值小,value1和value2一般是数字类型,还可以是日期,表示值在value1和value2之间,它的取值是包含value1和value2的。(>=value1;<=value2);
is null:表示这个值是空时条件成立
is not null:表示值不为空间条件成立
dual表:它是oracle内置的一个单行的临时表。
1、排序
order by
语法:
select 列名,列名,..,列名
from 表名
where 条件表达式
order by 排序列的列名 asc|desc;
asc|desc: asc表示升序,desc表示降序
order by 后面可以跟多个排序列,跟多个排序列时。含义:按照第一排序列(紧跟前order by 关键字的列)排序,如果第一个排序字段的值相同时,它会按照第二个排序字段进行排序。
2、聚合函数
聚合函数:对一组值执行计算,并返回单个值
count(列名|*|常数):它求记录数(统计数据条数)
max(列名):取最大值
min(列名):取最小值
avg(列名):取平均值
sum(列名):求和
distinct:去重关键字,跟在列的最前面。
注意:distinct后面跟多个列时,判断重复数据,所有列的值完全相同时,它才会认为是重复数据
3、分组
group by
语法:
select 列名,列名,...,列名 from 表名
where 条件
group by 分组列
order by 排序列 asc|desc;
group by:分组的关键字,后面跟分组列名,可以是一个分组列,也可以是多个列。
注意:group by 后面跟多个列时,只有当多个列的值同时相等时,它才会分为同一个组;
4、having
语法:
select col_name,col_name,...,col_name
from 表名
where 条件
group by 分组列
having 条件
order by 排序列;
having:它是对分组后的数据进行筛选,条件表达式中可以使用聚合函数。
where和having的异同
where:条件,where后面跟的条件比having后的条件先执行,条件中不允许使用聚合函数。
having:条件中可以使用聚合函数,一般having和group by联用。
1、集合:每一个sql查询的结果就是一个集合
并集:取两个集合中所有元素
union all:表示取两个集合的并集,不删除重复元素
union :取两个集合的并集,删除重复的元素
交集:取两个集合重叠部分的元素
intersect:表示交集
差集:第一个集合的所有元素减去两个集合重叠部分的元素
Minus:表示差集
注:集合运算,关键字前后的两个sql表示的结果集要完全相同。
2、联合查询
联合查询共有八个,分别为:交叉连接(笛卡尔积连接)、内连接、自连接、外连接(全连接、左外连接、右外连接)、自然连接。
(1)交叉连接(笛卡尔积连接)
将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积.
语法:
select 列名,列名,...
from a表 cross join b表;
(2)内连接
内连接:是把两个表中符合条件的数据连接为一条数据,如果哪个表中存在不符合连接条件的数据,那么这些数据就会被过滤掉(不显示)
语法:
select 列名,...,列名
from a表 inner join b表 on 连接条件
inner join:中的inner可以省略不写。
(3)自连接
自连接是一个特殊的内连接,内连接一般是两个表的连接,自连接将一个表和它自已进行连接
(4)不等连接
不等连接:连接条件是不等条件,(大于、小于、不等于)。
(5)全连接
全连接:它会查出两个表中的所有数据,
1.如果两个表中的数据都符合连接条件,那么它会和内连接一样,将符合条件的数据连接为一条记录
2.如果第一表中的一条数据,在第二张表中没有找到和它对应的记录(第二张表没有和第一张表这条数据符合连接条件), 那么它同样会显示第一张表的这条记录,同时它对应的第二张表数据的位置会显示为空
3.同理,如果第二张的一条记录,在第一张表中没有找到符合连接条件的数据,那么同样会显示,在显示第一张表数据的位置显示为空
语法:
select 列名,列名,列名,....
from 表A full outer join 表B on 连接条件;
full outer join :中的outer可以省略。
(6)左外连接
语义:查出左表(left outer join关键字前面的表(主表))的所有数据,根据连接条件去右表(副表)中找对应的数据,如果找到便显示出来,如果找不到就显示空。
语法:
select 列名,列名,...
from 表A left outer join 表B on 连接条件;
left outer join :中的outer可以省略。
(7)右外连接
语义:它会查出右表(主表)的所有数据,根据连接条件去左表(副表)查找对应的数据,如果找到就显示,如果找不到就显示为空
语法:
select 列名,列名,列名,...
from 左表 right outer join 右表 on 连接条件;
right outer join:其中outer可以省略。
(8)自然连接
自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件按的结果。
语法:
select col_name,col_name,...
from table_a natural join table_b;
select col_name,....
from table_a natural join table_b
using(关系列);
子查询指一个查询语句嵌套在另一个查询语句内部的查询。
1、from后面放子查询
2、where后面放子查询
(1)单行子查询
单行子查询:子查询的sql语句只查出一条记录。
(2)多行子查询
多行子查询:子查询的sql语句查出若干条记录。
3、exists、not exists
exists:后面跟子查询,如果子查询能查出数据,那么条件是真的,如果子查询查不出结果,条件不成立。
4、having 后面放子查询
5、select 和from 之间的子查询
注意:select 和from之间的子查询,子查询的结果只能是单行单列原始排序。
伪列:rownum 它是oracle数据库内置列,任何表都可以使用,它作用是显示表中数字的行号。
注意:如果给伪列加条件,小于一个值是可以,不能让它大于某个值。可以等于1。
使用rownum的分页sql,rownum伪列的序号,只连续的不考虑值相等的情况(值相同序号不相同)。
row_number():需要和over分析函数联用,排序的序号和rownum伪列相同,连续序号,不考虑值相等的情况(值相同序号不相同)。
dense_rank():可以用来做排序,它序号连续,考虑重复数据,如果值相等序号就相同。
rank():可以用来做排序,它序号不连续,考虑重复数据,如果值相等序号相同。
over(partition by 分组列 order by 排序列):over子句中的分组partition by和group by的分组不同,它不会把数据聚合成一条,在over子名中可以省略。
使用row_number(),rank(),dense_rank()的分页sql,只需要一层子查询。
语法:
case
when 条件表达式1 then
值
when 条件表达式2 then
值
when 条件表达式3 then
值
...
else
默认值
end
语义:如果表达式成立,那么整个语句值为表达式,then后面的值,如果所有表达式都不成立,会取else后的默认值,else语句可以省略。