当前位置:首页 » 硬盘大全 » 删除表数据不缓存
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

删除表数据不缓存

发布时间: 2023-03-23 20:56:05

A. 在excel中相关联的两个表,如何让源表删除数据,而目标表数据不变,谢谢!

选择目标表中的数据区域,复制,右键,选裂态明择性粘贴,把数值选择上,确定,删除源表数据。
这样目标表中的公式已经变成了肆告数值,不会因源闭凯表数据改变而改变了。

B. sql 如何删除表中的全部数据而不删除表

Truncate table 清除表数据 和 表空间
delete from 不加where也可以清除数据 但不释放空间

C. 第三十八章 SQL命令 DROP TABLE

删除表及其数据(可选)。

DROP TABLE 命令删除一个表及其对应的持久化类定义。如果该表是其架构中的最后一项,则删除该表也会删除该架构及其相应的持久化类包。

默认情况下, DROP TABLE 同时删除表定义和表数据(如果存在)。 %NODELDATA 关键字允许指定删除表定义,但不能指定删除表的数据。

DROP TABLE 删除与该表关联的所有索引和触发器。

要删除表格,必须满足以下条件:

可以使用 $SYSTEM.SQL.Schema.DropTable() 方法删除当前名称空间中的表。可以指定SQL表名。与 DROP TABLE 不同,此方法可以删除未使用 [DdlAllowed] 定义的表。第二个参数指定是否也应该删除表数据;默认情况下,不删除数据。

可以使用 $SYSTEM.OBJ.Delete() 方法删除当前名称空间中的一个或多个表。必须指定投影表的永久类名(而不是SQL表名)。可以使用通配符指定多个类名。第二个参数指定是否也应该删除表数据;默认情况下,不删除数据。

DROP TABLE 命令是特权操作。用户必须具有 %DROP_TABLE 管理权限才能执行 DROP TABLE 。否则将导致 SQLCODE-99 错误,因为 %msg 用户没有 %DROP_TABLE 权限。如果拥有适当的授予权限,则可以使用 GRANT 命令分配 %DROP_TABLE 权限。

即使 DROP TABLE 操作同时删除了表和表数据,用户也不必具有指定表的 DELETE OBJECT 权限。

在嵌入式SQL中,可以使用 $SYSTEM.Security.Login() 方法以具有适当权限的用户身份登录:

必须具有 %Service_Login:Use 权限才能调用 $SYSTEM.Security.Login 方法。

DROP TABLE 不能用于通过薯信隐定义持久类创建的表,除非表类定义包括 [DdlAllowed] 。否则,操作将失败,并出现 SQLCODE-300 错误,同时未为类 ‘Schema.tablename’启用%msg DDL 。

删除表不会删除该表的对象权限。例如,授予用户在该表上插入、更新或删除数据的权限。

由于这些原因,通常建议在删除表之前使用REVOKE命令撤消表中的对象权限。

默认情况下, DROP TABLE 删除表定义和表数据。此表数据删除是原子操作;如果 DROP TABLE 遇到无法删除的数据(例如,具有引用约束的行),则任何已执行的数据删除都会自动回滚,结果是不会删除表数据。

可以使用 $SYSTEM.SQL.Util.SetOption() 方法 DDLDropTabDelData 选项设置表数据删除的系统范围默认值。要确定当前设置,请调用 $SYSTEM.SQL.CurrentSettings() ,显示 Does DDL DROP TABLE delete the table's data? setting .

默认值为 1 (“是”)。这是此选项的推荐设置。如果希望 DROP TABLE 在删除表定义时不删除表数据,请将此选项设置为0(“否”)。

可以在每个表的基础上覆盖数据删除。删除表时,可以使用 %NODELDATA 选项指定 DROP TABLE ,以坦搜防止自动删除表数据。如果系统范围的默认值设置为不删除表数据,则可以通过使用 %DELDATA 选项指定 DROP TABLE 来逐个表删除数据。

在大多数情况下, DROP TABLE 使用高效的终止范围操作自动删除表的数据。以下情况阻止使用 KILL EXTEND :表有引用它的外键;投影表的类是持久类的子类;类不使用默认存储;有 ForEach = "row/object "触发器;有引用非默认流字段全局位置的流字段。如果其中任何一个适用, DROP TABLE 将使用效率较低的 DELETE RECORD 操作删除表的数据。

可数厅以使用 TRUNCATE TABLE 命令删除表的数据,而不删除表定义。

DROP TABLE 语句获取表的独占表级锁。这可以防止其他进程在表删除过程中修改表定义或表数据。这个表级锁足以删除表定义和表数据; DROP TABLE 不会获得表数据的每一行的锁。此锁在 DROP TABLE 操作结束时自动释放。

