『壹』 sql的問題
說明:復製表(只復制結構,源表名:a 新表名:b)
SQL: select * into b from a where 1<>1
說明:拷貝表(拷貝數據,源表名:a 目標表名:b)
SQL: insert into b(a, b, c) select d,e,f from b;
說明:顯示文章、提交人和最後回復時間
SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
說明:外連接查詢(表名1:a 表名2:b)
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
說明:日程安排提前五分鍾提醒
SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5
說明:兩張關聯表,刪除主表中已經在副表中沒有的信息
SQL:
delete from info where not exists ( select * from infobz where info.infid=infobz.infid )
說明:--
SQL:
SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE
FROM TABLE1,
(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE
FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,
(SELECT NUM, UPD_DATE, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =
TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') ¦¦ '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y,
WHERE X.NUM = Y.NUM (+)
AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B
WHERE A.NUM = B.NUM
說明:--
SQL:
select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名稱='"&strdepartmentname&"' and 專業名稱='"&strprofessionname&"' order by 性別,生源地,高考總成績
說明:
從資料庫中去一年的各單位電話費統計(電話費定額賀電化肥清單兩個表來源)
SQL:
SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,
SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC
FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration
FROM TELFEESTAND a, TELFEE b
WHERE a.tel = b.telfax) a
GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')
說明:四表聯查問題:
SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
說明:得到表中最小的未使用的ID號
SQL:
SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID
FROM Handle
WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)
掌握SQL四條最基本的數據操作語句:Insert,Select,Update和Delete。
練掌握SQL是資料庫用戶的寶貴財 富。在本文中,我們將引導你掌握四條最基本的數據操作語句—SQL的核心功能—來依次介紹比較操作符、選擇斷言以及三值邏輯。當你完成這些學習後,顯然你已經開始算是精通SQL了。
在我們開始之前,先使用CREATE TABLE語句來創建一個表(如圖1所示)。DDL語句對資料庫對象如表、列和視進行定義。它們並不對表中的行進行處理,這是因為DDL語句並不處理資料庫中實際的數據。這些工作由另一類SQL語句—數據操作語言(DML)語句進行處理。
SQL中有四種基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由於這是大多數SQL用戶經常用到的,我們有必要在此對它們進行一一說明。在圖1中我們給出了一個名為EMPLOYEES的表。其中的每一行對應一個特定的雇員記錄。請熟悉這張表,我們在後面的例子中將要用到它。
INSERT語句
用戶可以用INSERT語句將一行記錄插入到指定的一個表中。例如,要將雇員John Smith的記錄插入到本例的表中,可以使用如下語句:
INSERT INTO EMPLOYEES VALUES
('Smith','John','1980-06-10',
'Los Angles',16,45000);
通過這樣的INSERT語句,系統將試著將這些值填入到相應的列中。這些列按照我們創建表時定義的順序排列。在本例中,第一個值「Smith」將填到第一個列LAST_NAME中;第二個值「John」將填到第二列FIRST_NAME中……以此類推。
我們說過系統會「試著」將值填入,除了執行規則之外它還要進行類型檢查。如果類型不符(如將一個字元串填入到類型為數字的列中),系統將拒絕這一次操作並返回一個錯誤信息。
如果SQL拒絕了你所填入的一列值,語句中其他各列的值也不會填入。這是因為SQL提供對事務的支持。一次事務將資料庫從一種一致性轉移到另一種一致性。如果事務的某一部分失敗,則整個事務都會失敗,系統將會被恢復(或稱之為回退)到此事務之前的狀態。
回到原來的INSERT的例子,請注意所有的整形十進制數都不需要用單引號引起來,而字元串和日期類型的值都要用單引號來區別。為了增加可讀性而在數字間插入逗號將會引起錯誤。記住,在SQL中逗號是元素的分隔符。
同樣要注意輸入文字值時要使用單引號。雙引號用來封裝限界標識符。
對於日期類型,我們必須使用SQL標准日期格式(yyyy-mm-dd),但是在系統中可以進行定義,以接受其他的格式。當然,2000年臨近,請你最好還是使用四位來表示年份。
既然你已經理解了INSERT語句是怎樣工作的了,讓我們轉到EMPLOYEES表中的其他部分:
INSERT INTO EMPLOYEES VALUES
('Bunyan','Paul','1970-07-04',
'Boston',12,70000);
INSERT INTO EMPLOYEES VALUES
('John','Adams','1992-01-21',
'Boston',20,100000);
INSERT INTO EMPLOYEES VALUES
('Smith','Pocahontas','1976-04-06',
'Los Angles',12,100000);
INSERT INTO EMPLOYEES VALUES
('Smith','Bessie','1940-05-02',
'Boston',5,200000);
INSERT INTO EMPLOYEES VALUES
('Jones','Davy','1970-10-10',
'Boston',8,45000);
INSERT INTO EMPLOYEES VALUES
('Jones','Indiana','1992-02-01',
'Chicago',NULL,NULL);
在最後一項中,我們不知道Jones先生的工薪級別和年薪,所以我們輸入NULL(不要引號)。NULL是SQL中的一種特殊情況,我們以後將進行詳細的討論。現在我們只需認為NULL表示一種未知的值。
有時,像我們剛才所討論的情況,我們可能希望對某一些而不是全部的列進行賦值。除了對要省略的列輸入NULL外,還可以採用另外一種INSERT語句,如下:
INSERT INTO EMPLOYEES(
FIRST_NAME, LAST_NAME,
HIRE_DATE, BRANCH_OFFICE)
VALUE(
'Indiana','Jones',
'1992-02-01','Indianapolis');
這樣,我們先在表名之後列出一系列列名。未列出的列中將自動填入預設值,如果沒有設置預設值則填入NULL。請注意我們改變了列的順序,而值的順序要對應新的列的順序。如果該語句中省略了FIRST_NAME和LAST_NAME項(這兩項規定不能為空),SQL操作將失敗。
讓我們來看一看上述INSERT語句的語法圖:
INSERT INTO table
[(column { ,column})]
VALUES
(columnvalue [{,columnvalue}]);
和前一篇文章中一樣,我們用方括弧來表示可選項,大括弧表示可以重復任意次數的項(不能在實際的SQL語句中使用這些特殊字元)。VALUE子句和可選的列名列表中必須使用圓括弧。
SELECT語句
SELECT語句可以從一個或多個表中選取特定的行和列。因為查詢和檢索數據是資料庫管理中最重要的功能,所以SELECT語句在SQL中是工作量最大的部分。實際上,僅僅是訪問資料庫來分析數據並生成報表的人可以對其他SQL語句一竅不通。
SELECT語句的結果通常是生成另外一個表。在執行過程中系統根據用戶的標准從資料庫中選出匹配的行和列,並將結果放到臨時的表中。在直接SQL(direct SQL)中,它將結果顯示在終端的顯示屏上,或者將結果送到列印機或文件中。也可以結合其他SQL語句來將結果放到一個已知名稱的表中。
SELECT語句功能強大。雖然表面上看來它只用來完成本文第一部分中提到的關系代數運算「選擇」(或稱「限制」),但實際上它也可以完成其他兩種關系運算—「投影」和「連接」,SELECT語句還可以完成聚合計算並對數據進行排序。
SELECT語句最簡單的語法如下:
SELECT columns FROM tables;
當我們以這種形式執行一條SELECT語句時,系統返回由所選擇的列以及用戶選擇的表中所有指定的行組成的一個結果表。這就是實現關系投影運算的一個形式。
讓我們看一下使用圖1中EMPLOYEES表的一些例子(這個表是我們以後所有SELECT語句實例都要使用的。而我們在圖2和圖3中給出了查詢的實際結果。我們將在其他的例子中使用這些結果)。
假設你想查看雇員工作部門的列表。那下面就是你所需要編寫的SQL查詢:
SELECT BRANCH_OFFICE FROM EMPLOYEES;
以上SELECT語句的執行將產生如圖2中表2所示的結果。
由於我們在SELECT語句中只指定了一個列,所以我們的結果表中也只有一個列。注意結果表中具有重復的行,這是因為有多個雇員在同一部門工作(記住SQL從所選的所有行中將值返回)。要消除結果中的重復行,只要在SELECT語句中加上DISTINCT子句:
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES;
這次查詢的結果如表3所示。
現在已經消除了重復的行,但結果並不是按照順序排列的。如果你希望以字母表順序將結果列出又該怎麼做呢?只要使用ORDER BY子句就可以按照升序或降序來排列結果:
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES
ORDER BY BRANCH_OFFICE ASC;
這一查詢的結果如表4所示。請注意在ORDER BY之後是如何放置列名BRANCH _OFFICE的,這就是我們想要對其進行排序的列。為什麼即使是結果表中只有一個列時我們也必須指出列名呢?這是因為我們還能夠按照表中其他列進行排序,即使它們並不顯示出來。列名BRANCH_ OFFICE之後的關鍵字ASC表示按照升序排列。如果你希望以降序排列,那麼可以用關鍵字DESC。
同樣我們應該指出ORDER BY子句只將臨時表中的結果進行排序;並不影響原來的表。
假設我們希望得到按部門排序並從工資最高的雇員到工資最低的雇員排列的列表。除了工資括弧中的內容,我們還希望看到按照聘用時間從最近聘用的雇員開始列出的列表。以下是你將要用到的語句:
SELECT BRANCH_OFFICE,FIRST_NAME,
LAST_NAME,SALARY,HIRE_DATE
FROM EMPLOYEES
ORDER BY SALARY DESC,
HIRE_DATE DESC;
這里我們進行了多列的選擇和排序。排序的優先順序由語句中的列名順序所決定。SQL將先對列出的第一個列進行排序。如果在第一個列中出現了重復的行時,這些行將被按照第二列進行排序,如果在第二列中又出現了重復的行時,這些行又將被按照第三列進行排序……如此類推。這次查詢的結果如表5所示。
將一個很長的表中的所有列名寫出來是一件相當麻煩的事,所以SQL允許在選擇表中所有的列時使用*號:
SELECT * FROM EMPLOYEES;
這次查詢返回整個EMPLOYEES表,如表1所示。
下面我們對開始時給出的SELECT語句的語法進行一下更新(豎直線表示一個可選項,允許在其中選擇一項。):
SELECT [DISTINCT]
(column [{, columns}])| *
FROM table [ {, table}]
[ORDER BY column [ASC] | DESC
[ {, column [ASC] | DESC }]];
定義選擇標准
在我們目前所介紹的SELECT語句中,我們對結果表中的列作出了選擇但返回的是表中所有的行。讓我們看一下如何對SELECT語句進行限制使得它只返回希望得到的行:
SELECT columns FROM tables [WHERE predicates];
WHERE子句對條件進行了設置,只有滿足條件的行才被包括到結果表中。這些條件由斷言(predicate)進行指定(斷言指出了關於某件事情的一種可能的事實)。如果該斷言對於某個給定的行成立,該行將被包括到結果表中,否則該行被忽略。在SQL語句中斷言通常通過比較來表示。例如,假如你需要查詢所有姓為Jones的職員,則可以使用以下SELECT語句:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones';
LAST_NAME = 'Jones'部分就是斷言。在執行該語句時,SQL將每一行的LAST_NAME列與「Jones」進行比較。如果某一職員的姓為「Jones」,即斷言成立,該職員的信息將被包括到結果表中(見表6)。
使用最多的六種比較
我們上例中的斷言包括一種基於「等值」的比較(LAST_NAME = 'Jones'),但是SQL斷言還可以包含其他幾種類型的比較。其中最常用的為:
等於 =
不等於 <>
小於 <
大於 >
小於或等於 <=
大於或等於 >=
下面給出了不是基於等值比較的一個例子:
SELECT * FROM EMPLOYEES
WHERE SALARY > 50000;
這一查詢將返回年薪高於$50,000.00的職員(參見表7)。
邏輯連接符
有時我們需要定義一條不止一種斷言的SELECT語句。舉例來說,如果你僅僅想查看Davy Jones的信息的話,表6中的結果將是不正確的。為了進一步定義一個WHERE子句,用戶可以使用邏輯連接符AND,OR和NOT。為了只得到職員Davy Jones的記錄,用戶可以輸入如下語句:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy';
在本例中,我們通過邏輯連接符AND將兩個斷言連接起來。只有兩個斷言都滿足時整個表達式才會滿足。如果用戶需要定義一個SELECT語句來使得當其中任何一項成立就滿足條件時,可以使用OR連接符:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith';
有時定義一個斷言的最好方法是通過相反的描述來說明。如果你想要查看除了Boston辦事處的職員以外的其他所有職員的信息時,你可以進行如下的查詢:
SELECT * FROM EMPLOYEES
WHERE NOT(BRANCH_OFFICE = 'Boston');
關鍵字NOT後面跟著用圓括弧括起來的比較表達式。其結果是對結果取否定。如果某一職員所在部門的辦事處在Boston,括弧內的表達式返回true,但是NOT操作符將該值取反,所以該行將不被選中。
斷言可以與其他的斷言嵌套使用。為了保證它們以正確的順序進行求值,可以用括弧將它們括起來:
SELECT * FROM EMPLOYEES
WHERE (LAST_NAME = 'Jones'
AND FIRST_NAME = 'Indiana')
OR (LAST_NAME = 'Smith'
AND FIRST_NAME = 'Bessie');
SQL沿用數學上標準的表達式求值的約定—圓括弧內的表達式將最先進行求值,其他表達式將從左到右進行求值。
以上對邏輯連接符進行了說明,在對下面的內容進行說明之前,我們再一次對SELECT語句的語法進行更新:
SELECT [DISTINCT]
(column [{, column } ] )| *
FROM table [ { , table} ]
[ORDER BY column [ASC] | [DESC
[{ , column [ASC] | [DESC } ] ]
WHERE predicate [ { logical-connector predicate } ];
NULL和三值邏輯
在SQL中NULL是一個復雜的話題,關於NULL的詳細描述更適合於在SQL的高級教程而不是現在的入門教程中進行介紹。但由於NULL需要進行特殊處理,並且你也很可能會遇到它,所以我們還是簡略地進行一下說明。
首先,在斷言中進行NULL判斷時需要特殊的語法。例如,如果用戶需要顯示所有年薪未知的職員的全部信息,用戶可以使用如下SELECT語句:
SELECT * FROM EMPLOYEES
WHERE SALARY IS NULL;
相反,如果用戶需要所有已知年薪數據的職員的信息,你可以使用以下語句:
SELECT * FROM EMPLOYEES
WHERE SALARY IS NOT NULL;
請注意我們在列名之後使用了關鍵字IS NULL或IS NOT NULL,而不是標準的比較形式:COLUMN = NULL、COLUMN <> NULL或是邏輯操作符NOT(NULL)。
這種形式相當簡單。但當你不明確地測試NULL(而它們確實存在)時,事情會變得很混亂。
例如,回過頭來看我們圖1中的EM-PLOYEES表,可以看到Indiana Jones的工薪等級或年薪值都是未知的。這兩個列都包含NULL。可以想像運行如下的查詢:
SELECT * FROM EMPLOYEES
WHERE GRADE <= SALARY;
此時,Indiana Jones應該出現在結果表中。因為NULL都是相等的,所以可以想像它們是能夠通過GRADE小於等於SALARY的檢查的。這其實是一個毫無疑義的查詢,但是並沒有關系。SQL允許進行這樣的比較,只要兩個列都是數字類型的。然而,Indiana Jones並沒有出現在查詢的結果中,為什麼?
正如我們早先提到過的,NULL表示未知的值(而不是象某些人所想像的那樣表示一個為NULL的值)。對於SQL來說意味著這個值是未知的,而只要這個值為未知,就不能將其與其他值比較(即使其他值也是NULL)。所以SQL允許除了在true 和false之外還有第三種類型的真值,稱之為「非確定」(unknown)值。
如果比較的兩邊都是NULL,整個斷言就被認為是非確定的。將一個非確定斷言取反或使用AND或OR與其他斷言進行合並之後,其結果仍是非確定的。由於結果表中只包括斷言值為「真」的行,所以NULL不可能滿足該檢查。從而需要使用特殊的操作符IS NULL和IS NOT NULL。
UPDATE語句
UPDATE語句允許用戶在已知的表中對現有的行進行修改。
例如,我們剛剛發現Indiana Jones的等級為16,工資為$40,000.00,我們可以通過下面的SQL語句對資料庫進行更新(並清除那些煩人的NULL)。
UPDATE EMPLOYEES
SET GRADE = 16, SALARY = 40000
WHERE FIRST_NAME = 'Indiana'
AND LAST_NAME = 'Jones';
上面的例子說明了一個單行更新,但是UPDATE語句可以對多行進行操作。滿足WHERE條件的所有行都將被更新。如果,你想讓Boston辦事處中的所有職員搬到New York,你可以使用如下語句:
UPDATE EMPLOYEES
SET BRANCH_OFFICE = 'New York'
WHERE BRANCH_OFFICE = 'Boston';
如果忽略WHERE子句,表中所有行中的部門值都將被更新為'New York'。
UPDATE語句的語法流圖如下面所示:
UPDATE table
SET column = value [{, column = value}]
[ WHERE predicate [ { logical-connector predicate}]];
DELETE語句
DELETE語句用來刪除已知表中的行。如同UPDATE語句中一樣,所有滿足WHERE子句中條件的行都將被刪除。由於SQL中沒有UNDO語句或是「你確認刪除嗎?」之類的警告,在執行這條語句時千萬要小心。如果決定取消Los Angeles辦事處並解僱辦事處的所有職員,這一卑鄙的工作可以由以下這條語句來實現:
DELETE FROM EMPLOYEES
WHERE BRANCH_OFFICE = 'Los Angeles';
如同UPDATE語句中一樣,省略WHERE子句將使得操作施加到表中所有的行。
DELETE語句的語法流圖如下面所示:
DELETE FROM table
[WHERE predicate [ { logical-connector predicate} ] ];
現在我們完成了數據操作語言(DML)的主要語句的介紹。我們並沒有對SQL能完成的所有功能進行說明。SQL還提供了許多的功能,如求平均值、求和以及其他對表中數據的計算,此外SQL還能完成從多個表中進行查詢(多表查詢,或稱之為連接)的工作。這種語言還允許你使用GRANT和REVOKE命令控制使用者的數據訪問許可權。
Visual C++中實現對圖像數據的讀取顯示
2003-12-9加入 來自yesky 作者劉 濤 4條評論 點擊3030次
在利用VC進行資料庫編程時,經常需要處理資料庫中的圖像數據,將該圖像從資料庫中讀取出來並顯示,圖像數據與文本欄位不同,它是作為OLE欄位在資料庫中存儲,通過數據集對象的成員變數自動交換得到的圖像數據,得到的數據並不能直接顯示,如何處理圖像數據,一直是資料庫編程中的一個難點,目前關於VC進行資料庫編程的資料不少,但很少涉及圖像數據的操作,筆者針對一現狀,結合自己開發的一個項目,解決了如何顯示資料庫中的圖像這一問題,本文以操作ACESS資料庫為例子,講解一下自己的實現思路,希望對愛好VC編程的朋友們有所幫助,以起到拋磚引玉的作用。
為了簡化問題,該資料庫的表中只有一個名為Images的OLE欄位,我使用DAO連接操作資料庫,讀取的圖像數據顯示在一個對話框上,至於使用ODBC、DAO還是ADO,這要根據具體情況而定,但無論使用哪一種,對圖像的顯示來說,實現的過程是大同小異的。由於篇幅有限,文章中對如何實現資料庫的連接不再作具體的說明,有興趣的讀者朋友可以參考VC資料庫編程的資料。實現過程中,首先定義一個CDaoRecordset的子類 CimageData如下:
class CimageData : public CDaoRecordset
{
public:
CimageData (CDaoDatabase* pDatabase = NULL);
DECLARE_DYNAMIC(CimageData)
file://{{AFX_FIELD(CimageData, CDaoRecordset)
CByteArray m_Images;//聲明位元組數組用來存放圖像數據
file://}}AFX_FIELD
// Overrides
// ClassWizard generated virtual function overrides
file://{{AFX_VIRTUAL(CimageData)
public:
virtual CString GetDefaultDBName();
virtual CString GetDefaultSQL();
virtual void DoFieldExchange(CDaoFieldExchange* pFX);
file://}}AFX_VIRTUAL
該類的實現為:
CimageData:: CimageData (CDaoDatabase* pdb)
: CDaoRecordset(pdb)
{
file://{{AFX_FIELD_INIT(CimageData)
m_nFields = 1;//資料庫的表中僅有一個欄位
file://}}AFX_FIELD_INIT
m_nDefaultType = dbOpenDynaset;//以動態集方式打開資料庫
}
CString CimageData::GetDefaultDBName()
{
return _T("E:\\IMAGES.mdb");//默認的ACESS資料庫在E盤,名為IMAGES
}
CString CimageData::GetDefaultSQL()
{
return _T("[Table]");//默認打開資料庫中名為"Table"的表
}
void CimageData::DoFieldExchange(CDaoFieldExchange* pFX)
{
file://{{AFX_FIELD_MAP(CimageData)
pFX->SetFieldType(CDaoFieldExchange::outputColumn);
DFX_Binary(pFX, _T("[Images]"), m_Images);//以二進制方式在Images欄位和m_Images變數間交換數據
file://}}AFX_FIELD_MAP
}
有了該類,就可以定義相應的對象來與資料庫中的圖像欄位交換數據,下面定義的函數GetImageData()說明了如何根據讀取的OLE欄位數據生成待顯示的圖像,需要注意的是該函數中使用的CBitmap類的變數Bitmap是預定義的一個全局變數:
BOOL CImageDlg:: GetImageData(CByteArray & DBArray)
{
CByteArray Array;
Array.Copy( DBArray);
int HeaderLen = 78 + sizeof(BITMAPFILEHEADER); file://確定圖像頭信息的起始位置
Array.RemoveAt( 0, HeaderLen ); // 移動到圖像頭信息的起始位置
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)Array.GetData() ;
BITMAPINFO &bmInfo = *(LPBITMAPINFO)Array.GetData() ;
file://得到圖像數據的頭信息
int nColors=bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount;
file://確定圖像的顏色數
LPVOID lpDIBBits;
if( bmInfo.bmiHeader.biBitCount > 8 )
lpDIBBits=(LPVOID)((LPDWORD)(bmInfo.bmiColors+bmInfo.bmiHeader.biClrUsed)+
((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
else
lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
file://得到圖像各個像素的具體數據
CClientDC dc(NULL);
HBITMAP hBmp = CreateDIBitmap( dc.m_hDC,
&bmiHeader,
CBM_INIT,
『貳』 問個難點的SQL語句.
1:
select * from 表 distinct
2:
go top
a=name
locate for name=a
if found()
skip
if not .eof.
delete
endif
endif
『叄』 使用SQL語句創建並測試資料庫的難點和注意事項是什麼
首先說說怎麼用SQL語句創建資料庫,創建資料庫的語句有如下幾種:
1. CREATE TABLE(創建新表)
2. CREATE INDEX(增加索引)
3. DROP INDEX(刪除索引)
4. CONSTRAINT(約束語句)
5. ALTER TABLE(修改表)
6. DROP TABLE(刪除表)
CREATE TABLE語句:
在資料庫中生成新表,表中欄位的類型能夠為:INTEGER(整型)、LONG(長整型)、 SINGLE(單精度浮點數)、DOUBLE(雙精度浮點數)、DATETIME(日期型,也能夠寫成DATE)、BIT(布爾型)、 TEXT(字元串型,最大255個位元組)、MEMO(字元串型,最大可達1.2G位元組)、 COUNTER(自動遞增長整型,可確定記錄的唯一性)、CURRENCY(貨幣型,精確到小數點左邊15位,右邊4位)、 BINARY(位元組型,最大255個)、LONGBINARY(用於OLE對象)、GUID(全局唯一標識符)。
生成表NewTable,該表有文本欄位Field1和整型欄位Field2,表名和欄位名能夠隨便您取,不區分大小寫,但是,有些保留字不能用作表名欄位名,比如Number
CREATE TABLE NewTable(Field1 TEXT(30), Field2 INTEGER);
CREATE INDEX語句:
INDEX是為了加快查找記錄的速度,或是為了增加欄位約束關系而配置的。
創建索引語句執行前表中能夠有記錄,但存在的記錄必須滿足該索引語句的約束關系,否則語句不能執行,另外要注意的是在同一個資料庫中(而不但僅是在同一個表中),索引名不能相同,否則語句也會失敗。
生成欄位Field1的索引欄位NewIndex,兩條語句作用相同
生成後Field1欄位能夠有相同的值,能夠有空值(NULL)
CREATE INDEX NewIndex ON NewTable (Field1);
CREATE INDEX NewIndex ON NewTable (Field1) WITH IGNORE NULL;
生成欄位Field1的索引欄位NewIndex,注意,每個表裡只能有一個主索引(PRIMARY)。生成後Field1欄位不能有相同的值,不能有空值(當然,假如是TEXT類型,能夠有一個空串,但是空串不是空值)
CREATE INDEX NewIndex ON NewTable(Field1) WITH PRIMARY;
欄位Field1不能有相同的值,但能夠有空值(兩個空值不算相同的值)
CREATE UNIQUE INDEX NewIndex ON NewTable(Field1);
欄位Field1能夠有相同的值,但不能有空值
CREATE INDEX NewIndex ON NewTable(Field2) WITH DISALLOW NULL
能夠在索引語句中加入ASC(升序)或DESC(降序)來控制記錄排列順序假如不使用順序字,SQL則默認使用ASC順序
CREATE INDEX NewIndex ON NewTable(Field1 ASC, Field2 DESC);
DROP INDEX語句:
刪除表NewTable中的索引NewIndex,語句執行前索引NewIndex必須存在
DROP INDEX NewIndex ON NewTable;
CONSTRAINT語句:
CONSTRAINT子句用於創建資料庫完整性的索引,他和INDEX語句作用相同,有些地方能夠互相替代,他能夠使用PRIMARY KEY(主關鍵字),UNIQUE(唯一)和FOREIGN KEY(外部關鍵字),和INDEX相比不能使用IGNOR NULL和DISALLOW NULL,但多了FOREIGN KEY(這也是他最強大的地方)。另外, CONSTRAINT語句必須和CREATE TABLE或ALTER TABLE語句一起使用。
生成表NewTable,主關鍵欄位是Field1,主索引是NewPK
CREATE TABLE NewTable(Field1 LONG CONSTRAINT NewPK PRIMARY KEY, Field2 MEMO, Field3 DATETIME);
生成索引為NewUK的表NewTable,Field1不能有相同值,能夠有空值
CREATE TABLE NewTable(Field1 INTEGER CONSTRAINT NewUK UNIQUE);
生成多列的主索引,兩條記錄的Field1和Field2不能全部相同,也不能為空值
CREATE TABLE NewTable(Field1 INTEGER, Field2 CURRENCY, CONSTRAINT NewPK PRIMARY KEY(Field1, Field2));
生成多列的UNIQUE索引,兩條記錄的Field1和Field2不能全部相同注意,假如兩條記錄其中一個欄位相同而另一個欄位都是空值,那也算兩個欄位不同
CREATE TABLE NewTable(Field1 INTEGER, Field2 CURRENCY, CONSTRAINT NewUK UNIQUE(Field1, Field2));
要在幾個不同的表之間建立聯系,就要使用FOREIGN KEY REFERENCES子句,他能夠限定某個表的欄位內容必須存在於另外一個表中。
第一個例子:
首先,生成主關鍵欄位為Field1的表NewTable1
CREATE TABLE NewTable1(Field1 INTEGER CONSTRAINT NewPK PRIMARY KEY);
然後,再生成外部索引,兩個表的Field1必須類型相同,並且第一個表的Field1是主關鍵欄位或UNIQUE欄位。生成外部索引後,表NewTable2要增加記錄,他的Field1欄位值必須已存在於表NewTable1的Field1欄位中。
下面兩條語句作用相同,因為Field1是NewTable1的主關鍵欄位,能夠省略不寫
CREATE TABLE NewTable2(Field1 INTEGER CONSTRAINT NewFK REFERENCES NewTable1);
CREATE TABLE NewTable2(Field1 INTEGER CONSTRAINT NewFK REFERENCES NewTable1(Field1));
第二個例子:
首先,生成主關鍵欄位為Field1和Field2的表NewTable1
CREATE TABLE NewTable1(Field1 INTEGER, Field2 TEXT(20), CONSTRAINT NewPK PRIMARY KEY(Field1, Field2));
然後,生成多列外部索引
CREATE TABLE NewTable2(Field1 INTEGER, Field2 TEXT(20), CONSTRAINT NewFK FOREIGN KEY(Field1, Field2) REFERENCES NewTable1(Field1, Field2));
ALTER TABLE語句:
在表生成之後,假如想修改表的結構,就使用這條語句,他能增加或刪除欄位連同約束關系。
給表NewTable增加日期型欄位Field3,語句執行前表NewTalbe必須沒有欄位Field3
ALTER TABLE NewTable ADD COLUMN Field3 DATE;
刪除表NewTable中的欄位Field3,語句執行前欄位Field3必須存在表NewTable中
ALTER TABLE NewTable DROP COLUMN Field3;
給表NewTable增加NewUK約束關系
ALTER TABLE NewTable ADD CONSTRAINT NewUK UNIQUE(Field1,Field2);
刪除表NewTable的NewUK約束關系
ALTER TABLE NewTable DROP CONSTRAINT NewUK;
DROP TABLE語句:
刪除表NewTable,語句執行前表NewTable必須存在
DROP TABLE NewTable;
『肆』 SQL中什麼最難
oracle 和 mysql sqlserver 難點不大同 個人認為 sql 的游標 比較難(語法上),觸發器 比較難(業務上)
『伍』 SQL語句碰到難點了。。。。。
對不起,我是新手噢,寫的太倉促了,你調試看看:
SELECT 日期,
'A1' AS 店名,單價*(SELECT 銷售量 FROM 公司店面 WHERE 店名='A1' AND 日期=DM.日期) AS 銷售額,
'A2' AS 店名,單價*(SELECT 銷售量 FROM 公司店面 WHERE 店名='A2' AND 日期=DM.日期) AS 銷售額,
'A3' AS 店名,單價*(SELECT 銷售量 FROM 公司店面 WHERE 店名='A3' AND 日期=DM.日期) AS 銷售額,
單價*SUM(銷售額) AS 當日總銷售額
FROM 公司店面 AS DM
GROUP BY 日期
『陸』 SQL基礎難點
bit varying(n) 這里的n是正整數,把一個位串值轉換成 bit(n), 那麼它的右邊將被截斷或者在右邊補齊零,直到剛好 n 位, 而不會拋出任何錯誤。類似地,如果我們明確地把一個位串數值轉換成 bit varying(n),如果它超過了n 位, 那麼它的右邊將被截斷
書上應該給你的是個規范,不是例子
create table p10
( finished_work float(8),
num2 bit varying(10),
weight real
);
『柒』 mysql學習難點
資料庫(Database):
是按照數據結構來組織、存儲和管理數據的倉庫,每個資料庫都有一個或多個不同的API用於創建,訪問,管理,搜索和復制所保存的數據
關系型資料庫管理系統(RDBMS):
是建立在關系模型基礎上的資料庫,藉助於集合代數等數學概念和方法來處理資料庫中的數據,存儲和管理的大數據量。
RDBMS即關系資料庫管理系統(Relational Database Management System)的特點:
(1)數據以表格的形式出現
(2)每行為各種記錄名稱
(3)每列為記錄名稱所對應的數據域
(4)許多的行和列組成一張表單
(5)若乾的表單組成database
RDBMS 術語:
資料庫: 資料庫是一些關聯表的集合。.
數據表: 表是數據的矩陣。在一個資料庫中的表看起來像一個簡單的電子表格。
列: 一列(數據元素) 包含了相同的數據, 例如郵政編碼的數據。
行:一行(=元組,或記錄)是一組相關的數據,例如一條用戶訂閱的數據。
冗餘:存儲兩倍數據,冗餘降低了性能,但提高了數據的安全性。
主鍵:主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢數據。
外鍵:外鍵用於關聯兩個表。
復合鍵:復合鍵(組合鍵)將多個列作為一個索引鍵,一般用於復合索引。
索引:使用索引可快速訪問資料庫表中的特定信息。索引是對資料庫表中一列或多列的值進行排序的一種結構。類似於書籍的目錄。
參照完整性: 參照的完整性要求關系中不允許引用不存在的實體。與實體完整性是關系模型必須滿足的完整性約束條件,目的是保證數據的一致性。
MySQL是一個關系型資料庫管理系統,由瑞典MySQL AB公司開發,目前屬於Oracle公司。MySQL是一種關聯資料庫管理系統,關聯資料庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度並提高了靈活性。
MYSQL特點:
(1)Mysql是開源的,所以你不需要支付額外的費用。
(2)Mysql支持大型的資料庫。可以處理擁有上千萬條記錄的大型資料庫。
(3)MySQL使用標準的SQL數據語言形式。
(4)Mysql可以允許於多個系統上,並且支持多種語言。這些編程語言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等
『捌』 10道比較難點的c#,java,SqL題!
第一個問題出錯了,若
cmd
返回首行首列為一字元串就會拋出異常,若返回的是數值,可以被正常轉換,前提條件是值沒有超出int范圍,否則依舊是拋出異常的
『玖』 怎麼開始學習sql2000
軟體入門與提高叢書——SQL Server 2000中文版入門與提高
http://book.jqcq.com/advanced_search_result.php?keywords=sql%202000
http://book.jqcq.com/proct/800530.html
本書針對Microsoft公司最新推出的大型關系資料庫管理系統SQL Server 2000編寫,循序漸進地介紹了從入門到深入掌握SQL Server 2000所需的各方面知識。內容包括SQL Server 2000的新特點;安裝、配置SQL Server 2000的方法;SQL Server 2000日常管理方法和技巧;Transact-SQL語言程序設計;存儲過程,觸發器等資料庫對象的設計方法和使用策略;SQL Server 2000分布式管理、自動管理和數據輿服務等高級應用;應用高級程序開發語言開發基於SQL Server 2000的應用程序;使用Web向導快速生成HTML頁面。
本書介紹了大量SQL Server的使用經驗,對使用中的重點、難點進行了專門的講解,是一本有效實用的入門指南。本書的提高部分,內容有一定深度,對有SQL Server使用基礎但希望進一步提高的讀者來說也有一定幫助。
目錄: 第1章 SQL Server 2000概述
1.1 SQL Server的發展簡史
1.2 SQL Server 2000的特點
1.3 SQL Server 2000的體系結構
1.4 SQL Server 2000的新特點
1.5 本章小結
第2章 關系資料庫基礎
2.1 關系資料庫的基本概念
2.2 SQL Server的資料庫對象
2.3 SQL和Transact-SQL
2.4 本章小結
第3章 安裝SQL Server 2000
3.1 SQL Server實例
3.2 安裝SQL Server 2000所需的軟硬體配置
3.3 安裝SQL Server 2000必須注意的若幹事項
3.4 遠程安裝SQL Server 2000
3.5 本地安裝SQL Server 2000軟體
3.6 升級到SQL Server 2000
3.7 企業管理器介紹
3.8 本章小結
第4章 SQL Server的系統組成
4.1 SQL Server 2000的系統資料庫
4.2 SQL Server 2000的系統表
4.3 SQL Server 2000的系統存儲過程
4.4 SQL Server 2000的示例資料庫
4.5 本章小結
第5章 SQL Server伺服器管理與使用
5.1 管理SQL Server伺服器組
5.2 SQL Server伺服器的連接和注冊
5.3 注冊SQL Server伺服器的注意事項
5.4 配置SQL Server伺服器
5.5 啟動和關閉SQL Server服務
5.6 本章小結
第6章 查詢分析器使用方法
6.1 登錄到伺服器
6.2 查詢分析器的菜單命令
6.3 配置查詢分析器
6.4 對象瀏覽器的使用
6.5 模板的使用
6.6 本章小結
第7章 SQL Server資料庫管理
7.1 文件和文件組
7.2 創建資料庫
7.3 查看資料庫的信息
7.4 管理資料庫
7.5 刪除SQL Server資料庫
7.6 資料庫的存儲結構
7.7 本章小結
第8章 SQL Server的命名規則
8.1 SQL Server的標識符
8.2 對象命名規則
8.3 關於實例的命名習慣
8.4 本章小結
第9章 表的管理和使用
9.1 創建表
9.2 刪除表格
9.3 修改表格定義
9.4 查看錶屬性
9.5 表格重命名
9.6 索引
9.7 本章小結
第10章 Transact-SQL查詢基礎
10.1 簡單的SELECT查詢
10.2 使用TOP關鍵字
10.3 使用DISTINCT關鍵字
10.4 使用計算列
10.5 操作查詢的列名
10.6 使用WHERE子句
10.7 使用LIKE子句進行模糊查詢
10.8 使用ORDER BY給數據排序
10.9 本章小結
第11章 編輯維護表格數據
11.1 使用INSERT添加表格數據
11.2 使用RPDATE實現數據的修改
11.3 使用DELETE刪除表中數據
11.4 使用TRUNCATE TABLE清空表格
11.5 使用企業管理器管理表格數據
11.6 本章小結
第12章 視圖
12.1 視圖的優點
12.2 視圖的創建與刪除
12.3 修改視圖的定義
12.4 瀏覽視圖信息
12.5 使用視圖來簡化查詢
12.6 在視圖上使用INSERT語句
12.7 使用UPDATE更新視圖中的數據
12.8 刪除視圖中的數據
12.9 WITH CHECK OPTION的視圖
12.10 對視圖進行加密
12.11 使用視圖加強數據安全
12.12 本章小結
第13章 SQL Server的數據類型
13.1 3種新的數據類型
13.2 整數數據類型
13.3 貨幣數據類型
13.4 數字數據類型
13.5 浮點數據類型
13.6 日期/時間數據類型
13.7 字元數據類型
13.8 二進制數據類型
13.9 統一碼數據類型
13.10 圖像、文本數據的使用
13.11 sql_variant數據類型及使用
13.12 table數據類型及使用
13.13 用戶自定義數據類型及使用
13.14 本章小結
第14章 Transact-SQL高級查詢
14.1 多表查詢和笛卡兒乘積
14.2 使用表格別名
14.3 使用UNION子句
14.4 使用統計函數
14.5 使用GROUP BY子句
14.6 使用COMPUTE和COMPUTE BY子句
14.7 使用嵌套查詢
14.8 本章小結
第15章 設計數據完整性
15.1 數據完整性基礎
15.2 使用約束實施數據完整性
15.3 使用規則
15.4 使用默認值
15.5 使用IDENTITY列
15.6 本章小結
第16章 SQL Server編程結構
16.1 程序注釋語句
16.2 批處理
16.3 局部變數
16.4 全局變數
16.5 IF…ELSE條件判斷結構
16.6 BEGIN…END語句塊
16.7 WHILE循壞結構
16.8 CASE
16.9 RETURN
16.10 游標
16.11 事務
16.12 本章小結
第17章 SQL Server函數
17.1 SQL Server的數學函數
17.2 SQL Server的字元串函數
17.3 SQL Server的日期函數
17.4 SQL Server的系統函數
17.5 其他常用函數
17.6 設置查詢屬性
17.7 用戶自定義函數
17.8 本章小結
第18章 存儲過程與觸發器
18.1 存儲過程概述
18.2 存儲過程的使用和管理
18.3 觸發器概述
18.4 觸發器使用與管理
18.5 觸發器的特殊功能
18.6 利用存儲過程和觸發器維護數據完整性
18.7 本章小結
第19章 管理SQL Server的安全性
19.1 SQL Server的安全性機制
19.2 SQL Server標准登錄模式
19.3 SQL Server集成登錄模式
19.4 使用企業管理器建立登錄賬戶
19.5 SQL Server資料庫安全性
19.6 角色
19.7 許可權
19.8 本章小結
第20章 備份與恢復
20.1 資料庫備份概念
20.2 資料庫備份策略與規劃
20.3 執行數據備份與恢復
20.4 本章小結
第21章 SQL Server的數據傳輸服務
21.1 DTS概述
21.2 數據轉換服務導入向導和數據轉換服務導出向導
21.3 使用DTS設計器
21.4 本章小結
第22章 SQL Server自動化管理
22.1 SQL Server自動化管理基礎
22.2 使用SQL郵件
22.3 創建操作員
22.4 設置警報
22.5 創建作業
22.6 本章小結
第23章 SQL Server分布式數據管理
23.1 復制技術概述
23.2 配置出版伺服器
23.3 創建出版物
23.4 設計訂閱
23.5 本章小結
第24章 通過Web助手發布數據
24.1 SQL Server與Web頁的交互
24.2 使用SQL Server Web助手建立Web頁
24.3 本章小結
第25章 SQL Server 2000應用編程
25.1 SQL Server 2000應用編程概述
25.2 ADO概述
25.3 SQL Server 2000與ADO編程舉例
25.4 SQL-DMO概述
25.5 使用SQL-DMO對象
25.6 SQL-DMO應用舉例
25.7 本章小結
你得採納啊!