table:表格,由行和列组成,列又称字段,每一行内容为表格的一条完整的数据。
view: 视图,一张表或者多张表的部分或者完整的映射,好比表格照镜子,镜子里面的虚像就是view
sequence:序列
index:索引,提高数据的访问效率
synonym:同义,方便对象的操作
program unit:程序单元,pl/sql操作的对象
以下例子都会用到两张表 s_emp:员工表 s_dept: 部门表
语法:
select [distinct] *{col_name1,col_name2,…}
from tb_name;
注意:语法中出现的中括号[],表示该部分可有可无
* :表示所有列,在企业用语中不出现,因为效率低下且可读性差
col_name1:列名,将需要查阅的数据字段列举出来,可以查看多列值,列名之间用,进行分割即可
tb_name: 表名,要查询哪个表
例:查看s_dept表中的所有记录的id和name
select id,name from s_dept;
例:查看每个员工的员工id,名字和月薪涨100以后的年薪
select id,last_name,(salary+100)*12 from s_emp;
例: 查看员工的员工id,名字和年薪,年薪列名为annual
select id,last_name,salary as annual from s_emp;
语法:nvl()函数
select nvl(col_name,change_value) from tb_name;
例: 查看所有员工的员工id,名字和提成,如果提成为空,显示成0
select id,last_name,nvl(commission_pct,0) commission_pct from s_emp;
语法:
select distinct col_name,col_name…from tb_name;
注意1:distinct关键词只能放在select关键词后面
例: 查看所有员工的职位名称和部门id,同职位同部门的只显示一次
select distinct title,dept_id from s_emp;
1.排序:所谓排序,就是根据某个字段的值按照升序或者降序的情况将记录查询出来
语法:
select col_name,…from tb_name order by col_name [asc|desc],…
注意:1.排序使用order by字句,该子句只对查询记录显示调整,并不改变查询结果,所以执行权最低,即最后执行。
2.排序关键词:
asc:升序(默认,默认的意思是不加关键词的时候默认为生序排序)
desc:降序
3.如果有多个列排序,后面的列排序的前提是前面的列排好序以后有重复(相同)的值。
例:test表
id | id2 |
---|---|
1 | 2 |
2 | 3 |
3 | 4 |
4 | 1 |
4 | 2 |
语句:
select id,id2 from test order by id,id2 desc;
结果:
id | id2 |
---|---|
1 | 2 |
2 | 3 |
3 | 4 |
4 | 2 |
4 | 1 |
注意:先排第一列,如果第一列有重复的值再排第二列,以此类推
需求:查看员工的id,名字和薪资,按照薪资的降序排序显示。
4.order by 后面还可以跟数字,表示使用select后面的第几个列进行排序
例: //使用last_name列进行排序
select last_name,salary from s_emp order by 1;
语法:
select col_name,… from tb_name
where col_name 比较操作表达式 逻辑操作符 col_name 比较操作表达式
注意:
例: 查看名字为Ngao或者Smith的员工信息
select id,last_name,salary
from s_emp
where last_name in ('Ngao','Smith');
例:查看员工名字以C字母开头的员工的id,工资。
like:模糊查询,即值不是精确的值的时候使用
通配符,即可以代替任何内容的符号
% :通配0到多个字符
_ : 当且仅当通配一个字符
转义字符: 默认为,可以指定 指定的时候用escape 符号指明即可,转义字符只能转义后面的一个字符
select id,last_name,salary
from s_emp
where last_name like 'C%';
例:查看员工部门id为41且职位名称为Stock Clerk(存库管理员)的员工id和名字
select id,last_name,dept_id,title
from s_emp
where dept_id = 41 and title = 'Stock Clerk';
例: 查看员工提成不为空的员工信息
select id,last_name,commission_pct
from s_emp
where commission_pct is not null;
例:查看员工名字不是以C字母开头的员工信息。
select id,last_name,salary
from s_emp
where last_name not like 'C%';
多表查询,又称表联合查询,即一条sql语句涉及到的表有多张,数据通过特定的连接进行联合显示.
笛卡尔积 : 在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X × Y.
假设集合A={a,b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1),(b, 2)}。
在数据库中,如果直接查询俩张表,那么其查询结果就会产生笛卡尔积
连接查询
为了在多表查询中避免笛卡尔积的产生,我们可以使用连接查询来解决这个问题.
连接查询分为:
1)等值连接
利用一张表中某列的值和另一张表中某列的值相等的关系,把俩张表连接起来。
例: 查询员工的名字、部门编号、部门名字
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id;
2)不等值连接
假设数据库中还有一张工资等级表:salgrade
工资等级表salgrade:
gradeName列表示等级名称
losal 列表示这个级别的最低工资数
hisal 列表示这个级别的最高工资数
表中的数据类似于下面内容:
id salgrade losal hisal
1 初级程序员 2000 4000
2 中级程序员 4000 6000
例:查询出员工的名字、职位、工资、工资等级名称
SELECT e.last_name, e.title, e.salray, s.gradeName
FROM s_emp e, salgrade s
WHERE e.salray BETWEEN s.losal AND s.hisal
3)左外连接
例:查询所有员工 以及对应的部门的名字,没有部门的员工也要显示出来
select last_name,dept_id,name
from s_emp,s_dept
where s_emp.dept_id=s_dept.id(+);
或者 俩者是等价的
select last_name,dept_id,name
from s_emp left outer join s_dept
on s_emp.dept_id=s_dept.id;
注意:outer可以省去不写
4)右外连接
例:查询所有员工 以及对应的部门的名字,没有任何员工的部门也要显示出来
select last_name,dept_id,name
from s_emp right outer join s_dept
on s_emp.dept_id=s_dept.id;
5)全连接
例: 查询所有员工 以及对应的部门的名字,没有任何员工的部门也要显示出来,没有部门的员工也要显示出来
select last_name,dept_id,name
from s_emp full outer join s_dept
on s_emp.dept_id=s_dept.id;
6)自连接:一张表,自己和自己连接
例: 查询每个员工的名字以及员工对应的管理者的名字
select s1.last_name,s2.last_name manager_name
from s_emp s1,s_emp s2
where s1.manager_id = s2.id;
本文地址:https://blog.csdn.net/weixin_43977265/article/details/107288091
如对本文有疑问, 点击进行留言回复!!
Navicate 如何导出数据库中的存储过程、事件、视图等?
每日一记:Oracle升级2020年4月份的数据库补丁Database Patch Set Update : 11.2.0.4.200414 (30670774)
Oracle 19.3 dataguard for Redhat 7.6
网友评论