默认情况下,如果在引用尝试删除的表的另一个表上定义了任何外键约束,则不能删除该表。在删除它们引用的表之前,必须删除所有引用的外键约束。在尝试 DROP TABLE 操作之前未删除这些外键约束会导致 SQLCODE-320 错误。

此默认行为与限制关键字选项一致。外键约束不支持 CASCADE 关键字选项。

要更改此默认外键约束行为,请参考 SET OPTION 命令的 COMPILEMODE=NOCHECK 选项。

删除表会自动清除所有相关的高速缓存查询,并清除 %SYS.PTools.StatsSQL 生成的查询信息。删除表会自动清除任何相关查询的所有SQL运行时统计信息(SQL Stats)信息。

要确定当前命名空间中是否存在指定表,请使用 $SYSTEM.SQL.Schema.TableExists() 方法。

默认情况下,如果尝试删除不存在的表, DROP TABLE 会发出 SQLCODE-30 错误。这是推荐的设置。要确定当前设置,请调用 $SYSTEM.SQL.CurrentSettings() ,它显示允许DDL删除不存在的表或视图设置。默认值为 0 (“否”)。如果此选项设置为 1 (“是”),则不存在的表的 DROP TABLE 不执行任何操作,也不会发出错误消息。

在管理门户、系统管理、配置、SQL和对象设置中,通过选中忽略冗余DDL语句复选框,可以在系统范围内设置此选项(以及其他类似的创建、更改和删除选项)。

下面的嵌入式SQL示例创建名为 SQLUser.MyEmployees 的表,然后将其删除。此示例指定在删除该表时不删除与该表关联的任何数据:

D. 手机清除用户数据和清除缓存有什么区别

手机清除用户数据和清除缓存只有一个区别,即清除数据的内容不同。

手机清除用户数据类似于恢复出厂设置,删除了所有用户保存的数据。清除缓存只是删除了应用软件的缓存资源。

清除缓存,即手机应用软件“清除数据”功能,就是把在那个软件上面使用的历史记录还有在软件上面产生的一切数据全部清空掉,等于就恢复了在刚刚下载这个软件时候的样子,对于其他的软件以及数据没有任何影响。

(4)删除表数据不缓存扩展阅读

手机清除用户数据会将手机里的数据全部清空掉,相当于将手机恢复到购买时,完全没有任何的数据。

手机清除缓存,其实要明白缓存就是数据交换的缓冲区(称作Cache),比如说当某一硬件要读取数据时,这个时候就要先从缓存中查找需要的数据,如果找到了则直接执行,如果是找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地进行运行而已。

缓存是CPU的一部分,存在于CPU中,而CPU存取数据的速度则非常的快,一秒钟能够存取、处理十亿条指令和数据,而内存就慢很多,快的内存能够达到几十兆就不错了,可见两者的速度差异是多么的大,缓存是为了解决CPU速度和内存速度的速度差异问题

E. 如何清理mysql数据库缓存数据

1、打开mysql的客户端 这里使用navicat,连接数据库,等到navicat主页面,双击需要操作的数据库连接。

F. 使用javascript删除表格中一行数据后,出现的问题

1、在Asp页面首部<head>加入

以下为引用的内容:
Response.Buffer = True
Response.ExpiresAbsolute = Now() - 1
Response.Expires = 0
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "No-Cache"

2、在HtML代码中加入

以下为引用的内容:
<HEAD>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</HEAD>

3、在重新调用原页面的时候在给页面传一个参数 Href="****.asp?random()"

前两个方法据说有时会失效,而第三种则是在跳转时传一个随机的参数! 因为aspx的缓存是与参数相关的,如果参数不同就不会使用缓存,而会重新生成页面,每次都传一个随机的参数就可以避免使用缓存。这个仅适用于asp&asp.net

4、在jsp页面中可使用如下代码实现无缓存:

以下为引用的内容:
response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server

这些代码加在<head> </head>中间具体如下

以下为引用的内容:
<head>
<%
response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server
%>
</head>

5、window.location.replace("WebForm1.aspx");

参数就是你要覆盖的页面,replace的原理就是用当前页面替换掉replace参数指定的页面。

这样可以防止用户点击back键。使用的是javascript脚本,举例如下:

以下为引用的内容:

a.html

<html>
<head>
<title>a</title>
<script language="javascript">
function jump(){
window.location.replace("b.html");
}
</script>
</head>
<body>
<a href="javascript:jump()">b</a>
</body>
</html>

b.html

