Oracle数据库、简单查询、条件查询、排序

一、数据库

1.了解数据库

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库

2.DBMS

数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。

大部分DBMS 提供数据定义语言DDL(Data Definition Language)和数据操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。

根据存储模型可将数据库划分为关系型数据库非关系型数据库

当前主流的关系型数据库有Oracle、DB2、Microsoft SQL Server、MicrosoftAccess、MySQL 等。

3.SQL 语言介绍

1)什么是SQL

SQL(Structured Query Language):结构化查询语言

2)SQL通用语法

1. SQL 语句可以单行或多行书写,以分号结尾。
2. 可使用空格和缩进来增强语句的可读性。
3. 3 种注释
		* 单行注释: -- 注释内容 或 # 注释内容(mysql 特有) 
		* 多行注释: /* 注释 */

3)SQL分类

1) DDL(Data Definition Language)数据定义语言
		用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等
2) DML(Data Manipulation Language)数据操作语言
		用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等
3) DQL(Data Query Language)数据查询语言
		用来查询数据库中表的记录(数据)。关键字:select, where 等
4) DCL(Data Control Language)数据控制语言(了解)
		用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE 等

在这里插入图片描述

二、表(Table)

1.表的结构

表由表名、字段(名称+类型+约束)、记录组成。与java 相对应:
在这里插入图片描述

2.三范式

1NF:是指数据库表的每一列都是不可分割的基本数据项(一个字段就表示一个信息)

2NF:是指每一行数据都应该有一个唯一的标识,主键、主码。非主属性必须完全依赖主键

3NF: 将部分依赖的属性单独拆出去作为另外一张表存在,部分依赖的键作为新表的主键

外键,将别人的主键,存储在我的表中,作为外键存在.

三、SELECT

1.简单查询

  • SELECT * FROM 表名:查询某个表中所有的记录的所有字段信息
  • SELECT 列名 FROM 表名:查询某个表中所有的记录的指定字段信息
  • SELECT 列名1,列名2 FROM 表名:查询某个表中所有的记录的字段1 字段2
  • SELECT distinct 列名FROM 表名:去除重复记录
  • SELECT 表达式 FROM 表名:查询表达式
  • SELECT xxx as 别名FROM 表名表别名:使用别名

1)部分列

--查询雇员姓名
select ename from emp;
--查询部门表的deptno,dname, loc 字段的数据
select deptno,dname,loc from dept;
-- 查询所有的员工的名称和工资
select ename, sal from emp;
-- 查询所有的部门名称和地址
select dname,loc from dept;

2)所有列

--查询部门的所有信息
select * from dept;
--查询部门的所有信息(效率高)
select deptno,dname,loc from dept;
--查询工资等级表的所有信息
select * from salgrade;
select losal,grade,hisal from salgrade;

3)去除重复

--去重
select distinct deptno from emp;
select distinct ename, sal, deptno from emp;

4)别名

select ename as "雇员 姓名" from emp;
select ename "雇员姓名" from emp;
select ename 雇员姓名 from emp;
select ename as 雇员姓名 from emp;
select ename as " Ename" from emp;

-- 查询员工的姓名,工资,部门编号以我喜欢的名字显示
select ename as "xingming" , sal as "GongZi" , deptno as bumengbianhao from emp;
SELECT ENAME AS "姓名" , sal "工资" from emp  e;

注意:

  • as:字段别名可以使用 ,as:表别名不能使用as
  • “”:原样输出,可以存在空格与区分大小写

5)字符串

使用’ ’表示字符串(注意区分” ”) ,拼接使用||

-- 将名字和工种查询成一列拼接起来
select ename|| '-' ||job from emp;

6)伪列

不存在的列,构建虚拟的列

select distinct 35*35 as res  from emp;
select empno, 1*2 as count,'cmj' as name,deptno from emp;

7)虚表

用于计算表达式,显示单条记录的值

select 1+1 from dual;
select 'abc' from dual;
select 299+388 from dual;

8)null

null 遇到数字参与运算的结果为null,遇到字符串为空串

-- null
select 1+12+null from dual;
select '1'||'12'||null from dual;
--nvl(null,数字)表示如果是空就用后面的数字代替
select nvl(null,1) from dual;
select empno, ename, job, mgr, hiredate, sal, nvl(comm,0) ,deptno from emp;

2.条件查询

where 过滤行记录条件,条件有:

  • = 、>、<、>=、<=、!=、<>、between and
  • and 、or、not、union、union all、intersect 、minus
  • null:is null、is not null、not is null
  • like:模糊查询% _ escape(‘单个字符’)
  • in 、exists(难点) 及子查询m

1)比较条件

= 、>、<、>=、<=、!=、<>

--查询|获取哪些工资高于1000的员工信息
SELECT * FROM EMP WHERE SAL > 1000;
-- 查询20部门的员工信息
SELECT * FROM EMP WHERE DEPTNO = 20;
---- 查询不在20部门的员工信息
SELECT * FROM EMP WHERE DEPTNO != 20;
SELECT * FROM EMP WHERE DEPTNO <> 20;
-- 查询 月薪在 1300 到 4500之间的员工   信息
SELECT *
FROM EMP
 WHERE SAL + NVL(COMM, 0) > 1300
   AND SAL + NVL(COMM, 0) < 4500;
