「数据库写作」技巧与规范,必须注意的重点事项 (写数据库 应该注意的地方)

数据库写作:技巧与规范,必须注意的重点事项

如今在互联网时代,大量的数据交换和储存需要数据库的支撑,因此数据库写作也变得至关重要。一份完整、准确并符合规范的数据库记录将有助于提高工作效率、规避风险。但是,数据库写作要注意许多事项,这篇文章将详细探讨数据库写作所必须遵循的规范和技巧,并探讨一些需要特别注意的重点事项。

一、遵循数据库设计规范

数据库设计规范是指编写数据库技术文件时必须遵循的规范。数据库技术文件是指数据管理员或开发人员制定的文档,旨在描述数据库系统的结构和功能。遵循数据库设计规范有助于减少错误和重复工作,可以在设计期间降低成本和提高效率。

以下是一些有关数据库设计规范的注意点:

1. 数据库表名要明确、简单,并且可以识别。

2. 每个数据库表都应具有一个主键来唯一标识每行记录。在设计主键时,记得用数字或字母组合,而不要使用符号或特殊字符。

3. 确定每张表的关系之前,应先定义每张表所表示的实体并将其归类。表与表之间的关系必须是清晰和可见的。

4. 数据库表和字段应该使用英语单词,如果需要缩写,应该使用正式的标准缩写。避免使用长、难以理解的缩写。

二、正确的字段定义

数据表的字段定义是数据库中最基本的要素,确保正确的字段定义可以更大程度地减少错误和重复的工作。以下是应注意的一些字段定义技巧:

1. 建议使用数据类型正确的字段。例如,日期应该是日期数字处理,字符串要分清是 Unicode 还是非 Unicode,整数应使用 int 或 bigint 数据类型等。

2. 字段长度应该根据需要设定,并且应该与字段的数据类型相匹配。同时对于必填项,也需要设置不能为空。

3. 在定义字段时,应指定字段是否允许为空或者是否唯一。

4. 更好避免使用特殊字符,这样可以避免对数据库的使用造成麻烦。

三、数据类型和存储范围

在数据库中,采用正确的数据类型和存储范围可以更大程度地减少错误和重复工作。以下是一些有关数据类型和存储范围的注意事项。

1. 在定义新表或修改已有表时,需要考虑存储范围,并指定适当的数据类型。

2. 在定义数据类型时,如果您不确定数据类型的需要,更好采用较大的数据类型。

3. 对于可编辑的字段,您可以设置适当的格式,并指定允许的字符集范围。

4. 在确定存储范围时,应该考虑到数据的增长趋势,如果可能的话,应该要留出可扩展的空间,以免耗费大量的时间和资源去修改数据库。

四、避免使用特殊字符

在数据库中,各种特殊字符往往需要特殊处理,因此更好能够避免使用这些特殊字符,以免维护时造成不必要的麻烦。

以下是一些需要特别注意的特殊字符:

1. &, 。这些字符在 HTML 中具有特殊的含义,因此需要特别处理。为避免不必要的困难,更好不要使用它们。

2. 正斜杠和反斜杠。一些文件名分割符中需要使用反斜杠,因此可能会在路径名或其他字段中使用反斜杠。为了避免混淆或其他不必要的麻烦,需要正确处理这些反斜杠,以确保它们没有特殊含义。

五、记录插入

数据的插入是数据库开发中非常重要的一个阶段。在进行数据插入时,需要注意以下一些事项,以确保数据的准确和完整性:

1. 执行正确的值和适当的字段。确保所有字段的值都正确。

2. 对于可能为空的字段,请明确它们是否应该设为空值。例如,如果一个数据字段为null,并且应该在将来填写,则应该将该字段设置为空。

3. 插入数据时,需要确保没有重复数据影响数据的完整性。如果需要检查是否存在相同的记录,则可以使用 SELECT 语句并使用 GROUP BY 子句进行分组。

4. 如果您要自动生成 ID/UUID,请确保它是唯一的。如果不唯一,可能会对数据的完整性造成威胁。