<html>
<head>
<title>b</title>
<script language="javascript">
function jump(){
window.location.replace("a.html");
}
</script>
</head>
<body>
<a href="javascript:jump()">a</a>
</body>
</html>

前4种只是清空了cache,即存储在Temporary Internet Files文件夹中的临时文件,而第五种则是使用跳转页面文件替换当前页面文件,并没有清空cache,也就是说Temporary Internet Files产生了相关的临时文件,两者搭配使用。

G. access数据库删除数据后是将原来占有的空间释放了嘛

数据库唯一标识,即使记录删除了,但是数据库还是有记忆功能,就像即使你把硬盘上的文件或者文件夹shift+delete彻底删除后,一样可以通过软件来恢复这些文件。不过数据库的恢复我没偿试过。可能有这种软件

ACCESS自动编号如何恢复从1开始的方法(1)
重置单个表中的“自动编号”字段:要重置“自动编号”字段值,可以使用方法 1 或方法 2。

方法 1

可以重置“自动编号”字段值,使其与表中的一个字段相对应。为此,请按照下列步骤操作:

1. 从主表中删除“自动编号”字段。记下“自动编号”字段名称。
2. 在左窗格中单击“查询”。在右窗格中双击“在设计视图中创建查询”。
3. 在“显示表”对话框中,选择主表。单击“添加”,然后单击“关闭”。
4. 在主表的表视图中双击所需字段,以选择该字段。
5. 选择需要的“排序”顺序。
6. 在“查询”菜单中,单击“生成表查询”。在“表名称”文本框中键入新的表名称,然后单击“确定”。
7. 在“查询”菜单上,单击“运行”。
8. 将显示带有以下文本的对话框:“您正准备向新表粘贴 # 行。”单击“是”以插入行。
9. 在“文件”菜单上,单击“关闭”。单击“否”关闭“生成表查询”窗口。
10. 在左窗格中单击“表”。右键单击新表,然后单击“设计视图”。
11. 在表的“设计”视图中,添加与步骤 1 中删除的字段名称相同的“自动编号”字段。将此“自动编号”字段添加到新表中,然后保存该表。
12. 关闭“设计”视图窗口。
13. 重命名主表。将新表名称重命名为主表名称。

方法 2

也可以使用方法 2 来重置“自动编号”字段值,请按照下列步骤操作:

1. 从主表中删除“自动编号”字段。记下“自动编号”字段名称。
2. 复制主表的结构,然后搏裤稿创建新表。
3. 在左窗格中单击“查询”。在右窗格中单击“在设计视图中创建查询”。
4. 在“显示表”对话框中,选择主表。单击“添加”,然后单击“关闭”。
5. 要选择字段,请双击需要的字段。在主表的“表”视图中对除了“自动编号”字段外的所有字段进行此操作。
6. 在“查询”菜单上,单击“追加查询”。这将更改查询类型。
7. 从“表名称”列表中,选择您在步骤 1 中创建的新表。单击“确定”。
8. 在“查询”菜单上,单击“运行”。
9. 将显示带有以下文本的对话框:“您正准备追加 # 行。”单击“是”将行追加到新表中。
10. 在“文件”菜单上,单击“关闭”。单击“否”关闭“追加查询”窗口。
11. 在左窗格中单击“表”。右键单击新表,然后单击“设计视图”。
12. 在表的“设计”视图中,添加与步骤 1 中删除的字段名称相同的“自动编号”字段。将此“自动编号”字段添加到新表中,然后保存该表。
13. 关基孝闭“设计”视图窗口。
14. 重命名主表。将新表名称重命名为主表名称。

重置带引用表的表中的“自动编号”字段

下面的步骤说明如何为具有引用表的表重置“自动编号”字段。如果有多个引用表,则必须对每个引用表执行下列步骤。

1. 删除表之间的关系。
2. 将主表的“自动编号”字段设为数字数据类型。删除主键。
3. 在主表中创建数据类型为“自动编号”的新字段。保存该表。
4. 在引用表中创建数据类型为数字的新字段。保存该表。
5. 要创建更新查询,以将引用表中的新字段更新为主表中的新“自动编号”字段,请按照下列步骤操作:

a. 在左窗格中单击“查询”。在右窗格中单击“在设计视图中创建查询”。这将创建新查询。
b. 在“显示表”对话框中,选择主表和引用表。单击“添加”来添加主表和引用表。单击“关闭”。
c. 单击主表中以前链接到引用表的字段。使用拖放功能将该字段放到引用表中以前链接的字段上。这样将在这两个表之间创建基于原始链接字段的联接。
d. 在“查询”菜单上,单击“更新查询”。
e. 双击引用表中的新字段,将其添加到字段列表中。
f. 在“更新到”字段中,键入 [主表名].[新自动编号字段],以更新引用表中的新字段值。
g. 在“查询”菜单上,单击“运行”。
h. 将显示带有以下文本的对话框:“您正准备更新 # 行。”单击“是”将行追加到新纯消表中。
i. 在“文件”菜单上,单击“关闭”。单击“否”关闭“更新查询”窗口。

