久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

黑馬程序員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*......

主站蜘蛛池模板: 色婷婷日日躁夜夜躁| 国产精品自在线拍国产| 97人人模人人爽人人喊网| 亚洲精品综合一区二区三| 成在线人永久免费视频播放| 蜜臀精品无码av在线播放| 亚洲偷偷自拍高清| 午夜av亚洲一码二中文字幕青青| 末成年女av片一区二区| 精品国产乱码久久久久久乱码| h动漫无遮挡成本人h视频| 久久婷婷日日澡天天添| 成人国产mv免费视频| 亚洲性无码av在线| 亚洲国产一成人久久精品| 欧美情侣性视频| 被群cao的合不拢腿h纯肉视频| 免费无码毛片一区二区app| 精品国产v无码大片在线观看| 中文字幕精品一区二区2021年| 好男人资源在线社区| 免费人成网站在线观看不卡| 色翁荡息又大又硬又粗又视频软件| 芙宁娜被?吸乳羞羞A片| 孩交精品xxxx视频视频| 美女无遮挡免费视频网站| 青青草原亚洲| 久久久精品中文字幕麻豆发布| 国产精品v欧美精品v日韩精品| 亚洲色一区二区三区四区| 欧日韩无套内射变态| 日韩av无码久久精品免费| 欧洲亚洲精品久久久久| 麻豆国产原创视频在线播放| 2020久久天天躁狠狠躁夜夜| 欧美老妇交乱视频在线观看| 亚洲色婷婷婷婷五月基地| 一区二区三区四区在线 | 中国| 18禁无遮拦无码国产在线播放| 精品国产va久久久久久久冰| 免费国精产品wnw2544|