黑马程序员C语言教程:C语言基础之#define详解★

时间:2019-05-12 21:03:39下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《黑马程序员C语言教程:C语言基础之#define详解》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《黑马程序员C语言教程:C语言基础之#define详解》。

第一篇:黑马程序员C语言教程:C语言基础之#define详解

0 什么是#define #define是C语言中的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但初学者在学习时往往不能 理解该命令的本质,总是在此处产生一些困惑,在编程时误用该命令,使得程序的运行与预期的目的不一致,或者在读别人写的程序时,把运行结果理解错误,这对 C语言的学习很不利。#define命令剖析

1.1 #define的概念

#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。

该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。(1)简单的宏定义:

#define <宏名> <字符串>

例: #define PI 3.1415926(2)带参数的宏定义

#define <宏名>(<参数表>)<宏体>

例: #define A(x)x 一个标识符被宏定义后,该标识符便是一个宏名。这时,在程序中出现的是宏名,在该程序被编译前,先将宏名用被定义的字符串替换,这称为宏替换,替换后才进行编译,宏替换是简单的替换。

1.2 宏替换发生的时机

为了能够真正理解#define的作用,让我们来了解一下对C语言源程序的处理过程。当我们在一个集成的开发环境如Turbo C中将编写好的源程序进行编译时,实际经过了预处理、编译、汇编和连接几个过程,见图1。

源程序预处理器修改后的源程序编译器汇编程序汇编器可重定位的目标程序连接器可执行的目标程序图1 C语言的编译过程

其中预处理器产生编译器的输出,它实现以下的功能:

(1)

文件包含

可以把源程序中的#include 扩展为文件正文,即把包含的.h文件找到并展开到#include 所在处。(2)

条件编译

预处理器根据#if和#ifdef等编译命令及其后的条件,将源程序中的某部分包含进来或排除在外,通常把排除在外的语句转换成空行。(3)

宏展开

预处理器将源程序文件中出现的对宏的引用展开成相应的宏 定义,即本文所说的#define的功能,由预处理器来完成。

经过预处理器处理的源程序与之前的源程序有所有不同,在这个阶段所进行的工作只是纯粹的替换与展开,没有任何计算功能,所以在学习#define命令时只要能真正理解这一点,这样才不会对此命令引起误解并误用。#define使用中的常见问题解析

2.1 简单宏定义使用中出现的问题

在简单宏定义的使用中,当替换文本所表示的字符串为一个表达式时,容易引起误解和误用。如下例: 例1

#define N 2+2 int main(void){

int a=N*N;

printf(“%d”,a);}(1)出现问题:在此程序中存在着宏定义命令,宏N代表的字符串是2+2,在程序中有对宏N的使用,一般同学在读该程序时,容易产生的问题是先求解N为2+2=4,然后在程序中计算a时使用乘法,即N*N=4*4=16,其实该题的结果为8,为什么结果有这么大的偏差? return 0;

(2)问题解析:如1节所述,宏展开是在预处理阶段完成的,这个阶段把替换文本只是看作一个字符串,并不会有任何的计算发生,在展开时是在宏N出现的地方 只是简单地使用串2+2来代替N,并不会增添任何的符号,所以对该程序展开后的结果是a=2+2*2+2,计算后=8,这就是宏替换的实质,如何写程序才 能完成结果为16的运算呢?

(3)解决办法:将宏定义写成如下形式 #define N(2+2)这样就可替换成(2+2)*(2+2)=16 2.2 带参数的宏定义出现的问题

在带参数的宏定义的使用中,极易引起误解。例如我们需要做个宏替换能求任何数的平方,这就需要使用参数,以便在程序中用实际参数来替换宏定义中的参数。一般学生容易写成如下形式: #define area(x)x*x 这在使用中是很容易出现问题的,看如下的程序 int main(void){ int y=area(2+2);printf(“%d”,y);return 0;} 按理说给的参数是2+2,所得的结果应该为4*4=16,但是错了,因为该程序的实际结果为8,仍然是没能遵循纯粹的简单替换的规则,又是先计算再替换 了,在这道程序里,2+2即为area宏中的参数,应该由它来替换宏定义中的x,即替换成2+2*2+2=8了。那如果遵循(1)中的解决办法,把2+2 括起来,即把宏体中的x括起来,是否可以呢?#define area(x)(x)*(x),对于area(2+2),替换为(2+2)*(2+2)=16,可以解决,但是对于area(2+2)/area(2+2)又会怎么样 呢,有的学生一看到这道题马上给出结果,因为分子分母一样,又错了,还是忘了遵循先替换再计算的规则了,这道题替换后会变为(2+2)*(2+2)/(2+2)*(2+2)即4*4/4*4按照乘除运算规则,结果为16/4*4=4*4=16,那应该怎么呢?解决方法是在整个 宏体上再加一个括号,即#define area(x)((x)*(x)),不要觉得这没必要,没有它,是不行的。