6. 从主表和引用表中删除原始链接字段。
7. 将新“自动编号”字段重命名为原始名称。
8. 重新创建主键以及表之间的关系。

此过程重置“自动编号”字段,然后用正确的键值更新引用表。

ACCESS自动编号从1开始-如何让access自动编号重新从1开始排序的方法(2)
方法一:
删个那个自动编号的字段,再建一个同样的自动编号字段即可。
方法二:
自动编号是一直增加的(每次都加1),你再增加一条记录它的编号会在前面的基础上加1(删除的也算),如果你编号为1的记录被删除了,你想再要从1开始,可以打开Access数据库,选择工具,再选择数据库实用工具,单击压缩和修复数据库,这样就OK了.
方法三:(没试过)
1、在access里新建一个查询。
2、把视图改为sql视图。
3、在里面输入
ALTER TABLE 表名 ALTER COLUMN [自动编号字段名] COUNTER (你要的初始值, 1)
例如:
ALTER TABLE [user] ALTER COLUMN [id] COUNTER (1001, 1)
4、运行后,编号就从1001开始了。

H. sql怎么删除一个表中的所有数据

删除表数据有两种方法:delete和truncate。具体语句如下:

一、RUNCATE TABLE name :

删除表中的所有行,而不记录单个行删除操作。在这个指令之下,表格中的资料会完全消失,可是表格本身会继续存在。

TRUNCATE TABLE 的语法:TRUNCATE TABLE name ,参数 name 是要截断的表的名称或要删除其全部行的表的名称。

二、Delete from tablename where 1=1

1、delete语法:

DELETE FROM 表名称 WHERE 列名称 = 值。

2、删除所有行:

可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:DELETE FROM table_name。

(8)删除表数据不缓存扩展阅读:

truncate和delete的共同点及区别:

1、 truncate和 delete只删除数据不删除表的结构(定义) 。

2、delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发。

truncate是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger。

3、delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动 。truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始)。

4、速度,一般来说: truncate >delete 。

I. 数据库如何删除表中的一段区间内的所有数据

1 付键 也就是FK formary key

程序交流中心,这是专门为新手学习设立的论坛

二、SQL
Structur query language
结构化查询语言,是操作关系型数据库中的对象。

DDL(Data definition language 数据定义语言),用于建表或删表操作,以及对表约束进行修改
create table , alter table , drop table 对表结构的增删操作。
DML(Data manipulation language 数据操作语言),向表中插入纪录,修改纪录
insert , update , delete , merge
transaction ,事务控制语言,由DML语句组成的,commit; ,rollback;
select 查询语句
dcl 授权语句 grant

三、Oracle
DBMS 数据库管理系统
有Oracle提供,还提供AS,应用服务器
DBA 数据库管理员

四、相关操作
1、sqlplus 访问数据库命令(本地访问/远程访问),和数据库建立连接的命令,是数据库操作的环境
sqlplus 用户名/密码
2、show user 显示当前用户的用户名
改变身份可以直接connect 用户名/密码 --- 这个是sqlplus命令
在sqlplus中可以使用 ! 可以在shell和sqlplus间切换,!shell命令 可以在sqlplus中使用shell命令。
实际上是sqlplus开了子进程来执行shell命令。
3、Oracle数据库中的表分两类:用户表(用户使用操作的表),系统表(数据库系统维护的表,也叫数据字典)
对用户表的DDL操作出发了对系统表的DML操作!

五、基本语法

1、select查询语句

select table_name from user_tables;(查询系统表)
以上的查询语句就是查询本用户下所拥有的所有表的表名。

投影操作,只查看选择的字段的信息。
选择操作,查看字段中的特定某些信息。
联接操作,多表查询,通过表间连接,查寻出多表中的信息

(1)select table_name from user_tables;(查询系统表)
以上的查询语句就是查询本用户下所拥有的所有表的表名。

(2)sqlplus的buffer中会缓存最后一条sql语句,可以使用"/"来执行这最后一条sql语句,也可以使用
edit命令来编辑最后一条sql语句。
l命令(list)(sqlplus命令)可以显示buffer中最后一条命令。

sqlplus命令可以缩写