六、记录更新

与插入数据不同,更新数据需要更多的注意力。以下是更新数据时需要注意的一些事项:

1. 确保更新前所有数据都满足条件,以避免数据不一致。

2. 更新时应只更新有需要的字段以避免数据重复。

3. 可以使用适当的加锁机制实现并发控制,以保证数据的完整性。

4. 如果有必要,更好在更新前将原始数据备份。这样,在数据更新失败或数据被破坏时,您可以轻松地恢复数据。

数据库写作是数据库开发中必须要考虑的一个方面。符合规范的数据库记录是整个系统基础中的重要组成部分,因此需要避免在这个过程中出现的错误和不适当的操作。仔细审查数据库记录,仔细选择正确的数据类型和存储范围,避免使用特殊字符等等,这些都能够帮助您创建可维护的、易于使用的数据库,提高工作效率和保证数据的完整性。

相关问题拓展阅读:

微博的系统架构,想用mysql+redis配合使用,想问一下具体要怎么操作

写入数据到Redis, 然后在写个运行cron的脚本,美妙读内慧竖存,神洞并写游碧枯入数据库

也有其他方法

  微博的系统架构,想用mysql+redis配合使用,具体操作步骤:

  写入数据到Redis,,然后在写个运行cron的脚本,美妙搏游读内存,并写入数据库即可。

  使用注意:

  1、MySQL使用需要注意的地方:

1) 、存储引擎选择InnoDB,在高并发下读写有很好的表现;

2)、 数据合理分表分区,均衡各数据库服务器的负载;

3) 、适当作数据的冗余,便于在cache失效时的快速恢复;

  2、Redis使用需要注意的地方:

1) 、合理规划cache;

将访问量高的热点数据统计出来、分类稿键缓基敬销存。

2)、 缓存的压缩;

在高访问量和高并发下,每一个字节的减少都是巨大的节省。

、数据实时性与一致性。

如何把sqlserver数据迁移到mysql数据库及需要注意事项

在项目开发中,有时由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Server的数据迁移到MySQL。下面是小编日常整理的一种sqlserver数据库迁移的方法。

一、SQL Server中常用数据类型与MySQL不同的地方

二、将SQL Server数据迁移到MySQL需要注意的一些问题

1、唯一索引的不同,sql server的唯一索引的字段只能允许存在一个null值,而mysql,一直oracle中唯一索引对应的字段都允许存在多个null值。

2、乱冲存储过程的语法存在很大的不同,存储过程的迁移是最麻烦的,需要仔细修改。

3、程序中部分写的SQL语句由于语法的不同也要相应的修改。

三、将SQL Server数据迁移到MySQL的常见方法

1、使用 SQLyog 迁移

优点

该迁移方法很简单,灵活,迁移时,谨孝可以进行字段的修改,比如在sql server中原来是datetime,然后迁移到mysql时你可以配置成timestamp;成功率很高;

缺点

迁移很慢!这是该方法更大的缺点,如果表的数据量达到几十万行,甚至几百万行,你会发现迁移起来真的很慢。明显比其他迁移方法慢很多。

2、使用 powerdesigner 和 sql server 的脚本导出功能 来迁移

(1)、该方法首先使用 powerdesigner,对sql

server数据库,进行逆向工程,得到E-R图,然后生成MySQL的建表语句。完成数据库结构的迁移;当然表结构的迁移,不使用

powerdesigner一样也是可以的。比如我将表结构导出成语句,然后手动进行修改,然后在MySQL中运行,也是一样的;

(2)、然后使用 sql server的工具 SS,将sql server数据库中的表的数据,导出成insert语句,每个表对应导出一个文件,然后对文件进行一些处理,然后导入到MySQL数据库中。

3、使用Oracle MySQL Server 官方的 workbeach 工具进行迁移

(1)、在workbench 连接sql server时,用户需要有 view any database 的权限。不然workbench无法访问sql server的表结构的元数据,从而无法进行迁移。