要想能够真正使用好宏定义,那么在读别人的程序时,一定要记住先将程序中对宏的使用全部替换成它所代表的字符串,不要自作主张地添加任何其他符号,完全展 开后再进行相应的计算,就不会写错运行结果。如果是自己编程使用宏替换,则在使用简单宏定义时,当字符串中不只一个符号时,加上括号表现出优先级,如果是 带参数的宏定义,则要给宏体中的每个参数加上括号,并在整个宏体上再加一个括号。看到这里,不禁要问,用宏定义这么麻烦,这么容易出错,可不可以摒弃它,那让我们来看一下在C语言中用宏定义的好处吧。宏定义的优点

1.方便程序的修改

使用简单宏定义可用宏代替一个在程序中经常使用的常量,这样在将该常量改变时,不用对整个程序进行修改,只修改宏定义的字符串即可,而且当常量比较长时,我们可以用较短的有意义的标识符来写程序,这样更方便一些。我们所说的常量改变不是在程序运行期间改变,而是在编程期间的修改,举一个大家比较熟悉的例 子,圆周率π是在数学上常用的一个值,有时我们会用3.14来表示,有时也会用3.1415926等,这要看计算所需要的精度,如果我们编制的一个程序中 要多次使用它,那么需要确定一个数值,在本次运行中不改变,但也许后来发现程序所表现的精度有变化,需要改变它的值,这就需要修改程序中所有的相关数值,这会给我们带来一定的不便,但如果使用宏定义,使用一个标识符来代替,则在修改时只修改宏定义即可,还可以减少输入 3.1415926这样长的数值多次的情况,我们可以如此定义 #define pi 3.1415926,既减少了输入又便于修改,何乐而不为呢? 2.提高程序的运行效率

使用带参数的宏定义可完成函数调用的功能,又能减少系统开 销,提高运行效率。正如C语言中所讲,函数的使用可以使程序更加模块化,便于组织,而且可重复利用,但在发生函数调用时,需要保留调用函数的现场,以便子 函数执行结束后能返回继续执行,同样在子函数执行完后要恢复调用函数的现场,这都需要一定的时间,如果子函数执行的操作比较多,这种转换时间开销可以忽 略,但如果子函数完成的功能比较少,甚至于只完成一点操作,如一个乘法语句的操作,则这部分转换开销就相对较大了,但使用带参数的宏定义就不会出现这个问 题,因为它是在预处理阶段即进行了宏展开,在执行时不需要转换,即在当地执行。宏定义可完成简单的操

作,但复杂的操作还是要由函数调用来完成,而且宏定义 所占用的目标代码空间相对较大。所以在使用时要依据具体情况来决定是否使用宏定义。形式参数不能用带引号的字符串替换。

但是,如果在替换文本中,参数名以#作为前缀则结果将被扩展为 由 实际参数 替换 此实际参数的带引号的字符串。

例如,可以将它与字符串连接运算结合起来编写一个调试打印宏: #define dprint(expr)printf(#expr “ = %n”,expr)使用语句 dprint(x/y);调用宏时,该宏将被扩展为:printf(“x/y”“ = %n”,x/y);其中的字符串被连接起来了,这样便等价于printf(“x/y = %n”,x/y);在实际参数中,每个双引号 “ 将被替换为 ” ;反斜杠将被替换为,因此替换后的字符串是合法的字符串常量。

预处理运算符 ## 为宏扩展提供了一种连接实际参数的手段。如果替换文本中的参数与 ## 相邻,则该参数将被实际参数替换,##与前后的空白符将被删除,并对替换后的结果重新扫描。

例如,下面定义的宏paste用于连接两个参数 #define paste(front, back)front ## back 因此,宏调用past(name,1)的结果将建立记号name1.灵活运用#define,能给我们编程带来很多便利,希望大家经过这次学习,可以更好的掌握#define的使用。

第二篇:黑马程序员c语言教程:Oracle简介

9.通过子查询建表 通过子查询建表的例子

SQL>CREATE TABLE emp_41 AS SELECT id, last_name, userid, start_date FROM s_emp WHERE dept_id = 41;SQL> CREATE TABLE A as select * from B where 1=2;只要表的结构.10.用子查询建表的注意事项

可以关连多个表及用集合函数生成新表,注意选择出来的字段必须有合法的字段名称,且不能重复。