(3)desc [表名]
这是一条sqlplus命令,注意他不是sql语句,这条命令用于查看表的结构。descript的缩写
[字段名] [字段的类型],这是使用完desc命令后显示的表结构。

(4)select [表的字段名1],[表的字段名2], ... from 表名;
select * from 表名; 查寻表中所有字段的信息

(5)关键字不等拆分,sql语句,以及表名,字段名是大小写不敏感的。
sql语句要以";"结尾,来表示sql语句结束,如果不加";"系统不会执行此条sql语句,并提示。
在Oracle中字符显示是左对齐,数值右对齐。

(6)在select 语句中可以使用数学表达式。
select [表达式(必须包含本表字段名)],[...],.... from 表名;
运算的优先级的先乘除后加减,同级自左向右运算,括号改变优先级。

(7)别名
select [字段名或表达式] ["别名"],[...] ["..."],.... from 表名;
可以通过在字段名或表达式后加空格"别名",可以给列,或者表达式结果其别名。
表达别名必须加双引号。

(8)字符串拼接使用||符号
select 目标字段名||" "||目标字段名 from 表名;

注意:在Oracle中的字符串要用'..'包含
别名中需要使用空格,或是大小写敏感时需要用".."包含。

练习:
自己写一条SQL语句,执行的结果是select * from ...;
其中...是每张系统表的表名
即在每张系统表的表名前加“select * from” ,后加“;”
select 'select * from '||table_name||';' from user_tables;

2、处理错误
(1)!oerr ora [错误号] ,系统可以显示错误的原因和如何修改。如果命令错误输入可以使用edit或ed来修改输入错误。
实际上是在编辑缓存文件中的最后一条sql语句。
也可以使用 (change) c /错误字段/正确字段,来进行替换操作进行修改。
只有在Linux平台使用
! 相当于 host ,没有断连接,只是切换了一下,执行shell命令
(2)edit命令来编辑最后一条sql语句。

3、sqlplus设置
set pause on 回车响应,分屏显示,只在本会话中有效
set pause off 关闭分屏显示。
set pause "..." 设置分屏显示的提示信息。
set pause on 先输出提示信息,回车响应,分屏显示
set head off 提头输出关闭
set feed off 结尾输出关闭
set echo off 回写关闭
spool 文件名.sql 写入指定文件
spool off 关闭写入。

4、sql脚本
也就是在文件中写有sql语句的文件,可以在sqlplus中运行。
引入sql脚本
sqlplus 用户名/密码 @sql脚本 (注意:在用户名密码输入结束后一定要加空格然后再写@sql脚本)
在脚本中最后一行写上“exit”,则运行完脚本以后,回到shell上

5、
Oracle中的空值 空值会当无穷大处理,其实空值根本就不会存储,只是看作是无穷大。

Oracle中控制处理函数 NVL(字段名,值),这个字段中的空值替换为指定值,如果不为空,则会返回其原值。
例:select (salary*12)*(NVL(commission_pct,0)/100+1) salary,first_name from s_emp;

distinct关键字,去掉重复行(这个关键字会触发排序操作)
例: select distinct dept_id,title from s_emp;
dept_id与title的联合不唯一
注意:distinct,关键字之后会对from之前的字段进行排重操作。

6、column命令 --- sqlplus命令
column命令 列格式的定义

column 目标列名 查看这个类是否定义了格式

column 目标列名 format a.. 设置列宽。
column last_name heading 'Employee|Name' FORMAT A15
设置题头
这其中的'|'是换行符

column salary justify left format $99,990.00
定义数字显示格式
注意:如果不满足显示的格式,就会把数据显示为"#"

column salary justify left format $00,000.00
会出现$00,928.00 ,用0补齐

column 列名 clear (清除列格式定义)

注意:只有sqlplus命令才有简写,并且在使用sqlplus命令时结尾也不能加分号。

六、选择操作
1、order by
排序子句 ASC(默认,升序) DESC(降序)
order by 目标列名(别名) 排序顺序(不写排序顺序,会默认为升序排序)

例:select first_name from s_emp order by first_name;
select first_name from s_emp order by first_name desc;

注意:升序空值在结果的末尾,降序空值在结果的最前面。

2、where子句

where子句使用在 select ... from ... 后面,用来选择所需(符合条件的)的记录

where后面跟的是表达式 也就是 XXX=XXX, XXX between X and X ,XXX in(X,X,X)
like '...' 通配查询