--查询 员工的年薪大于 20000 的 员工名称、岗位 年薪
SELECT ename, job, (sal + nvl(comm, 0)) * 12 "年薪"
  FROM EMP
 WHERE (sal + nvl(comm, 0)) * 12 > 20000;
--查询 员工的年薪大于 20000 的 员工名称、岗位 年薪
select *
  from (select ename, job, (sal+nvl(comm,0)) *12 incomm from emp) temp
 where incomm>20000;

2)且 或 非

and、or、not

--检索 工资在 2000, 3000之间 员工名称 岗位 工资
SELECT ENAME, JOB, SAL FROM EMP WHERE sal>=2000 and sal=<3000;
SELECT ENAME, JOB, SAL FROM EMP WHERE sal between 2975 and 3000;
--检索 工资为 2000, 3000 员工名称 岗位 工资
SELECT ENAME, JOB, SAL FROM EMP WHERE sal=2000 or sal=3000;

3)null

null不能使用条件判断,只能使用is :

--存在佣金的员工名称
SELECT ENAME, COMM FROM EMP WHERE COMM IS NOT NULL;
SELECT ENAME, COMM FROM EMP WHERE NOT COMM  IS NULL;
--不存在佣金的员工名称
SELECT ENAME, COMM FROM EMP WHERE COMM  IS NULL;

4)集合操作

Union、Union All、Intersect、Minus

  • Union,并集(去重) 对两个结果集进行并集操作,不包括重复行同时进行默认规则的排序
  • Union All,全集(不去重) 对两个结果集进行并集操作,包括重复行,不进行排序
  • Intersect,交集(找出重复) 对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序
  • Minus,差集(减去重复) 对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序
--查询工资大于1500 或含有佣金的人员姓名
--union 去除重复行
select ename from emp where sal>1500
union
select ename from emp where comm is not null;

--union all 不去除重复行
select ename from emp where sal>1500
union all
select ename from emp where comm is not null;

--查询显示不存在雇员的所有部门号
select deptno from dept
minus
select distinct deptno from emp

--查询工资大于1500 且含有佣金的人员姓名
select ename,sal,comm from emp where sal>1500
intersect
select ename,sal,comm from emp where comm is not null;

5)like :模糊查询

模糊查询,使用通配符:

  • %:零个及以上(任意个数的)的字符
  • _:一个字符
    遇到内容中包含% _ 使用escape(‘单个字符’)指定转义符
--查询员工姓名中包含字符 A 的员工信息
select * from emp where ename like '%A%';
-- 名称中第二个字符是L员工信息
select * from emp where ename like '_L%';
--查询员工姓名中包含字符_的员工名称 岗位 工资 部门编号
select ename, job, sal, deptno
  from emp
 where ename like '%c_%' escape('c');

6)获取所有行的记录

-- 获取所有的行记录
--1、不给条件
select * from emp;
--2、给上一个永远为true 表达式
select * from emp where 1 = 1;
--3、给上完全通配
select * from emp where ename like '%';

3.in ,exists 与排序

1)in 与exists

in相当于使用or的多个等值,定值集合,如果存在子查询,确保类型相同、字段数为1,如果记录多,效率不高,用于一些少量定值判断上:

-- 查询20部门和30部门的员工信息
select * from emp where deptno in (20, 30);
-- 查询在SALES 或者ACCOUNTING 部门工作的员工的信息
select deptno from dept where dname in ('SALES', 'ACCOUNTING');

select *
  from emp
 where deptno in
       (select deptno from dept where dname in ('SALES', 'ACCOUNTING'));

select *
  from emp
 where deptno = (select deptno from dept where dname = 'SALES')
    or deptno = (select deptno from dept where dname = 'ACCOUNTING');

exists条件为true,存在记录则返回结果,后续不再继续比较查询,与查询的字段无关,与记录有关:

-- 查询在SALES 或者ACCOUNTING 部门工作的员工的信息
select *
  from emp e
 where exists (select *
          from dept d
         where dname in ('SALES', 'ACCOUNTING')
           and e.deptno = d.deptno);
-- 查询不在SALES 也不在ACCOUNTING 部门工作的员工的信息
select *
  from emp e
 where exists (select *
          from dept d
         where not dname in ('SALES', 'ACCOUNTING')
           and e.deptno = d.deptno);

2)排序

使用ORDER BY 排序,排序不是真实改变存储结构的顺序,而是获取的集合的顺序。

  • 顺序:asc(默认)desc
  • 多字段:在前面字段相等时,使用后面的字段排序
  • 空排序:降序为desc,注意null 为最后
-- 查询员工信息,按照工资升序排序
select * from emp order by sal asc nulls last;
-- 查询员工信息,按照工资升序排序 如果工资相同 就按照奖金升序排序
select * from emp order by sal asc, comm desc;

--对部门编号为 20 或 30 的雇员,工资+佣金 进行升序排序,如果相同,则按姓名降序。
select empno, ename, sal + nvl(comm, 0)
  from emp
 where deptno in (20, 30)
 order by  ename desc;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值