用子查询方式建立的表,只有非空NOT NULL的约束条件能继承过来, 其它的约束条件和默认值都没有继承过来.根据需要,可以用alter table add constraint ……再建立其它的约束条件,如primary key等.11.Foreign Key的可选参数ON DELETE CASCADE 在创建Foreign Key时可以加可选参数: ON DELETE CASCADE它的含义是如果删除外键主表里的内容,子表里相关的内容将一起被删除.如果没有ON DELETE CASCADE参数,子表里有内容,父表里的主关键字记录不能被删除掉.12.如果数据库表里有不满足的记录存在,建立约束条件将不会成功.13.给表创建和删除同义词的例子 SQL> CREATE SYNONYM d_sum 2 FOR dept_sum_vu;SQL> CREATE PUBLIC SYNONYM s_dept 2 FOR alice.s_dept;SQL> DROP SYNONYM s_dept;

十、ORACLE里的数据字典

1.什么是数据字典?ORACLE的数据字典是数据库的重要组成部分之一,它随着数据库 的产生而产生, 随着数据库的变化而变化, 体现为sys用户下所有的一些表和视图.2.数据字典里存了以下内容: 用户信息

用户的权限信息

所有数据对象信息表的约束条件统计分析数据库的视图等 不能手工修改数据字典里的信息.16

J2EE @ zxw 3.常用的数据字典

Dictionary 存放所有数据表,视图,同义词名称和解释 Dict_columns 数据字典里字段名称的和解释 Dba_users 用户 Dba_tablespaces 表空间

Dba_data_files 数据库的文件 Dba_free_space 空闲表空间 Dba_rollback_segs 回滚段

User_objects 数据对象 User_constraints 约束条件 User_sequences 序列号 User_views 视图 User_indexes 索引 User_synonyms 同义词

Session_roles 用户的角色 User_role_privs 用户的角色权限 User_sys_privs 用户的系统权限 User_tab_privs 用户的表级权限 V$session 实时用户情况 V$sysstat 实时系统统计 V$sesstat 实时用户统计 V$sgastat 实时SGA使用 V$locked_object 实时锁 V$controlfile 控制文件 V$logfile 日志文件 V$parameter 参数文件 4.数据字典的分类 数据字典四大类别

User_ 用户下所有数据库对象

All_ 用户权限范围内所有的数据库对象 Dba_ 所有的数据库对象

V$Content$nbsp;统计分析数据库的视图 赋于oem_monitor权限非DBA用户也可查询V$*视图

5.查询数据字典

SQL> select * from dictionary where instr(comments,'index')>0;SQL> select constraint_name, constraint_type, 2 search_condition, r_constraint_name 3 from user_constraints 4 where table_name = ‘&table_name';十一.控制数据、INSERT(往数据表里插入记录的语句)SQL> insert into 表名(字段名1, 字段名2, ……)values(值1, 值2, ……);SQL> insert into 表名(字段名1, 字段名2, ……)select(字段名1, 字段名2, ……)from 另外的表名 where 条件;可以用&标记变量的方法多次输入记录

快速插入数据的方法, 一般用于大于128M的数据转移 SQL> insert /*+ append */ into 表名

select * from 另外的用户名.另外的表名 WHERE 条件;SQL> commit;注意事项:

用INSERT /*+ APPEND */ 的方法会对target_tablename产生级别为6的独占锁,如果运行此命令时还有对target_tablename的DML操作会排队在它后面, 对OLTP系统在用的表操作是不合适的。17

J2EE @ zxw 2.插入字符串类型的字段的注意事项: 字符串类型的字段值必须用单引号括起来, 例如: ’GOOD DAY’

如果字段值里包含单引号’ 需要进行字符串转换, 我们把它替换成两个 单引号’ ’

字符串类型的字段值超过定义的长度会出错, 最好在插入前进行长度校验 ‘’ 标记是NULL, user 标明当前用户

日期字段的字段值可以用当前数据库的系统时间SYSDATE, 精确到秒

用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)TO_DATE()还有很多种日期格式, 可以参看ORACLE DOC.年-月-日 小时:分钟:秒 的格式YYYY-MM-DD HH24:MI:SS NSERT时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型, 方法借用ORACLE里自带的DBMS_LOB程序包.3、UPDATE(修改数据表里记录的语句)SQL> UPDATE 表名 SET 字段名1=值1, 字段名2=值2, …… WHERE 条件;如果修改的值N没有赋值或定义时, 将把原来的记录内容清为NULL, 最好在修改前进行非空校验;值N超过定义的长度会出错, 最好在插入前进行长度校验.新功能,可以修改子查询后的结果集