between ... and ... ,表示结果在这之间,between and是一个闭区间,
也就相当于... <= ... and ... >= ... 。
!=,<>,^=,这三个都标识不等于,<=,>=,=,这些运算符都可以使用。
... in (va1,val2,...) 判断结果是否在这个枚举中存在
like '...' 字符串通配查询,'%'表示多个字符,'_',表示一个字符。
注意:转义的用法:like ‘S\_%’ escape ‘\’
... and ... 表示只有两个条件同时满足
... or ... 表示条件只要满足其中只一就可以
all ... 是要求都满足条件。
not .....,则是可以与以上的条件产生反效果。
空值会对not in造成影响,也就是不等于任何值,但是空值例外。
... is null 使用来判断值是否为空。

注意:Oracle中的字符串是严格区分大小写的。

(1)注意数据类型,数字类型直接写,字符用'......' ,缺省格式的Date可以用'......',只有别名
才用" "包含。
(2)选择合适的运算符

七、单行函数
1.字符函数

字符是大小写敏感的
转小写 lower(字段名) --- 其中的参数可以是一个字符串常量或是一个字段名
转大写 upper(字段名)
首字母大写 initcap(字段名)
字符串拼接 concat(字段1, 字段2)
截取子串 substr(字段名, 起始位置,取字符个数)
al表,是专门用于函数测试和运算的,他只有一条记录
字符串拼接 concat(...,....)
求指定子串 substr(...,起始位置,取字符个数)
可以使用"-"表示从右向左取,取的时候可以从左往友取。
例:select substr(first_name,-2,2) sub from s_emp;(取后两个)
select substr(first_name,2,2) sub from s_emp;(取前两个)

2,数值函数

四舍五入 round(数据,保留小数点后几位)
可以用负数表示小数点前,0,表示小数点后第一位,也就是保留个位,-1表示个位(保留到十 位)。
例:select round(15.36,1) from al;
截取数字函数 trunc(数据,保留的位数(小数点后位数)) 截取个位之后补0
例:select trunc(123.456,1) from al;

3,日期函数

日期格式,
全日期格式 世纪信息,年月日,时分秒。
缺省日期格式,日-月-年 dd-mon-rr
修改当前会话的日期格式,会按照指定的格式输出日期
alter session set nls_date_format='yyyy mm dd hh24:mi:ss';

返回当前日期 sysdate
例:select sysdate from al;
select sysdate+1 from al; 获得明天的日期,加1,单位是天

日期是格式敏感的
求两个日期间相隔了多少个月 months_between(date1,date2)
加减指定数量的月份 add_months(date,月数),月数可以为负,负值就是减去相应的月数。
从date日期开始的第一个星期五 next_day(date,FriDay)
返回月末的日期 last_day(date)
截取日期 trunc(date,'年或月或日或时分秒')
例:select next_day(sysdate,2) from al;
例:select trunc(add_months(sysdate,1),'month') from al;
ROUND('25-MAY-95','MONTH') 01-JUN-95
ROUND('25-MAY-95 ','YEAR') 01-JAN-95
TRUNC('25-MAY-95 ','MONTH') 01-MAY-95
TRUNC('25-MAY-95 ','YEAR') 01-JAN-95

练习:
返回下个月的第一天的日期
select round(last_day(sysdate),'MONTH') from al;
select add_months(trunc(sysdate,'MONTH'),1);

4,不同数据类型间转换函数

将日期转成字符 tochar(date,'日期格式')
日期格式要用有效格式,格式大小写敏感 'yyyy mm dd hh24:mi:ss',
'year'(全拼的年),'mm'(数字表示的月) 'month'(全拼的月),'day'(星期的全拼),'ddspth' (日期的全拼) 'yy mm dd'
例:select to_char(sysdate,'yyyy mm dd hh24:mi:ss')from al;

将字符转换成数字 to_number('...')

将数字转字符to_char(number,'fmt') fmt是数字格式

将字符串转成日期 to_date('...','日期格式')
例:select to_char(to_date('2006 11 03','yyyy mm dd'),'dd-month-yy') from al;

1、等值连接

select [表别名1.字段名1],[表别名2.字段名2],...
from 表1 表别名1 ,表2 表别名2
where 表别名1.字段名3=表别名2.字段名4;
表连接时,当表与表之间有同名字段时,可以加上表名或表的别名,加以区分,使用时要用
表名.字段名或表别名.字段名(列名)。当表的字段名是唯一时,可以不用加上表名或表的别名。

注意:当为表起了别名,就不能再使用表名.字段名。

例:select a.first_name,a.last_name,b.name
from s_emp a,s_dept b
where a.dept_id=b.id;

2、非等值连接

select [表别名1.字段名1],[表别名2.字段名2],...
from 表1 表别名1 ,表2 表别名2
where 表别名1.字段名3 ..... 表别名2.字段名4

....可以使比较运算符,也可以使其他的除了'='的运算符