(2)、还有使用 Navicat 来进行迁移的方法,祥陪稿方法和 SQLyog 是类似的。

以下有几款迁移工具的对比,可以参考,比较推荐DB2DB.

软件易用性主要是指软件在导入前的配置是否容易。由于很多软件设计是面向程序员而非一般的数据库管理人员、甚至是普通的应用程序实施人员,而这一类人员很多时候并没有数据源配置经验。因为一些使用 ODBC 或者 ADO 进行配置的程序往往会让这类用户造成困扰(主要是不知道应该选择什么类型的数据库驱动程序)。下面让我们看看四个工具的设计界面:

>>>>

1、SQLyog

SQLyog 使用的是古老的 ODBC 连接,但对于新一代的程序来说,这种方式的非常的不熟悉并且不容易使用弯氏,并且必须要求本机安装好相应的数据库的 ODBC 驱动程序(SQL Server 一般自带好)。

>>>>

2、Navicat Premium

NavicatPremium是四个应用工具中设计最不人性化的一个:从埋银散上图怎么也想像不到要点按那个小按钮来添加一个新的连接,并且这个连接设置不会保存,每次导入时都必须重新设置。NavicatPremium使用的是比 ODBC 稍先进的 ADO 设置方式(199X年代的产物),但使用上依然是针对老一代的程序员。

>>>>

3、Mss2sql

Mss2sql 是最容易在百度上搏裤搜索出来的工具,原因之一是它出现的时间较早。

Mss2sql由于是很有针对性的从 SQLServer 迁移到 MySQL,因为界面使用了操作向导设计,使用非常容易。同时在设置的过程中,有非常多的选项进行细节调整,可以感觉到软件经过了相当长一段时间的使用渐渐完善出来的。

>>>>

4、DB2DB

DB2DB 由于是由国人开发,因此无论是界面还是提示信息,都是全程汉字。另外,由于 DB2DB 在功能上很有针对性,因为界面设计一目了然和易使用。和 mss2sql 一样, DB2DB 提供了非常多的选项供用户进行选择和设置。

三、处理速度和内存占用评测

在本评测前,本人的一位资深同事曾经从网上下载了某款迁移软件,把一个大约2500万记录数的数据表转送到阿里云 MySQL,结果经过了三天三夜(好在其中两天是星期六和星期日两个休息日)都未能迁移过来。因此这一次需要对这四个工具的处理速度作一个详细的测试。

考虑到从 SQL Server 迁移到 MySQL 会出现两种不同的场景:

从 SQL Server 迁移到本地 MySQL 进行代码测试和修改;

从 SQL Server 迁移到云端 MySQL 数据库正式上线使用;

以下为测试过程中的截图:

>>>>

1、SQLyog

请点击输入图片描述

>>>>

2、Navicat Premium

请点击输入图片描述

请点击输入图片描述

注意:我们在测试 Navicat Premium 迁移到  MySQL 时发现,对于 SQL Server 的 Money 类型支持不好(不排除还有其它的数据类型支持不好)。Money 类型字段默认的小数位长度为 255,使得无法创建数据表导致整个测试无法成功,需要我们逐张表进行表结构修改才能完成测试过程。

Navicat Premium 的处理速度属于中等,不算快也不算慢,但 CPU 占用还有内存占用都处于高位水平。不过以现在的电脑硬件水平来说,还是可以接受。但 CPU 占用率太高,将使得数据在导入的过程中,服务器不能用于其它用途。

>>>>

3、Mss2sql

Mss2sql 并没有提供计时器,因此我们使用人工计时的方法,整个过程处理完毕大于是 726 秒。Mss2sql 的 CPU 占用率相对其它工具来说较高,但仍属于可以接受的范围之内。

>>>>

4、DB2DB

请点击输入图片描述