例子:SQL> update(select * from s_dept)set id=50 where id=60;

4、DELETE(删除数据表里记录的语句)SQL> DELETE FROM 表名 WHERE 条件;注意:删除记录并不能释放ORACLE里被占用的数据块表空间.它只把那些 被删除的数据块标成unused.如果确实要删除一个大表里的全部记录, 可以用 TRUNCATE 命令, 它可以释放占用的数据块表空间

SQL> TRUNCATE TABLE 表名;此操作不可回退.5、SQL语句的分类 数据定义语言(DDL):create、alter、drop(创建、修改结构、删除)(其他:rename)数据操纵语言(DML):insert、delete、select、update(增、删、查、改)(其他:truncate)

数据控制语言(DCL):grant、revoke(授权、回收)、set role 事务控制:commit、rollback、savepoint(其他:lock table、set constraint、set transaction)

审计控制:audit、noaudit 系统控制:alter system 会话控制:alter session 其他语句:comment(添加注释)、explain plan、analyze、validate、call

6、ORACLE里事务控制 Commit 提交事务 Rollback 回退事务

Savepoint 设置断点, 在事务中标记位置, 事务结束, 断点释放

事务结束的情况遇到commit或者rollback遇到DDL和DCL语句发现错误,如死锁用户退出

SQL*PLUS系统重启或崩溃 7.DML操作的注意事项 18

J2EE @ zxw 以上SQL语句对表都加上了行级锁, 确认完成后, 必须加上事物处理结束的命令COMMIT 才能正式生效, 否则改变不一定写入数据库里.行级锁也未能得到释放.如果想撤回这些操作, 可以用命令 ROLLBACK 复原.在运行INSERT, DELETE 和 UPDATE 语句前最好估算一下可能操作的记录范围, 应该把它限定在较小(一万条记录)范围内,.否则ORACLE处理这个事物用到很大的回退段.程序响应慢甚至失去响应.如果记录数上十万以上这些操作, 可以把这些SQL语句分段分次完成, 其间加上COMMIT 确认事物处理.太过频繁的commit不好

第三篇:黑马程序员c语言教程:DML语言强化

sql语言的类型

数据语言实现数据的crud

DML语句(Data Manipulation Language)数据库操作语言

insert update delete select DDL语言 data definition Lanaguage

create table

create view index sequence synonym同义词

truncate table DCL语言 data control language数据语言

commit rollback savetpointe

OCA认证 OCP(dba)一起考, 参加oracle的培训 2w Oracle数据库管理员认证专员(OCA):Oracle Certified Associate Oracle数据库管理员认证专家(OCP): Oracle Certified Professional Oracle数据库管理员认证大师(OCM): Oracle Certified Master

语法: INSERT INTO table [(column [, column...])] VALUES(value [, value...]);

--1 向表中插入所有列

insert into emp values(1, 'tom_111', 'enginerr', 7839, sysdate, 5000, 100, 10)--2 向表中插入部分列

insert into emp(empno, ename, job, hiredate)values(2, 'tom_2222', 'enginerr', sysdate)

--3 隐式插入空值: 没有写出的列,默认为null值--4 显示插入空值:--5 sql插入语言的地址符 & 取地址符后面相当于一个变量

mysql语言: preparedStatement语言 SQL> insert into emp(empno, ename, job, hiredate)values(&empno, &ename, &job, &hiredate);输入 empno 的值: 3

输入 ename 的值: 'tom_ccc' 输入 job 的值: 'job' 输入 hiredate 的值: '22-2月-81' 原值 1: insert into emp(empno, ename, job, hiredate)values(&empno, &ename, &job, &hiredate)新值 1: insert into emp(empno, ename, job, hiredate)values(3, 'tom_ccc', 'job', '22-2月-81')

&地址符, 可以在任何sql语言中使用.在select 语言中也可以使用地址符

SQL> select ename, job, &tt from emp;输入 tt 的值: deptno 原值 1: select ename, job, &tt from emp 新值 1: select ename, job, deptno from emp

--7 批量插入数据--创建一张表

create table emp10 as

select * from emp where 1=2;--一次性的将emp中所有10号部门的员工插入到emp10中

--在insert语言中使用子查询 子查询 不光用在查询套查询, 也可用在DML语句套select语句

insert into emp10--列完全一样,可以不写

select * from emp where deptno=10;delete from emp10;

有关update更新语句

UPDATE table SET column = value [, column = value,...] [WHERE condition];--列子

SQL> update emp10 set sal=2300 where empno=7934;

有关删除数据

DELETE [FROM] table [WHERE condition];

