04-SQL基础(表管理,约束,多表连接,子查询)

news2025/8/2 11:11:01

本文章主要内容

1、表的管理:创建表,修改表结构,删除字段,修改字段,添加字段,删除表,添加表约束;

2、数据管理:新增记录,修改记录,删除记录,查询数据;

3、查询数据:普通程序,条件查询,各种查询条件的灵活应用;

4、多表连接:内连接,左外连接,右外连接,完全连接,自然连接,交叉连接;

5、子查询;

目标

SQL 语言分类
  DDL
  DML
  DCL
  TCL
Oracle 中的数据类型
Oracle 数据定义语言
表完整性与约束
Oracle 操纵语言

SQL

SQL Structured Query Language (结构化查询语言)的首字母缩写词
SQL 是数据库语言,它可以对数据库中的数据进行查询、插入、更新和删除,并对数据库中的对象进行控制。
SQL 已经成为 RDBMS 的标准语言,最新标准是 ANSI-99 ,并支持面向对象的数据库。
关系型数据库系统对 SQL 也进行了一些扩展,使之成为过程性语言,如 oralce 中的 PL/SQL 与微软的 Transact-SQL

SQL分类

SQL 支持下列类别的命令:

 数据定义语言(DDL
数据操纵语言(DML
事务控制语言(TCL

        数据控制语言(DCL

 Oracle 数据类型

创建表时,必须为各个列指定数据类型
以下是 Oracle 数据类型的类别:

字符类型

CHAR

固定长度的字符串,列长度可以是 1 2000 个字节

VARCHAR2

支持可变长度字符串,大小在14000个字节范围

LONG

存储可变长度字符数据,最多能存储 2GB

数值类型

NUMBER

NUMBER [( p[, s])],存储整数、浮点数和实数,最高精度为 38

日期类型

DATE

存储日期和时间部分,精确到整个的秒

TIMESTAMP

存储日期、时间和时区信息,秒值精确到小数点后6

RAW

RAW

存储二进制数据,最多能存储 2000 字节

LONG RAW

存储可变长度的二进制数据,最多能存储 2 GB

大对象

LOB

LOB 类型可以存储 4GB内容,LOB 数据类型允许对数据进行高效、随机、分段的访问

CLOB

Character LOB,它能够存储大量字符数据

BLOB

Binary LOB(二进制 LOB),可以存储较大的二进制对象,如图形、视频剪辑和声音文件

BFILE

Binary File,用于将二进制数据存储在数据库外部的操作系统文件中

伪列

伪列就像一个表列,但是它并没有存储在表中,伪列可以从表中查询,但不能插入、更新和删除它们的值

ROWID

表中行的存储地址,可以使用 ROWID 伪列快速地定位表中的一行

ROWNUM

ROWNUM 是查询返回的结果集中行的序号,可以使用它来限制查询返回的行数

数据定义语言

数据定义语言用于改变数据库结构,包括创建、更改和删除数据库对象
用于操纵表结构的数据定义语言命令有:
  CREATE TABLE
  ALTER TABLE
  TRUNCATE TABLE
  DROP TABLE

数据定义语言举例

  创建表

CREATE TABLE DEPT ( 
  DEPTNO  NUMBER (2)    NOT NULL, 
  DNAME   VARCHAR2 (14), 
  LOC     VARCHAR2 (13), 
  PRIMARY KEY ( DEPTNO ) 
)

修改表

修改LOC字段
ALTER TABLE DEPT MODIFY LOC VARCHAR2(20);
添加字段
ALTER TABLE DEPT ADD MGR NUMBER(4);
添加约束
ALTER TABLE DEPT ADD CONSTRAINT FK_EMP
 FOREIGN KEY (MGR)  REFERENCES EMP (EMPNO)
删除字段
ALTER TABLE DEPT DROP COLUMN MGR;

删除表

DROP TABLE DEPT;

DML 利用现有的表创建表

语法
          CREATE TABLE <new_table_name> AS
          SELECT column_names FROM <old_table_name>;
SQL> CREATE TABLE NEWEMP
     AS SELECT * FROM EMP;


SQL> CREATE TABLE NEWEMP
     AS SELECT EMPNO, ENAME, SAL FROM EMP;

不复制原表数据到新表

SQL>CREATE TABLE NEWEMP
    AS SELECT EMPNO, ENAME, SAL FROM EMP WHERE 1 = 2;

表完整性与约束

完整性
  实体完整性
主键约束,保证数据唯一性
  域完整性
字段规则,如性别必须是男或女,年龄在 0-200
  参照完整性
外键约束 , 外键对应的记录必须存在

主键约束
  alter table DEPT add constraint pk_DEPT primary key(deptno);
外键约束
  alter table EMP add constraint fk_d_m foreign key(deptno) references DEPT(deptno);
Check 约束
  Alter table emp add constraint ck_emp_sex check(sex=‘男’ or sex=‘女’)
Unique唯一约束
Alter table emp add constraint uk_emp unique(fname,lname)

数据操纵语言

数据操纵语言用于检索、插入和修改数据
数据操纵语言是最常见的 SQL 命令
数据操纵语言命令包括:
SELECT
INSERT
UPDATE
DELETE

DML INSERT

插入日期类型的值
日期数据类型的默认格式为“ DD-MON-YY”
使用日期的默认格式
使用 TO_DATE 函数转换
INSERT INTO emp VALUES(1000,'PETER',7369,'12-5月-05',2800,1);

INSERT INTO emp VALUES(1001,‘MIKE',7369, TO_DATE('2005-10-18', 'YYYY-MM-DD'),2800,1);

INSERT INTO emp (empno,ename,sal) VALUES(1000,'PETER',2800 );

插入来自其它表中的记录

语法:

     INSERT INTO <table_name> [(cloumn_list)]

           SELECT column_names FROM <other_table_name>;

SQL> INSERT INTO NEWEMP
     SELECT * FROM EMP; 

SQL> INSERT INTO NEWEMP(EMPNO,ENAME,SAL) 
     SELECT EMPNO,ENAME,SAL FROM EMP; 

DML – update

INSERT INTO emp VALUES(1001,'PETER',7369,'12-5月-05',2800,1);

UPDATE emp SET sal=sal+100;        --所有员工工资加100

UPDATE emp SET ename=‘PETER ZHANG’ where empno=‘1001’;

UPDATE emp SET ename=‘PETER CHEN’,mgr=‘7876’,
	hiredate=to_date(‘2004/10/21’,’YYYY/MM/DD’),
	sal=3200,deptno=2
WHERE empno=‘1001’;
SQL> DELETE EMP WHERE deptno = 1 AND hiredate>to_date(‘2005/10/10’,‘YYYY/MM/DD’);  --删除符合条件的数据
SQL> DELETE EMP	--删除所有行

数据控制语言

数据控制语言为用户提供权限控制命令
用于权限控制的命令有:
GRANT 授予权限
REVOKE 撤销已授予的权限
SQL> GRANT SELECT, UPDATE ON EMP  TO user;


SQL> GRANT SELECT ON EMP TO user WITH GRANT OPTION;


SQL> GRANT UPDATE(SAL, HIREDATE)  ON EMP TO user;


SQL> REVOKE SELECT, UPDATE ON EMP FROM user;

SQL 操作符

Oracle 支持的 SQL 操作符分类如下:

SELECT

where子句中的运算符

查询条件

运算符

比较

=,>,<,>=,<=,<>,!=,NOT

范围

between  and,not between and

集合

In,not in

字符匹配

like,not like

空值

is null,is not null

多重条件

and,or

 Oracle中的用例表

SQL>conn sys/change_on_install as sysdba
SQL>alter user hr identified by hr account unlock; sys登录,解锁hr用户,并修改密码为hr
SQL>conn hr/hr
SQL>select table_name from user_tables;
Departments   部门信息表
Employees     雇员信息表
Jobs          职位信息表
Jobs_history  工作历史信息表
Locations     地址信息表
Regions       地区信息表
可以通过Desc tableName语句查看表的基本信息

SELECT

Order By 用于制定查询结果的排列循序,后面可以跟多个字段名,越在前面的排序优先权越高。

默认为升序,Desc(降序)Asc(升序)

select  empno,ename,sal from emp order  by   sal  asc;


select  empno,ename,sal from emp order by deptno asc,hiredate  desc;


between and,not between and可以进行某一范围的查询 ,范围包含最大值和最小值 。

Select * from emp where sal between 2000 and 5000;

Select * from emp where sal not between 2000 and 5000;

in,not in是集合运算符,只要查询的值等于集合中的一个元素,表达式为真。

Select * from emp where empno in (select mgr from EMP)

Select * from emp where empno not in(7389,7367,7782)


like,not like
模糊匹配,“_”表示任意一个字符,“%”表示任意多个字符,如果字符串中有与匹配符相同的字符,需要使用逃逸字符串escape 。

select * from emp where ename like ‘S%’;

select * from emp where empno not in(7389,7367,7782);

select * from emp where ename like 'MULS#_I_' escape '#‘

And 多个条件同时成立时条件表达式才为真

select * from emp where empno>7600 and sal>2000

Or多个条件中只要有一个条件为真时条件表达式就为真

select * from emp where empno>7600 or sal>2000

连接查询

内连接
外连接
  左外连接 ( LEFT JOIN )   返回左边表的所有行
  右外连接 ( RIGHT JOIN ) 返回右边表的所有行,实现
  全外连接 ( FULL JOIN )   返回连个表的所有数据
  交叉连接 ( CROSS JOIN )   返回连接表中所有数据行的笛卡尔积

CREATE TABLE DEPT ( 
  DEPTNO  NUMBER (2)    NOT NULL, 
  DNAME   VARCHAR2 (14), 
  LOC     VARCHAR2 (13), 
  PRIMARY KEY ( DEPTNO ) 
);

CREATE TABLE EMP ( 
  EMPNO     NUMBER (4)    NOT NULL, 
  ENAME     VARCHAR2 (10), 
  MGR       NUMBER (4), 
  HIREDATE  DATE, 
  SAL       NUMBER (7,2), 
  DEPTNO    NUMBER (2), 
  CONSTRAINT PK_EMP
  PRIMARY KEY ( EMPNO ) 
);



内连接

查询所有员工及其所在的部门信息
	SELECT e.*, d.DNAME from EMP e, DEPT d WHERE e.DEPTNO = d.DEPTNO AND e.SAL > 2000
查询部门信息
	SELECT d.*, e.ENAME from DEPT d, EMP e WHERE e.MGR = e.EMPNO and d.deptno=e.deptno

左外连接

查询所有部门及其部门下的员工(没有员工的部门也要查询出来)
select  d.*, e.ename from dept d left join emp e on d.deptno=e.deptno
select  d.*, e.ename from dept d,emp e where d.deptno = e.deptno;
查询所有部门编号大于20及其部门下的员工
select  d.*, e.ename from dept d left join emp e on d.deptno=e.deptno WHERE d.deptno > 20
全外连接
SELECT e.empno,e.ename,d.dname FROM EMP e FULL JOIN dept d ON e.deptno=d.deptno
交叉连接
SELECT e.empno, e.ename,d.name FROM EMP e CROSS JOIN DEPT

对自身的连接查询

        在Emp表中,每个雇员都对应一个经理,如何查询所有雇员及其经理的名称通过给其中一个表取不同的别名,然后使用对自身的联合查询来实现

select  manager.ename  as  m_name, e.ename as  e_name 
   from EMP e, EMP manager
   where e.mgr = manager.empno;
查询 sales 部门和 Marketing 部门的经理信息以及经理对应的雇员信息
select  d.dname , manager.ename as m_name, e.ename
    from EMP e, EMP manager,  DEPT  d
    where  d.deptno  = e. deptno 	--部门表与员工表连接
    and d. deptno = manager. deptno  --部门表与经理表连接
   // and d.mgr = manager. empno   --部门与经理的连接条件
    and  e.mgr = manager. empno --员工与经理连接
    and  (d.dname ='Sales' or d.dname ='Marketing');



select manager.ename,e.ename
from dept d inner join emp manager on d.deptno=manager.deptno
	inner join emp e on e. mgr= manager.empno
where d.dname in('SALES', 'Marketing’)
order by manager.ename

替代变量

Select * from emp where deptno=&aa
替代变量的使用:&变量名
Select empno,ename,&v1 from &t1 where &w1;

Define a =10  //定义替代变量
Define a   //查看变量
Select * from emp where deptno=&a;
Define  //查所有替代变量
Undefine a  //删除替代变量

Select empno,ename,&&a from emp where &a like ‘S%’  //重复引用

DeleteTRUNCATE

Delete from emp
Delete DML 语句,将会做大量日志记录
TRUNCATE emp
TRUNCATE DDL 语句,不会做日志记录,效率会高,不能回滚

rename

重命名表、视图、序列、同义词
必须是对象的拥有者才能重名
Rename dept to new _dept

Group by with rollup and cube

用带rollupcubegroup by 实现超级聚合,即对group进行再聚合

Rollup and cube

Rollup 实现  从右往左再聚合
Cube 除了形成 rollup的结果,  还会按相反的方向形成结果

 

 GROUPING SETS

两个group语句以union的形式组合在一起

 高级子查询

成对比较
	select * from emp
	where (deptno,mgr) in (
		select deptno,mgr from emp where job like '%CLERK%')

Where字句中的子查询
	查询工资比部门平均工资高的员工
	Select a.empno,a.ename,a.deptno,a.sal,b.avg_sal
	from emp a, (select deptno,avg(sal) avg_sal from emp
			group by deptno) b
	where a.deptno = b.deptno and a.sal > b.avg_sal

标量子查询(scalar subquery

查询员工,并显示工资等级,工资大于 4000 为白领,大于 2000 为蓝领,小于 2000 为打工仔
SQL>select empno,ename,sal, (
	case
	when sal>4000 then '白领'
	when sal>2000 then '蓝领'
	else '打工仔'
	end)  工薪阶层
       from emp;
查询员工,按部门名称排序
select empno,ename 
from emp e 
order by (select dname from dept d where e.deptno=d.deptno)

exists

查询有员工的部门,或有某个员工的部门
select * from dept d
 where exists (
   select * from emp e where e.deptno=d.deptno
 )

With语句

With 语句定义一个变量来表示一个语句,通过引用变量来引用子句,实现重用,提高效率
查询部门总工资大于所有部门工资的平均值的部门

SQL>with
dept_costs AS(
   select deptno,sum(sal) as dept_total
   from emp
   group by deptno),
avg_cost AS(
   select sum(dept_total)/count(*) as dept_avg
   from dept_costs)
select * from dept_costs
where dept_total>(select dept_avg from avg_cost)
order by deptno
/

本人从事软件项目开发20多年,2005年开始从事Java工程师系列课程的教学工作,录制50多门精品视频课程,包含java基础,jspweb开发,SSH,SSM,SpringBoot,SpringCloud,人工智能,在线支付等众多商业项目,每门课程都包含有项目实战,上课PPT,及完整的源代码下载,有兴趣的朋友可以看看我的在线课堂

讲师课堂链接:https://edu.csdn.net/lecturer/893

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享10个不错的C语言开源项目

今天跟大家分享10个重量级的C语言开源项目&#xff0c;C语言确实经得住考验&#xff1a; Redis&#xff1a;Redis是一个开源的高性能的键值对数据库。它以C语言编写&#xff0c;具有极高的性能和可靠性。 Nginx&#xff1a;Nginx是一个高性能的HTTP和反向代理服务器&#xff0…

KPN对任意形状文本检测

文章目录一、研究背景二、方法流程1. 特征提取2. 核建议3. 实例无关特征图4. 轮廓生成5. 其余部分内容三、不足一、研究背景 相比起基于 FCN 网络的文本边缘检测网络&#xff0c;KPN网络可以更好地处理文本之间的间隔。 二、方法流程 1. 特征提取 FCN 和 FPN FCN(全卷积神经…

第十四届蓝桥杯第三期模拟赛原题与详解

​​​​​​​ 文章目录 一、填空题 1、1 找最小全字母十六进制数 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 给列命名 1、2、1 题目描述 1、2、2 题解关键思路与解答 1、3 日期相等 1、3、1 题目描述 1、3、2 题解关键思路与解答 1、4 乘积方案数 1、4、1 题目描…

在IC行业,什么样的人才能拿到高薪资offer?

最近几年国家大战略发展半导体产业&#xff0c;薪资也水涨船高&#xff0c;IC设计类岗位应届生薪水甚至已经到30W的级别&#xff0c;越来越多的人想要从事IC行业。 在IC行业&#xff0c;什么样的人才能拿到高薪资offer&#xff1f;来听听资深工程师怎么说&#xff1f; 我参加…

【网络篇】----- 传输层协议 之 UDP(协议格式,协议特性和编程影响三方面详细分析)

文章目录 前言1、UDP协议2、协议格式 2.1、协议格式模型2.2、字段分析3.协议特性4.编程影响总结前言 1、UDP协议 UDP协议&#xff0c;又名数据报传输协议&#xff0c;是传输层协议之一&#xff01;&#xff01;&#xff01; 在TCP/IP五层模型中&#xff0c;在传输层中&#xff…

MATLAB | 如何绘制github同款日历热力图

应粉丝要求&#xff0c;出一个类似于github热图的日历热力图&#xff0c;大概长这样&#xff1a; 依旧工具函数放在文末&#xff0c;如有bug请反馈并去gitee下载更新版。 使用教程 使用方式有以下几种会慢慢讲到&#xff1a; heatmapDT(Year,T,V)heatmapDT(Year,T,V,MonLim)h…

数据结构|链表

概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。单链表的形式就像一条铁链环环相扣它与顺序表最大的不同是&#xff0c;单链表的数据存储是在不连续的空间&#xff0c;存储的数据里面含有…

Stable Diffusion WebUI本地部署中遇到的一些错误

进来AI绘画大火&#xff0c;我便尝试在本地部署一下&#xff0c;电脑是M1的MacBook&#xff0c;不过windows应该也差不多。 参考官网的方法一步步安装&#xff0c;虽然最后成功了&#xff0c;但中途还是有不少问题。 首先安装homebrew&#xff0c;由于我早就已经安装好了&#…

前端项目上线后,浏览器缓存未刷新问题

文章目录问题背景一、解决办法二、实现原理关于缓存强缓存协商缓存刷新页面对浏览器的影响总结问题背景 前端页面开发测试完&#xff0c;要进行上线&#xff0c;某些页面上传更新到服务器之后&#xff0c;浏览器并没有更新&#xff0c;渲染的还是老页面。这是因为浏览器读了缓存…

es6 new Promise

Promise 是一个构造函数&#xff0c;本身身上有 all、reject、resolve 这几个方法&#xff0c;原型上有 then、catch 等方法。所以 Promise new 出来的对象确定就有 then、catch 方法。Promise 的构造函数接收一个参数&#xff0c;是函数&#xff0c;而且传入两个参数&#xff…

基于神经网络的自监督学习方法音频分离器(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 神经网络的输入是混合&#xff08;男性女性&#xff09;音频的振幅谱。神经网络的输出目标是男性说话者理想的软掩模。损失函数…

七,iperf3源代码分析:状态机及状态转换过程--->运行正向TCP单向测试时的服务端代码

本文目录一、测试用命令二、iperf3状态机中各个状态解析三、iperf3状态机迁移分析K-初始化测试对象&#xff08;NA--->初始化状态&#xff09;:A-服务器端测试对象开始运行&#xff08;初始化状态--->IPERF_START状态&#xff09;:B-建立控制连接&#xff08;初始化状态-…

论文公式符号规范

参考自1&#xff0c;记录论文公式的符号规范&#xff1a; 1.变量和公式符号表达 物理量 物理量符号用英文斜体字母或希腊斜体字母&#xff0c;表示物理量大小用数字加单位&#xff0c;单位使用正体。 例如&#xff1a; m10.05gx10.12ζ35.36mVm10.05 \mathrm{~g} \quad x10…

elasticsearch高级篇:核心概念和实现原理

1.elasticsearch核心概念1.1 索引(index)一个索引就是一个拥有几分相似特征的文档的集合。比如说&#xff0c;你可以有一个客户数据的索引&#xff0c;另一个产品目录的索引&#xff0c;还有一个订单数据的索引。一个索引由一个名字来标识&#xff08;必须全部是小写字母&#…

分布式数据库稳定性资料整理

这篇文章所讲的事情 初探分布式数据库这种有状态服务是如何保证系统的高可用的&#xff0c;可能会有勘误&#xff0c;欢迎指导。 正文 分布式数据库在说高可用的时候&#xff0c;主要是在讲宕机和网络分区时&#xff0c;系统的高可用如何保证&#xff0c;这点和我们在线上应…

【页面无响应】Web页面经常无响应前端如何定位与优化(已解決)

【写在前面】客户现场应用我们的系统时候&#xff0c;发现用着用着就出现1个页面无响应现象&#xff0c;给客户带来极其不好的体验&#xff0c;尤其是当重要工作汇报演示时&#xff0c;就给我看无响应&#xff0c;浏览器崩溃&#xff1f;这样对产品的发展无疑是致命的伤&#x…

水库大坝安全监测的主要坝体类型介绍

水电站和水库大坝安全的分类中有重力坝、土石坝等不同的大坝形式。就在这里详细水库大坝安全监测按照建造形式&#xff0c;基本上可以分为三类&#xff1a;重力坝、土石坝和拱坝。 &#xff08;1&#xff09;重力坝 重力坝&#xff0c;顾名思义就是利用自身重力来维持坝体稳定…

概率论小课堂:高斯分布(正确认识大概率事件)

文章目录 引言I 预备知识1.1 正态分布1.2 置信度1.3 风险II 均值、标准差和发生概率三者的关系。2.1 “三∑原则”2.2 二班成绩比一班好的可能性2.3 减小标准差引言 泊松分布描述的是概率非常小的情况下的统计规律性。学习高斯分布来正确认识大概率事件,随机变量均值的差异和偶…

linux SPI驱动代码追踪

一、Linux SPI 框架概述 linux系统下的spi驱动程序从逻辑上可以分为3个部分: SPI Core&#xff1a;SPI Core 是 Linux 内核用来维护和管理 spi 的核心部分&#xff0c;SPI Core 提供操作接口&#xff0c;允许一个 spi master&#xff0c;spi driver 和 spi device 在 SPI Cor…

面试官: 谈下音视频同步原理,音频和视频能绝对同步吗?

作者&#xff1a;波哥 心理分析&#xff1a;音视频同步本身比较难&#xff0c;一般使用ijkplayer 第三方做音视频同步。不排除有视频直播 视频通话需要用音视频同步&#xff0c;可以从三种 音频为准 视频为准 自定义时钟为准三种方式实现音视频同步 求职者:如果被问到 放正心态…