例:select e.ename, d.grade,e.sal
from emp e,salgrade d
where e.sal between d.losal and d.hisal;

3、自连接

用别名把一张表中的数据分成两部分,然后在使用条件过滤。
select [表别名1.字段名1],[表别名2.字段名2],...
from 表1 表别名1 ,表1 表别名2
where 表别名1.字段名3=表别名2.字段名4;

例:select a.first_name ename,b.first_name cname
from s_emp a,s_emp b
where a.manager_id=b.id;

以上所提到的表连接,都叫做内连接,严格匹配两表的记录。

4、外连接

会使用一方表中的所有记录去和另一格表中的记录按条件匹配,空值也会匹配,这个表中的所有记录都会显示,数据库会模拟出记录去和那些不匹配的记录匹配。

例:select a.first_name enamei,a.id,b.first_name cname,b.id
from s_emp a,s_emp b
where a.manager_id=b.id(+);
即用a表中的数据去匹配b表的,若b表中有null,系统模拟纪录与其匹配

注意:要把那一方的记录全部都显示出来,还有注意条件(+)跟在要全部选出的对端。

外连接的应用:
列出哪个部门没有员工
select e.deptno,d.deptno
from emp e,dept d
where e.deptno(+)=d.deptno
and e.deptno is null;

三、组函数

group 组
group by 分组子句,按指定的分组规则分组 ,这个group by 子句可以跟在 select 语句后或是 having后面。
group by子句也会出发排序操作,会按分组字段排序。

select [组函数或分组的字段名] ,... from 表名 group by [字段名1],[字段名2],.....;

例:select avg(salary) from s_emp group by dept_id;

注意:组函数可以处理一组数据,返回一个值。
组函数会忽略空值。

avg(..),求平均值,sum(..),求和 这两个函数的参数只能是number型的。

以下所提到的函数可以使用任意类型做参数。
count(..),用来统计记录数,可以使用排重命令。count(...)默认使用的是all。
max(..),min(..)求最大值和最小值,
count(*),统计表中记录数。

例:select max(b.name),avg(a.salary), max(c.name)
from s_emp a,s_dept b,s_region c
where a.dept_id=b.id and b.region_id=c.id
group by b.dept_id;

注意:只要写了group by子句,
*** select后就只能用group by后的字段或者是组函数。 ***
where子句只能够过滤记录,放单行函数。

having子句可以过滤组函数结果或是分组的信息,且写在group by子句后。

例:
select max(b.name),avg(a.salary), max(c.name)
from s_emp a,s_dept b,s_region c
where a.dept_id=b.id and b.region_id=c.id
group by b.id
having sum(a.salary)>4000;

column 也可以定义有别名的列的格式。
column "别名" 格式定义

注意:要先过滤掉不需要的记录,然后再进行分组操作,提高效率。

四、子查询

子查询,就是可以嵌在任何的sql语句中的select语句。

在select语句中嵌套子查询时,会先执行子查询。一般的会将子查询放在运算符的右边。

注意:在使用子查询时,要注意这个运算符是单行的(也就是只能是单值),还是多行运算符(范围,多值,in)。
配合使用子查询返回的结果必须符合运算符的用法。

例:
select first_name,title
from s_emp
where title=any(select title from s_emp
where last_name='Smith')
and upper(last_name)!='SMITH';

select first_name,title
from s_emp
where title in (select title from s_emp
where last_name='Smith')
and upper(last_name)!='SMITH';

五、将业务需求转换成可操作的表

一: 需求分析
二: 画E-R图
三: 转换成表关系
四: 割接(新老系统交接)
五:

E-R图属性:
* 为强制且非空属性
o 可选属性(可以有值也可以没有)
#* 表示此属性唯一且非空

实体关系:
mastbean maybean

数量关系: 多对一关系
一对多关系
一对一关系
多对多关系

第一范式,所有的属性都必须是单值,也就是属性只表示单一的意义。(记录可以重复,没有任何限制)
第二范式,属性要求唯一且非空,(记录不可重复,但是数据可能会出现冗余)。
第三范式,非主属性只能依赖于主属性,不能依赖于其他非主属性。(解决数据冗余问题)

六、约束

约束是针对表中的字段进行定义的。

primary key (主键约束 PK)保证实体的完整性,保证记录的唯一
主键约束,唯一且非空,并且每一个表中只能有一个主键,有两个字段联合作为主键,只有两个字段放在一起唯一标识记录,叫做联合主键。