delete和truncate表区别

delete逐条删除 truncate先摧毁表再重建delete语言是DML语言 truncate是DDL

DML语言可以闪回 做错的并且提交了.可通过闪回,撤销操作

DDL语言不可以闪回 flashback

delete是逐条删除,会产生碎片, truncate不会产生碎片

行移动功能: 要开启闪回功能,必须要开启行移动功能delete不会释放空间 truncate会delete可以回滚 truncate不可以

oracle delete快 mysql truncate快.实验: 从文件中导入数据, 通过命名delete 和 truncate删除表数据 实验

从文件中导入数据

SQL> set timing off;SQL> set feedback off;SQL> drop table testdelete purge;SQL> @c:Sql.sql;SQL> SQL> set timing on;//最后删除数据表的时候,把时间打开,记录时间

SQL> delete from testdelete;已用时间: 00: 00: 00.03

从文件中导入数据

SQL> set timing off;@c:Sql.sql;

set timing off;

select count(*)from testdelete;set timing on;//最后删除数据表的时候,把时间打开,记录时间

truncate table testdelete;已用时间: 00: 00: 00.39

事务基本概念

概念

一个或者多个DML语言组成特点

要么都成功,要么都失败

特性

原子性 一致性 隔离性 持久性

事物的隔离性 多个客户端同时操作数据库的时, 要隔离他们的操作

否则:脏读 不可重复读 幻读

设置不同的搁置级别来解决oracle中的事务

事务起始标志 DML语言(oracle默认事务似是打开的)2 事务的结束标志

提交: 显示提交commit

隐式提交

1)执行DDL语言

eg create table语言 还有I个隐式的功能

提交之前的没有提交的DML语言(insert update)

2)正常退出

回滚: 显示 rollback

隐式 掉电/宕机/非正常退出==系统出错了 oracle事务控制--保存点

create table testsavepoint(tid number, tname varchar2(20));set feedback on

insert into testsavepoint values(1, 'tom1');insert into testsavepoint values(2, 'tom2');savepoint a;//创建一个保存点