DB2DB 同样迁移 300万数据时,仅仅使用了 2 分 44 秒,这个速度相当惊人。不过最后的结果出现一个 BUG,就是提示了转换成功,但后面的进度条却没有走完(在后面的数据完整性评测中,我们验证了数据其实是已经全部处理完毕了)。

关于SQL数据库以及JAVA的一些问题,在线急等

要回答的一楼已经回答了;

其他不懂的GOOGLE下;

1 付键 也就是FK formary key

www.cxrs.net/bbs

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

二、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 ,, … 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是一个闭区间,

也就相当于… = … 。

!=,,^=,这三个都标识不等于,=,=,这些运算符都可以使用。

… 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(字段名, 起始位置,取字符个数)

dual表,是专门用于函数测试和运算的,他只有一条记录

字符串拼接 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 dual;

截取数字函数 trunc(数据,保留的位数(小数点后位数)) 截取个位之后补0

例:select trunc(123.456,1) from dual;

3,日期函数

日期格式,

全日期格式 世纪信息,年月日,时分秒。

缺省日期格式,日-月-年 dd-mon-rr

修改当前会话的日期格式,会按照指定的格式输出日期

alter session set nls_date_format=’yyyy mm dd hh24:mi:ss’;

返回当前日期 sysdate

例:select sysdate from dual;

select sysdate+1 from dual; 获得明天的日期,加1,单位是天

日期是格式敏感的

求两个日期间相隔了多少个月 months_between(date1,date2)

加减指定数量的月份 add_months(date,月数),月数可以为负,负值就是减去相应的月数。

从date日期开始的之一个星期五 next_day(date,FriDay)

返回月末的日期 last_day(date)

截取日期 trunc(date,’年或月或日或时分秒’)

例:select next_day(sysdate,2) from dual;

例:select trunc(add_months(sysdate,1),’month’) from dual;

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 dual;

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 dual;

将字符转换成数字 to_number(‘…’)

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

将字符串转成日期 to_date(‘…’,’日期格式’)

例:select to_char(to_date(”,’yyyy mm dd’),’dd-month-yy’) from dual;

1、等值连接

select ,,…

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 ,,…

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 ,,…

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 ,,…..;

例: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)!=’ITH’;

select first_name,title

from s_emp

where title in (select title from s_emp

where last_name=’Smith’)

and upper(last_name)!=’ITH’;

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

一: 需求分析

二: 画E-R图

三: 转换成表关系

四: 割接(新老系统交接)

五:

E-R图属性:

* 为强制且非空属性

o 可选属性(可以有值也可以没有)

#* 表示此属性唯一且非空

实体关系:

mastbean maybean

数量关系: 多对一关系

一对多关系

一对一关系

多对多关系

之一范式,所有的属性都必须是单值,也就是属性只表示单一的意义。(记录可以重复,没有任何限制)

第二范式,属性要求唯一且非空,(记录不可重复,但是数据可能会出现冗余)。

第三范式,非主属性只能依赖于主属性,不能依赖于其他非主属性。(解决数据冗余问题)

六、约束

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

primary key (主键约束 PK)保证实体的完整性,保证记录的唯一

主键约束,唯一且非空,并且每一个表中只能有一个主键,有两个字段联合作为主键,只有两个字段放在一起唯一标识记录,叫做联合主键。

foreign key (外建约束 FK)保证引用的完整性,

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

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

index(索引)是数据库特有的一类对象,view(示图)

典型的一对多 class 对应多个学生。

student tableclass table

______________________________ _________________________

| id | name | address| class_id| | id |class_desc|class_num|

|(PK)|______|________|___(FK)__| |(pk)|__________|_________|

| | ||| | |||

一对一

student tabelshenfenzheng table

____________________ _________________________________

| id | name | address| | s_id |shenfen_desc|shenfen_num|

|(PK)|______|________| |(PK,FK)|____________|___________|

| | || ||||

多对多

student tabelzhongjian tablekecheng 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 tabletable

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));

关于写数据库 应该注意的地方的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 「数据库写作」技巧与规范,必须注意的重点事项 (写数据库 应该注意的地方)