Oracle数据库,SQL查询学习心得

数据库(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之间的子查询,子查询的结果只能是单行单列原始排序。

⑤分页sql

伪列: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 语句

语法:

        case

           when 条件表达式1 then

             

           when 条件表达式2 then

             值

           when 条件表达式3 then

             值

             ...

           else

             默认值

        end

语义:如果表达式成立,那么整个语句值为表达式then后面的值,如果所有表达式不成立,会取else后的默认值,else语句可以省略。

你可能感兴趣的:(oracle,数据库)