insert into testsavepoint values(3, 'tom3a);rollback to savepoint a;

注意: 回退到savepoint a 前面插入的两条sql语句还没有提交;仍然还在一个事务里面;让事务结束的方法 显示 隐式 SQL> rollback / commit oracle数据的隔离级别问题

read only ,数据库几乎不做串行化操作,增加了read only SQL99

第四篇:黑马程序员c语言教程:Oracle概念(推荐)

七、在执行SQL语句时绑定变量

1.接收和定义变量的SQL*PLUS命令 ACCEPT DEFINE UNDEFINE & 2.绑定变量SQL语句的例子(1)SQL> select id, last_name, salary from s_emp where dept_id = &department_number;Enter value for department_number: 10 old 1: select id, last_name, salary from s_emp where dept_id=&department_number;new 1: select id, last_name, salary from s_emp where dept_id= 10 SQL> SET VERIFY OFF | ON;可以关闭和打开提示确认信息old 1和new 1的显示.3.绑定变量SQL语句的例子(2)SQL> select id, last_name, salary from s_emp where title = '&job_title';Enter value for job_title: Stock Clerk 11

J2EE @ zxw SQL> select id, last_name, salary from s_emp where hiredate >to_date('&start_hire_date','YYYY-MM-DD');Enter value for start_hire_date : 2001-01-01 把绑定字符串和日期类型变量时,变量外面要加单引号 也可绑定变量来查询不同的字段名 输入变量值的时候不要加;等其它符号 4.ACCEPT的语法和例子

SQL> ACCEPT variable [datatype] [FORMAT] [PROMPT text] [HIDE] 说明: variable 指变量名 datatype 指变量类型,如number,char等 format 指变量显示格

式 prompt text 可自定义弹出提示符的内容text hide 隐藏用户的输入符号 使用ACCEPT的例子:

ACCEPT p_dname PROMPT 'Provide the department name: ' ACCEPT p_salary NUMBER PROMPT 'Salary amount: ' ACCEPT pswd CHAR PROMPT 'Password: ' HIDE ACCEPT low_date date format 'YYYY-MM-DD' PROMPT“Enter the low date range('YYYY-MM-DD'):” 4.DEFINE的语法和例子

SQL> DEFINE variable = value 说明: variable 指变量名 value 指变量值

定义好了变良值后, 执行绑定变量的SQL语句时不再提示输入变量

使用DEFINE的例子:

SQL> DEFINE dname = sales SQL> DEFINE dname DEFINE dname = “sales”(CHAR)SQL> select name from dept where lower(name)='&dname';NAME-------------------------sales sales SQL> UNDEFINE dname SQL> DEFINE dname Symbol dname is UNDEFINED 5.SQL*PLUS里传递参数到保存好的*.sql文件里 SQL> @ /路径名/文件名 参数名1[,参数名2, „.] SQL> start /路径名/文件名 参数名1[,参数名2, „.] 注意事项: 一次最多只能获取9个&变量, 变量名称只能是从&1,&2到&9 变量名后不要加特殊的结束符号

如果在SQL*PLUS里要把&符号保存在ORACLE数据库里,要修改sql*plus环境变量define SQL> set define off;

八、概述数据模型和数据库设计 1.系统开发的阶段: Strategy and Analysis Design Build and Document Transition Production 12

J2EE @ zxw 2.数据模型

Model of system in client's mind Entity model of client's model Table model of entity model Tables on disk 3.实体关系模型(ERM)概念

ERM(entity relationship modeling)实体 存有特定信息的目标和事件 例如: 客户,订单等 属性 描述实体的属性 例如: 姓名,电话号码等 关系 两个实体间的关系 例如:订单和产品等 实体关系模型图表里的约定

Dashed line(虚线)可选参数 “may be”

Solid line(实线)必选参数 “must be”

Crow's foot(多线)程度参数 “one or more”

Single line(单线)程度参数 “one and only one” 4.实体关系模型例子

每个订单都必须有一个或几个客户

每个客户可能是一个或几个订单的申请者 5.实体关系的类型

1:1 一对一 例如: 的士和司机 M:1 多对一 例如: 乘客和飞机 1:M 一对多 例如: 员工和技能 6.校正实体关系的原则

属性是单一值的, 不会有重复

属性必须依存于实体, 要有唯一标记

没有非唯一属性依赖于另一个非唯一的属性 7.定义结构时的注意事项 减少数据冗余

减少完整性约束产生的问题 确认省略的实体,关系和属性 8.完整性约束的要求

Primary key 主关键字 唯一非NULL Foreign key 外键 依赖于另一个Primary key,可能为NULL Column 字段名 符合定义的类型和长度

Constraint 约束条件 用户自定义的约束条件,要符合工作流要求 例如: 一个销售人员的提成不能超过它的基本工资

Candidate key 候选主关键字 多个字段名可组成候选主关键字, 其组合是唯一和非NULL的

9.把实体关系图映射到关系数据库对象的方法 把简单实体映射到数据库里的表

把属性映射到数据库里的表的字段, 标明类型和注释 把唯一标记映射到数据库里的唯一关键字 把实体间的关系映射到数据库里的外键 13

J2EE @ zxw 其它的考虑: 设计索引,使查询更快

建立视图,使信息有不同的呈现面, 减少复杂的SQL语句 计划存储空间的分配 重新定义完整性约束条件

10.实体关系图里符号的含义 PK 唯一关键字的字段 FK 外键的字段

FK1,FK2 同一个表的两个不同的外键

FK1,FK1 两个字段共同组成一个外键 NN 非null字段 U 唯一字段

U1,U1 两个字段共同组成一个唯一字段

九、创建表

1.ORACLE常用的字段类型 ORACLE常用的字段类型有

VARCHAR2(size)可变长度的字符串, 必须规定长度 CHAR(size)固定长度的字符串, 不规定长度默认值为1

NUMBER(p,s)数字型p是位数总长度, s是小数的长度, 可存负数 最长38位.不够位时会四舍五入.DATE 日期和时间类型

LOB 超长字符, 最大可达4G CLOB 超长文本字符串 BLOB 超长二进制字符串

BFILE 超长二进制字符串, 保存在数据库外的文件里是只读的.数字字段类型位数及其四舍五入的结果 原始数值1234567.89 数字字段类型位数 存储的值 Number 1234567.89 Number 12345678 Number 错

Number(9,1)1234567.9 Number(9,3)错 Number(7,2)错

Number(5,-2)1234600 Number(5,-4)1230000 Number(*,1)1234567.9 2.创建表时给字段加默认值 和约束条件 创建表时可以给字段加上默认值

例如 : 日期字段 DEFAULT SYSDATE 这样每次插入和修改时, 不用程序操作这个字段都能得到动作的时间 14

J2EE @ zxw 创建表时可以给字段加上约束条件 例如: 非空 NOT NULL 不允许重复 UNIQUE 关键字 PRIMARY KEY 按条件检查 CHECK(条件)外键 REFERENCES 表名(字段名)3.创建表的例子

CREATE TABLE DEPT(EPTNO NUMBER(2)CONSTRAINT PK_DEPT PRIMARY KEY, DNAME VARCHAR2(14), LOC VARCHAR2(13));CREATE TABLE region(ID number(2)NOT NULL PRIMARY KEY, postcode number default '0' NOT NULL, areaname varchar2(30)default ' ' NOT NULL);4.创建表时的命名规则和注意事项

表名和字段名的命名规则:必须以字母开头,可以含符号A-Z,a-z,0-9,_,$,# 大小写不区分

不用SQL里的保留字, 一定要用时可用双引号把字符串括起来. 用和实体或属性相关的英文符号长度有一定的限制 注意事项: 建表时可以用中文的字段名, 但最好还是用英文的字段名

创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面 建表时如果有唯一关键字或者唯一的约束条件,建表时自动建了索引 一个表的最多字段个数也是有限制的,254个.5.约束名的命名规则和语法

约束名的命名规则约束名如果在建表的时候没有指明,系统命名规则是SYS_Cn(n是数字)约束名字符串的命名规则同于表和字段名的命名规则 6.使用约束时的注意事项

约束里不能用系统函数,如SYSDATE和别的表的字段比较 可以用本表内字段的比较

想在事务处理后, 做约束的检查

SQL> alter session set constraints deferred.7.由实体关系图到创建表的例子 s_dept 前提条件:已有region表且含唯一关键字的字段id SQL> CREATE TABLE s_dept(id NUMBER(7)CONSTRAINT s_dept_id_pk PRIMARY KEY, name VARCHAR2(25)CONSTRAINT s_dept_name_nn NOT NULL, region_id NUMBER(7)CONSTRAINT s_dept_region_id_fk REFERENCES region(id), CONSTRAINT s_dept_name_region_id_uk UNIQUE(name, region_id));8.较复杂的创建表例子 15

J2EE @ zxw SQL> CREATE TABLE s_emp(id NUMBER(7)CONSTRAINT s_emp_id_pk PRIMARY KEY, last_name VARCHAR2(25)CONSTRAINT s_emp_last_name_nn NOT NULL,first_name VARCHAR2(25), userid VARCHAR2 CONSTRAINT s_emp_userid_nn NOT NULL CONSTRAINT s_emp_userid_uk UNIQUE, start_date DATE DEFAULT SYSDATE, comments VARCHAR2(25), manager_id NUMBER(7), title VARCHAR2(25), dept_id NUMBER(7)CONSTRAINT s_emp_dept_id_fk REFERENCES s_dept(id), salary NUMBER(11,2), commission_pct NUMBER(4,2)CONSTRAINT s_emp_commission_pct_ck CHECK(commission_pct IN(10,12.5,15,17.5,20)));

第五篇:黑马程序员c语言教程:多表查询

笛卡尔积

部门表

笛卡尔积产生结果: 行数 两个表相乘

列数: 行数相加 原因

条件等值连接

select ****

from tab1, tab2

where tab1.a = tab2.a

select count(e.ename)

from emp e, dept d

3* where e.deptno = d.deptno

SQL> /

COUNT(E.ENAME)

--------------

多表查询关键点:

等值连接 eg:查询员工信息,员工号,姓名,月薪,部门名称

select e.empno, e.ename, e.sal, d.dname

from emp e, dept d

3* where e.deptno = d.deptno

SQL> /

EMPNO ENAME SAL DNAME

--------------------------------------------

7369 SMITH 800 RESEARCH

7499 ALLEN 1600 SALES

7521 WARD 1250 SALES

7566 JONES 2975 RESEARCH

7654 MARTIN 1250 SALES

7698 BLAKE 2850 SALES

7782 CLARK 2450 ACCOUNTING

7788 SCOTT 3000 RESEARCH

7839 KING 5000 ACCOUNTING

7844 TURNER 1500 SALES

7876 ADAMS 1100 RESEARCH

7900 JAMES 950 SALES

7902 FORD 3000 RESEARCH

7934 MILLER 1300 ACCOUNTING

已选择14行。

不等值连接: eg:查询员工信息,员工号,姓名,月薪, 薪水级别

select e.empno, e.ename, e.sal, s.grade from emp e, salgrade s where e.sal >= s.losal and e.sal <=s.hisal

select e.empno, e.ename, e.sal, s.grade from emp e, salgrade s where e.sal between s.losal and s.hisal

外连接 eg:按部门统计员工人数: 部门号 部门名称 各部门人数

分析1: 10 20 30 ====> 分组

分析2: 因为各部门人数 是在员工表中..多表查询

步骤1

select d.deptno, d.dname, count(e.empno)

from dept d, emp e

where d.deptno = e.deptno

group by d.deptno, d.dname

DEPTNO DNAME COUNT(E.EMPNO)

-------------------------------------

ACCOUNTING 3

RESEARCH 5

SALES 6

步骤2 外连接....分析:为什么40号部门没有统计出来

原因: 因员工表里面 没有40号部门的员工(现象)

where d.deptno = e.deptno(sql)问题的本质

40 =====>期望: 在连接条件不成立的条件下,也要把部门编号40 给显示出来....外连接...select d.deptno, d.dname, count(e.empno)

from dept d, emp e

where d.deptno = e.deptno(+)

group by d.deptno, d.dname

左外连接:(+)写在=号的右边

自连接:--查询员工信息 ,老板信息

显示: ****的老板是**** 自连接: 把一张表看成两张表,自连接

--员工表的老板 是 老板表的员工

select e.ename, b.ename

from emp e, emp b

where e.mgr = b.empno

select e.ename|| '的老板是' || b.ename

from emp e, emp b

where e.mgr = b.empno

====> 需求 把员工表的每一条记录都显示出来

select e.ename|| '的老板是' || b.ename

from emp e, emp b

where e.mgr = b.empno(+)

select e.ename|| '的老板是' || nvl(b.ename, '他自己')

from emp e, emp b

where e.mgr = b.empno(+)

SMITH的老板是FORD

MPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO----------------------------------------------------------------------------7369 SMITH CLERK 7902 17-12月-80 800 20 7499 ALLEN SALESMAN 7698 20-2月-81 1600 300 30 7521 WARD SALESMAN 7698 22-2月-81 1250 500 30 7566 JONES MANAGER 7839 02-4月-81 2975 20 7654 MARTIN SALESMAN 7698 28-9月-81 1250 1400 30 7698 BLAKE MANAGER 7839 01-5月-81 2850 30 7782 CLARK MANAGER 7839 09-6月-81 2450 10 7788 SCOTT ANALYST 7566 19-4月-87 3000 20 7839 KING PRESIDENT 17-11月-81 5000 10 7844 TURNER SALESMAN 7698 08-9月-81 1500 0 30 7876 ADAMS CLERK 7788 23-5月-87 1100 20 7900 JAMES CLERK 7698 03-12月-81 950 30 7902 FORD ANALYST 7566 03-12月-81 3000 20 7934 MILLER CLERK 7782 23-1月-82 1300 10

14行。

下载黑马程序员C语言教程:C语言基础之#define详解★word格式文档
下载黑马程序员C语言教程:C语言基础之#define详解★.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    黑马程序员c语言教程:Oracle指令大全

    ------------------------- --order by的用法 --员工信息按照姓名正序排列 select * from emp order by ename asc; --员工信息按照倒叙排列 select * from emp order by en......

    黑马程序员c语言教程:Oracle指令大全

    --sql structured query language --DML--Data Manipulation Language--数据操作语言 query information (SELECT), add new rows (INSERT), modify existing rows (UPDAT......

    黑马程序员c语言教程:Oracle概念

    一、选择行 1. 简单的SELECT 语句 SELECT 字段名1 [AS] '字段名1 解释' FROM table; 2. 处理NULL NVL函数可把NULL转换成其它类型的符号 编程技巧: NVL函数在多条件模糊查询......

    黑马程序员c语言教程:Oracle指令大全

    --什么时候用外连接呢?比如领导向你要所有学生的列表,顺便把所属的班级也列出来,就需要外连接 --在Where语句中使用子查询 --- --雇员中最高薪水的人员名称 --1,先求出最高......

    黑马程序员c语言教程:SQL函数

    日期 Oracle 中的日期型数据实际含有两个值: 日期和时间。 默认的日期格式是 DD-MON-RR. 函数SYSDATE 返回: 日期 时间 在日期上加上或减去一个数字结果仍为日期。 两个日......

    黑马程序员C语言教程:文本三剑客之一(优秀范文五篇)

    文本三剑客之一:awk简介 以下内容在linux可以使用info awk命令获取 简介 awk的功能主要在报表处理方面,有强大的功能。awk命令对文件每次读入一行,默认按照空格分隔来进行处理......

    黑马程序员c语言教程:Oracle概念(5篇)

    四、从多个表里选取数据记录 1. 数据表间的连接 简单的连接语法: SELECT 字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 表名1.字段名 = 表名2. 字段名 [ AND …......

    黑马程序员C语言教程:QSignalMapper的使用

    QSignalMapper信号转发器的使用 适用范围 简单的理解,可以把SignalMapper这个类看成是信号的翻译和转发器,它可以把一个无参数的信号翻译成带int参数、QString参数、QObject*......