⑴ 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 Server 2008 R2如何使用正則表達式搜索
使用正則表達式進行查找若要在「快速查找」、「在文件中查找」、「快速替換」或「在文件中替換」 操作過程中,在「查找內容」欄位啟用正則表達式,請在「查找選項」下選中「使用」,再選擇「正則表達式」。「查找內容」欄位旁邊的「引用列表」三角形按鈕將變為可用狀態。單擊此按鈕可顯示一組最常用的正則表達式。如果選擇了表達式生成器中的某個項,則可將該項插入「查找內容」字元串。注意「查找內容」字元串中使用的正則表達式與 Microsoft .NET Framework 編程中的有效正則表達式相比,語法上存在差異。例如,在「查找和替換」對話框中,大括弧 {} 用於表示帶標記的表達式。所以,表達式「zo{1}」將匹配所有「zo」後帶標記 1 的匹配項,如「Alonzo1」和「Gonzo1」。但在 .NET Framework 中,{} 符號用於表示量詞。因此,表達式「zo{1}」將匹配所有「z」後跟一個「o」的匹配項,如匹配「zone」,但不匹配「zoo」。下表對「引用列表」中提供的正則表達式進行了說明。 表達式語法說明任何單個字元.匹配除換行符外的所有單一字元。零個或更多*匹配零或更多前導表達式的匹配項,執行所有可能的匹配。一個或更多+匹配至少一個前導表達式的匹配項。行首^僅匹配行首位置的字元串。行尾$僅匹配行尾位置的字元串。字首<僅匹配文本中以此開頭的字。字尾>僅匹配文本中以此結尾的字。分行符\n匹配與平台無關的換行符。在替換表達式中,插入一個換行符。在集合中的任何一個字元[]匹配[] 中的任何一個字元。若要指定字元范圍,請列出起始字元和結束字元,並用短劃線 (-) 分隔,如 [a-z]。不在集合中的任何一個字元[^...]匹配不在 ^ 之後的字元集中的任何一個字元。或|匹配「或」符號 (|) 兩旁的任一表達式。常用於組中。例如,(sponge|mud) bath 可以匹配「sponge bath」和「mud bath」。Escape\將反斜杠 (\) 後的字元作為文字匹配。此表達式允許您搜索正則表達式標記中使用的符號,如 { 和 ^。例如, \^ 可用於查找字元 ^。標記表達式{}匹配用括起來的表達式內的文本。C/C++ 標識符:i匹配表達式 ([a-zA-Z_$][a-zA-Z0-9_$]*)。用引號括起來的字元串:q匹配表達式 (("[^"]*")|('[^']*'))。空格或製表符:b匹配空格或製表符。整數:z匹配表達式 ([0-9]+)。「引用列表」中只列出了部分可在「查找和替換」操作中使用的正則表達式。還可以將下列任一正則表達式插入「查找內容」字元串: 表達式語法說明最少- 零個或更多@匹配零個或更多前導表達式的匹配項,匹配盡可能少的字元。最少- 一個或更多#匹配一個或更多前導表達式的匹配項,匹配盡可能少的字元。重復n 次^n匹配前導表達式的 n 個匹配項。例如,[0-9]^4 匹配所有四位數序列。分組()將子表達式分組第n 個標記文本\n在「查找或替換」表達式中,指示匹配第 n 個標記表達式的文本,其中 n 為 1 到 9 之間的數字。在「替換」表達式中,\0 將插入完整的匹配文本。右對齊欄位\(w,n)在「替換」表達式中,在寬度至少為 w 個字元的欄位中,右對齊第 n 個標記表達式。左對齊欄位\(-w,n)在「替換」表達式中,在寬度至少為 w 個字元的欄位中,左對齊第 n 個標記表達式。阻止匹配~(X)如果在表達式的此處出現 X,則阻止匹配。例如,real~(ity) 匹配「realty」和「really」中的「real」,但不匹配「reality」中的「real」。字母數字字元:a匹配表達式 ([a-zA-Z0-9])。字母字元:c匹配表達式 ([a-zA-Z])。十進制數字:d匹配表達式 ([0-9])。十六進制數:h匹配表達式 ([0-9a-fA-F]+)。有理數:n匹配表達式 (([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))。字母字元串:w匹配表達式 ([a-zA-Z]+)。Escape\eUnicode U+001B。響鈴\gUnicode U+0007。Backspace\hUnicode U+0008。製表符\t匹配製表符,Unicode U+0009。Unicode 字元\x#### 或 \u####匹配由 Unicode 值確定的字元,其中 #### 為十六進制數字。可以使用 ISO 10646 碼位或給出代理項對值的兩個 Unicode 碼位,指定基本多語言面(即代理項)以外的字元。下表列出了按標准 Unicode 字元屬性匹配時的語法。雙字母縮寫和 Unicode 字元屬性資料庫中列出的縮寫相同。可以將這些縮寫指定為字元集的一部分。例如,表達式 [:Nd:Nl:No] 匹配任何數字。 表達式語法說明大寫字母:Lu匹配任何單個大寫字母。例如,:Luhe 匹配「The」,但不匹配「the」。小寫字母:Ll匹配任何單個小寫字母。例如,:Llhe 匹配「the」,但不匹配「The」。標題大寫字母:Lt匹配一個大寫字母後跟一個小寫字母的字元,例如 Nj 和 Dz。修飾字母:Lm匹配字母或標點符號(如逗號、交叉重音符和秒號),這些字母或標點符號是用於修飾前導字母的。其他字母:Lo匹配其他字母,如歌特字母 ahsa。十進制數字:Nd匹配十進制數字(如 0-9)及其全形對等數字。字母數字:Nl匹配字母數字,如羅馬數字和零的表意數字。其他數字:No匹配其他數字,如舊斜體數字一。左標點:Ps匹配左標點,如左小括弧和左大括弧。右標點:Pe匹配右標點,如右小括弧和右大括弧。左引號:Pi匹配左雙引號。右引號:Pf匹配單引號和右雙引號。劃線號:Pd匹配劃線號。連接號:Pc匹配下劃線符號。其他標點:Po匹配(,)、?、"、!、@、#、%、&、*、\、(:)、(;)、' 和 /。空格分隔符:Zs匹配空格。行分隔符:Zl匹配Unicode 字元 U+2028。段落分隔符:Zp匹配Unicode 字元 U+2029。不佔位標記:Mn匹配不佔位標記。合並標記:Mc匹配合並標記。封閉標記:Me匹配封閉標記。數學符號:Sm匹配+、=、~、|、< 和 >。貨幣符號:Sc匹配$ 和其他貨幣符號。修飾符號:Sk匹配修飾符號,如抑揚符、重音符和長音符。其他符號:So匹配其他符號,如版權符號、段落標記和度數符號。其他控制:Cc匹配行尾。其他格式:Cf格式化控制字元,如雙向控制字元。代理項:Cs匹配代理項對的一半。其他專門用途:Co匹配任何專用區域的字元。其他未分配字元:Cn匹配未映射到 Unicode 字元的字元。除了標準的 Unicode 字元屬性以外,還可以將下列附加屬性指定為字元集的一部分。 表達式語法說明字母:Al匹配任何單字元。例如,:Alhe 匹配「The」、「then」 和「reached」之類的字。Numeric:Nu匹配任何數字。標點:Pu匹配任意一個標點符號,如 ?、@、' 等等。空格:Wh匹配任何類型的空格,包括印刷空格和表意空格。雙向:Bi匹配自右至左書寫的字元,如阿拉伯語和希伯萊語字元。朝鮮文字:Ha匹配朝鮮文字字母和組合字母。平假名:Hi匹配平假名字元。片假名:Ka匹配片假名字元。象形/漢字/日文漢字:Id匹配象形字元,如漢字和日文漢字。用於查找文本的正則表達式Expression Studio 4.0 其他版本 此主題尚未評級 - 評價此主題 通過使用正則表達式,可以在 Microsoft Expression Web 中執行繁復的查找和替換操作。如果您不知道所要查找的確切文本或代碼,或者要查找文本或代碼字元串的多個匹配項,則可以使用正表達式。正則表達式是一種文本模式,它可以描述所要查找的文本的一種或多種變體。正則表達式由特定字元(如字母「a」到「z」)和描述文本模式的特殊字元(如星號「*」)組成。例如,要在網站中查找「page」的所有變體,可以搜索「page*」。這樣,Expression Web 將在網站中查找「page」、「pages」、「pager」以及以「page」開頭的任何其他單詞的所有實例。在搜索中使用正則表達式時,特定的規則將控制哪些字元組合將執行特定的匹配操作。每種正則表達式(或正則表達式的組合)都稱為「語法」。可以在一個語法中使用多個正則表達式以精確匹配要搜索的目標。若要使用正則表達式,請參閱使用查找和替換編輯多個網頁。正則表達式語法 語法表達式說明.任意字元 用作換行符 (\n) 以外的任何單個列印或非列印字元的通配符。例如,正則表達式 c.t 可匹配 cat、c t、cot 等字元串,但不能匹配 cost。在本例中,句點 (.) 是一個代表單個字元的通配符。它出現在字母「c」和「t」之間,因此字元「c」和「t」之間的任何單個字元都與表達式匹配 - 即使是空格也一樣。*最大為零或更多 用於匹配在此表達式之前出現零次或更多次的某個字元,可與盡可能多的字元相匹配。正則表達式 .* 用於匹配某個出現零次或更多次的字元。例如,正則表達式 b.*k 可匹配 book、back、black、blank 和 buck。在本例中,將句點 (.) 和星號 (*) 組合成一個語法。句號 (.) 緊挨在星號 (*) 表達式之前。星號 (*) 可匹配「b」和「k」之間任意出現零次或更多次的字元。句點 (.) 用作「b」和「k」之間字元的通配符。在本例中,它表示「b」和「k」之間的任意字元都可以反復出現。+最大為一或更多 用於匹配在此表達式之前出現一次或更多次的某個字元,可與盡可能多的字元相匹配。正則表達式 .+ 用於匹配某個出現一次或更多次的字元。例如,正則表達式 bo+. 可匹配 bob、book 和 boot。在本例中,將句點 (.) 和加號 (+) 組合成一個語法。句號 (.) 緊挨在加號 (+) 表達式之後。加號 (+) 可與出現一次或更多次的字母「o」相匹配。句點 (.) 用作每個單詞的最後一個字元的通配符。在本例中,該字元為「b」、「k」和「t」。@最小為零或更多 用於匹配在此表達式之前出現零次或更多次的某個字元,可與盡可能少的字元相匹配。正則表達式 .@ 用於匹配某個出現零次或更多次的字元。例如,正則表達式 a.@x 可匹配「abxbxb」中的「abx」和「acxcxc」中的「acx」。在本例中,將句號 (.) 和 @ 符號組合成一個語法。句點 (.) 緊挨在 @ 符號表達式之前。@ 符號可與「a」和「x」之間出現零次或更多次的任意字元相匹配。在本例中,句點 (.) 用作字元「a」和「x」之間的字元「b」和「c」的通配符。#最小為一或更多 用於匹配在此表達式之前出現一次或更多次的某個字元,可與盡可能少的字元相匹配。例如,正則表達式 si.#er 可匹配「sicker」或「silkier」。在本例中,將句號 (.) 和井號 (#) 組合成一個語法。句點 (.) 緊挨在井號 (#) 表達式之前。井號 (#) 可與「si」和「er」之間出現一次或更多次的任意字元相匹配。句點 (.) 用作單詞 sicker 中字元「c」和「k」的通配符,以及單詞 silkier 中「l」、「k」和「i」的通配符。[ ]字元集 用於匹配括弧 ([ ]) 內的任意一個字元。可以使用連字元 (-) 指定字元的范圍,例如 [a-z]。例如:正則表達式 c[aou]t 可以匹配 cat、cot 和 cut,但不能匹配 cet 或 cit。正則表達式 [0-9] 表示匹配任意一個數字。也可以指定多個字母範圍。正則表達式 [A-Za-z] 表示匹配所有大寫和小寫字母。^行首 定位於行首匹配。例如,正則表達式 ^When in 匹配以「When in」開頭且出現於行首的任意字元串,例如「When in the course of human events」或「When in town, call me」。然而,此正則表達式不匹配出現於行首的「What and when in the course of human events」。$行尾 定位於行尾匹配。例如,正則表達式 professional$ 可匹配字元串「He is a professional」,但不能匹配字元串「They are a group of professionals」。^^文件開頭 定位於文件開頭匹配。僅適用於在源代碼或文本文件中搜索文本。例如,若要匹配文件開頭的第一個 HTML 標記,請使用此正則表達式:^^$$文件末尾 定位於文件末尾匹配。僅適用於在源代碼或文本文件中搜索文本。例如,若要匹配文件末尾的最後一個 HTML 標記(標記後沒有空格),可使用此正則表達式:$$|或 表示在兩項之間進行選擇,即匹配「或」符號 (|) 前面或後面的表達式。例如,正則表達式 (him|her) 匹配下列各項:「it belongs to him」或者「it belongs to her」但不匹配行「it belongs to them」。\轉義特殊字元 用於匹配反斜線 (\) 後面的字元。這樣,就可以查找正則表達式語法中使用的字元(如左大括弧 ({) 或脫字型大小 (^))或其他一些特殊字元。例如,使用 \$ 可匹配美元符號 ($) 字元,而不是執行用於「定位於行尾」的正則表達式。同樣,使用 \. 可匹配句號 (.) 字元,而不是像句號 (.) 正則表達式一樣匹配任意一個字元。{}標記表達式 對與括弧內表達式匹配的文本加標記。可以使用 \N 在「查找」表達式中匹配出現在另一處的標記文本或者將標記文本插入「替換」表達式。例如,假設要查找連續出現兩次的單詞。若要搜索,請使用此表達式:{.#} \1假設連續出現的單詞由一個空格隔開,則需要在右大括弧 (}) 與反斜線 (\) 之間添加一個空格。在本例中,將井號 (#)、句號 (.) 和大括弧 ({}) 組合成一個語法。在此表達式中,.# 表示任何連續的字元。因為這部分表達式位於大括弧 ({}) 內,所以連續的字元將被加上標記,並被引用為 \1。此表達式將查找後跟空格以及字元與其完全相同的任意連續字元。\N第N 個標記表達式 在「查找」表達式中,\N 匹配由第 N 個標記表達式指定的文本,其中 N 是 1 到 9 的數字。在「替換」表達式中,\N 插入由第 N 個標記表達式匹配的文本,其中 N 是 1 到 9 之間的數字。\0 插入整個「查找」表達式指定的文本。例如,假設要查找連續出現兩次的單詞,並使用一個單詞替換它們。若要搜索,請使用此表達式:.#} \l假設連續出現的單詞由一個空格隔開,則需要在右大括弧 (}) 與反斜線 (\) 之間添加一個空格。在本例中,將井號 (#)、句號 (.) 和大括弧 ({}) 組合成一個語法。若要替換,請使用下列表達式:\l\1 表示在查找字元串中的第一對大括弧內找到的內容。通過在替換操作中使用 \1,實際上是將連續出現兩次的單詞替換為一個單詞。( )組表達式 標記子表達式的開始和結束。子表達式指括在 ( ) 中的正則表達式,例如表達式:(ha)+。在本例中,將加號 (+) 與括弧 ( ) 組表達式組合成一個語法。子表達式是 (ha),因為它括在括弧 ( ) 內。添加加號 (+) 後,該表達式可查找重復的字母對。加號 (+) 表示「ha」出現一次或更多次。此表達式可匹配下列各項:「haha」和「hahaha」。~x防止匹配 當x 出現在表達式中的此位置時會防止匹配。例如,正則表達式 real~(ity) 可匹配「realty」和「really」中的「real」,但不能匹配「reality」中的「real」。\n換行符 用於匹配「代碼」視圖中的新行,或「設計」視圖中的 <br>。語法(\n) 是匹配所有換行符的簡便方法。\t製表符 用於匹配單個製表符。例如,如果要查找所有位於行首的製表符,可使用此正則表達式:^\t+在本例中,將脫字型大小 (^)、加號 (+) 和製表符 (\t) 組合成一個語法。脫字型大小 (^) 位於單個製表符表達式之前,用於匹配位於行首的所有製表符。加號 (+) 表示匹配一個或多個製表符。[^]任何一個不屬於該集合的字元 用於匹配不包含在脫字型大小 (^) 之後的字元集內的任何字元。例如,若要匹配范圍之外的任何字元,可使用脫字型大小 (^) 作為左括弧後面的第一個字元。表達式 [^269A-Z] 匹配除 2、6、9 以及任何大寫字母之外的所有字元。n重復表達式 用於匹配脫字型大小 (^) 之前出現 n 次的表達式。例如,若 n 為 4,表達式 [0-9]^4 匹配任何 4 位數序列。在本例中,將字元集 ([ ]) 語法與重復 (^n) 語法組合,以展示正則表達式的更實用的方法。:a字母數字字元 用於匹配表達式 [a-zA-Z0-9]。可以使用表達式 [a-zA-Z0-9] 匹配出現一次的字母(大寫或小寫)或數字。也稱為「字母數字匹配項」。可使用簡寫表達式 :a 來代替 [a-zA-Z0-9]。:b空格 用於匹配代碼或文本中的任何空格。例如,若要匹配行首的單個空格字元,請使用此正則表達式:^:b:c字母字元 用於匹配表達式 [a-zA-Z]。使用此表達式時,可以匹配所有大寫或小寫字母。可以使用簡寫表達式 :c 來代替所有 [a-zA-Z]。:d十進制數 用於匹配表達式 [0-9]。利用此表達式可以匹配任何數字。例如,假設要在文本文件中查找美國的社會福利號。美國的社會福利號的格式為 999-99-9999。:d^3-:d^2-:d^4 或 [0-9]^3-[0-9]^2-[0-9]^4(使用 [0-9] 表示)可返回相同的結果。可使用簡寫表達式 :d 來代替所有 [0-9]。:h十六進制數 用於匹配表達式 [0-9a-fA-F]+使用此表達式可匹配由「A」和「F」之間的大寫或小寫字母和任意數字組成的十六進制數。例如,假設網站中的網頁使用了多種不同的背景色,而您要將這些網頁的顏色改為黑色(即 000000)。但是,您不知道現有顏色的十六進制值。使用此正則表達式可查找所有的現有十六進制值:\#:h可以使用 [0-9a-fA-F] 進行搜索,但在本例中,將反斜線 (\)、井號 (#) 和十六進制數字 (:h) 語法組合在一起。\# 匹配非表達式的井號 (#),而 :h 匹配任何十六進制字元序列。若要替換現有十六進制數值,可鍵入所需背景顏色的十六進制數值: 000000:i標識符 用於匹配表達式 [a-zA-Z_$][a-zA-Z0-9_$]*處理代碼時,如果需要匹配所有程序標識符,可使用簡寫表達式 :i,而無需鍵入上述冗長的表達式。:n有理數 用於匹配表達式 ([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)|([0-9]+)如果需要匹配帶小數點的整個數值,可使用簡寫表達式 :n,而無需鍵入上述冗長的表達式。:q帶引號的字元串 用於匹配表達式 ("[~"]*")|('[~']*')如果需要匹配加引號的所有引號,可使用簡寫表達式 :q,而無需鍵入上述冗長的表達式。:w字母字元串 用於匹配表達式 [a-zA-Z]+此語法是一種可匹配一個或多個大寫或小寫字母字元的簡便方法。:z整數 用於匹配表達式 [0-9]+此語法是一種可匹配任何整數的簡便方法。
⑶ 求教,sql的if如何使用
SQLServerIF用法:
IF條件表達式
BEGIN
SQL語句
END
ELSE
BEGIN
SQL語句
END
設置一個變數@sex,如果@sex為』F』,
那麼查詢Employees中所有TitleOfCourtesy為』Ms.』或
』Mrs.』的所有記錄;如不是,查詢剩下的紀錄。
declare@sexchar(1)
set@sex='M'
if@sex='F'
begin
select*fromEmployees
whereTitleOfCourtesy='Ms.'
orTitleOfCourtesy='Mrs.'
end
else
begin
select*fromEmployees
whereTitleOfCourtesy<>'Ms.'
andTitleOfCourtesy<>'Mrs.'
end
⑷ sql正則表達式常用符號
SQL的查詢語句中,有時會需要引進正則表達式為其復雜搜索指定模式。下面給出一些Regexp在
MYSQL語句中應用(非全部):
1) ^
匹配字元串的開始部分。
mysql> SELECT 'fo\nfo' REGEXP '^fo$'; -> 0mysql> SELECT 'fofo' REGEXP '^fo'; -> 12) $
匹配字元串的結束部分。
mysql> SELECT 'fo\no' REGEXP '^fo\no$'; -> 1mysql> SELECT 'fo\no' REGEXP '^fo$'; -> 03) .
匹配任何字元(包括回車和新行)。
mysql> SELECT 'fofo' REGEXP '^f.*$'; -> 1mysql> SELECT 'fo\r\nfo' REGEXP '^f.*$'; -> 14)
[:character_class:]
在括弧表達式中(使用[和]),[:character_class:]表示與術語類的所有字元匹配的字元類。標準的類名稱是:
alnum
文字數字字元
alpha
文字字元
blank
空白字元
cntrl
控制字元
digit
數字字元
graph
圖形字元
lower
小寫文字字元
print
圖形或空格字元
punct
標點字元
space
空格、製表符、新行、和回車
upper
大寫文字字元
xdigit
十六進制數字字元
它們代表在ctype(3)手冊頁面中定義的字元類。特定地區可能會提供其他類名。字元類不得用作范圍的端點。
mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+'; -> 1
mysql> SELECT '!!' REGEXP '[[:alnum:]]+'; -> 0
5) [[:<:]], [[:>:]]
這些標記表示word邊界。它們分別與word的開始和結束匹配。word是一系列字字元,其前面和後面均沒有字
字元。字字元是alnum類中的字母數字字元或下劃線(_)。
mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; -> 1mysql> SELECT 'a xword a' REGEXP
'[[:<:]]word[[:>:]]'; -> 0要想在正則表達式中使用特殊字元的文字實例,應在其前面加上2個反斜杠「\」字元。
MySQL解析程序負責解釋其中一個,正則表達式庫負責解釋另一個。例如,要想與包含特殊字元「+」的字元
串「1+2」匹配,在下面的正則表達式中,只有最後一個是正確的:
mysql> SELECT '1+2' REGEXP '1+2'; -> 0mysql> SELECT '1+2' REGEXP '1\+2'; -> 0mysql> SELECT
'1+2' REGEXP '1\\+2'; -> 1 其他的有關Regexp的語法,可直接參考下表:字元 含意
\ 做為轉意,即通常在"\"後面的字元不按原來意義解釋,如/b/匹配字元"b",當b前面加了反斜桿後/\b/,轉意
為匹配一個單詞的邊界。
-或-
對正則表達式功能字元的還原,如"*"匹配它前面元字元0次或多次,/a*/將匹配a,aa,aaa,加了"\"後,/a\*/將
只匹配"a*"。
^ 匹配一個輸入或一行的開頭,/^a/匹配"an A",而不匹配"An a"
$ 匹配一個輸入或一行的結尾,/a$/匹配"An a",而不匹配"an A"
* 匹配前面元字元0次或多次,/ba*/將匹配b,ba,baa,baaa
+ 匹配前面元字元1次或多次,/ba*/將匹配ba,baa,baaa
? 匹配前面元字元0次或1次,/ba*/將匹配b,ba
(x) 匹配x保存x在名為$1...$9的變數中
x|y 匹配x或y
{n} 精確匹配n次
{n,} 匹配n次以上
{n,m} 匹配n-m次
[xyz] 字元集(character set),匹配這個集合中的任一一個字元(或元字元)
[^xyz] 不匹配這個集合中的任何一個字元
[\b] 匹配一個退格符
\b 匹配一個單詞的邊界
\B 匹配一個單詞的非邊界
\cX 這兒,X是一個控制符,/\cM/匹配Ctrl-M
\d 匹配一個字數字元,/\d/ = /[0-9]/
\D 匹配一個非字數字元,/\D/ = /[^0-9]/
\n 匹配一個換行符
\r 匹配一個回車符
\s 匹配一個空白字元,包括\n,\r,\f,\t,\v等
\S 匹配一個非空白字元,等於/[^\n\f\r\t\v]/
\t 匹配一個製表符
\v 匹配一個重直製表符
\w 匹配一個可以組成單詞的字元(alphanumeric,這是我的意譯,含數字),包括下劃線,如[\w]匹配
"$5.98"中的5,等於[a-zA-Z0-9]
\W 匹配一個不可以組成單詞的字元,如[\W]匹配"$5.98"中的$,等於[^a-zA-Z0-9]。
⑸ SQL語句 包含怎麼寫
使用SQL 通配符可以替代一個或多個字元,即模糊查詢,也就是包含關系。
SQL 通配符必須與 LIKE 運算符一起使用。在 SQL 中,可使用以下通配符如下:
1、% 替代一個或多個字元
2、_ 僅替代一個字元
3、[charlist] 字元列中的任何單一字元
4、[^charlist]或者[!charlist]不在字元列中的任何單一字元
以圖中表格為例,說明一下各通配符用法
1、 查詢居住在以 "Ne" 開始的城市裡的人:
SELECT * FROM PersonsWHERE City LIKE 'Ne%'
2、查詢居住在包含 "lond" 的城市裡的人:
SELECT * FROM PersonsWHERE City LIKE '%lond%'
3、查詢名字的第一個字元之後是 "eorge" 的人:
SELECT * FROM PersonsWHERE FirstName LIKE '_eorge'
4、查詢記錄的姓氏以 "C" 開頭,然後是一個任意字元,然後是 "r",然後是任意字元,然後是 "er":
SELECT * FROM PersonsWHERE LastName LIKE 'C_r_er'
5、查詢居住的城市以 "A" 或 "L" 或 "N" 開頭的人:
SELECT * FROM PersonsWHERE City LIKE '[ALN]%'
6、查詢居住的城市不以"A" 或 "L" 或 "N" 開頭的人:
SELECT * FROM PersonsWHERE City LIKE '[!ALN]%'