foreign key (外建约束 FK)保证引用的完整性,
外键约束,外键的取值是受另外一张表中的主键或唯一值得约束,不能够取其他值,只能够引用主键会唯一键的值,被引用的表,叫做parent table(父表),引用方的表叫做child table(子表),要想创建子表,就要先创建父表,后创建子表,记录的插入也是如此,先父表后子表,删除记录,要先删除子表记录,后删除父表记录,要修改记录,如果要修改父表的记录要保证没有被子表引用。要删表时,要先删子表,后删除父表。

unuque key(唯一键),值为唯一

index(索引)是数据库特有的一类对象,view(示图)
典型的一对多 class 对应多个学生。
student table class table
______________________________ _________________________
| id | name | address| class_id| | id |class_desc|class_num|
|(PK)|______|________|___(FK)__| |(pk)|__________|_________|
| | | | | | | | |

一对一

student tabel shenfenzheng table
____________________ _________________________________
| id | name | address| | s_id |shenfen_desc|shenfen_num|
|(PK)|______|________| |(PK,FK)|____________|___________|
| | | | | | | |

多对多

student tabel zhongjian table kecheng table
____________________ _________________________________ __________________
| id | name | address| | s_id |shenfen_desc|shenfen_num| | kid | kechengname|
|(PK)|______|________| |(FK,FK)|____________|___________| | (PK)|____________|
| | | | |联合主键| | | | | |

引用对方表的主键,当作本身的主键,所以这个表的主键,既是主键又是外建

建表和其他相关操作

DDL语句

创建表:
create table 表名 ( 字段名1 类型(数据长度)(default ...) 约束条件, 字段名2 类型(数据长度) 约束条件 );

Oracle数据库中的数据类型

varchar(长度),可变长字符串,char(长度) 定长
number(..,..),number 表示浮点数,或者是整数
long 大对象,clog 字符的大对象,相当于文本文件在表中只存放一个相当于只针对值
blog 二进制的大对象,也是以相当于指针的形式存放的。
primary key约束:
主键约束的定义:
第一种定义形式:
create table test(c number primary key ); 列级约束
第二种定义形式:
create table test(c number , primary key(c) ) ; 表级约束
create table test( c1 number constraints pkc1 primary key ); 此约束有名字: pkc1
create table test(c number , c2 number , primary key (c ,c1) ) ; 用表级约束可以实现联合主键

foregin key (fk) 外键约束:
(先定义父表,再定义子表)
carete table parent(c1 number primary key );
create table child (c number primary key , c2 number references parent(c1));
或表级约束定义:
create table child( c number primary key , c2 number , foreign key(c2) references parent(c1));

如果两个字段都为唯一且非空,这时可以定义成UK+NOT NULL

(PK或UK)一对多(FK)
(PK+UK)一对一(FK) 或 (PK)一对一(PK)
多对对多关系,一般都通过一张中间表来分解成两个一对多的表

建立表
create table[schema]table
schema: 一个用户对应一个schema 不同用户下的表不能互相查看

select count(*) from s_dept; <===> select count(*) from sd0611.s_dept;

一个表中只能存储一个LONG类型
CLOB 存储大的文本对象
BLOB 存储大的二进制对象

create table test(c1 number primary key); 设置主键
create table test(c1 number constraints test_c1 primary key); 定义约束名,默认约束名为SYS_ 在列后面定义约束称为列级约束
create table test(c1 number primary key(c1)); 所有列定义完后再定义约束称为表级约束(能定义联合主键)
cretae table test(c1 number,c2 number,priary key(c1,c2)); 定义联合主键
create table child(c1 number primary key); 先要定义父表
create table child(c1 number primary key, c2 number references parent(c1)); 然后定义子表 references parent定义外键
create table child(c1 number primary key, c2 number references parent(c1) on delete cascate); on delete cascate为级联删除
create table child(c1 number primary key, c2 number references parent(c1) on delete set null); on delete set null删除后将外键置空
create table child (c1 number primary key, c2 number,foreignkey(c2) references parent(c1));

二、约束

1、非空约束(not null)
这是一个列级约束
在建表时,在数据类型的后面加上 not null ,也就是在插入时不允许插入空值。
例:create table student(id number primary key,name varchar2(32) not null,address varchar2(32));

2、unique 唯一约束
唯一约束,是会忽略空值的,唯一约束,要求插入的记录中的值是为一的。
例:create table student(id number,name varchar2(32),address varchar2(32),primary key (id),unique (address));
如果创建一个uk,系统自动建一个唯一索引

3、pk、uk
Oralce支持级联删除,不支持级联更新

4、check约束
检查约束,可以按照指定条件,检查记录的插入。check中不能使用尾列,不能使用函数,不能引用其他字段。
例:create table sal (a1 number , check(a1>1000));