Qt学习笔记之数据库
一、數據庫簡介
1.1.數據和數據庫(DB)
用計算機進行數據處理,首先就要把信息以數據形式存儲到計算機中,故數據是可以被計算機接受和處理的符號。根據所表示的信息特征不同,數據有不同的類別,如數字、文字、表格、圖形圖像、聲音等等。數據庫(DataBase,簡稱DB),顧名思義,就是存放數據的倉庫,其特點是數據按照數據模型組織,是高度結構化的,可供多個用戶共享并且具有一定的安全性。實際開發中使用的數據庫幾乎都是關系型的。關系數據庫是按照二維表結構方式組織的數據集合,二維表由行和列組成,表的行稱為元組、列稱為屬性,對表的操作稱為關系運算,主要的關系運算有投影、選擇和連接等。
1.2.數據庫管理系統(DBMS)
數據庫管理系統即DBMS(DataBase Management System),它是位于用戶應用程序和操作系統之間的數據庫管理系統軟件,其主要功能是組織、存儲和管理數據,高效地訪問和維護數據,即提供數據定義、數據操縱、數據控制和數據維護等功能。常用的數據庫管理系統有Oracle、Microsoft SQL Server、Sybase和DB2等。
數據庫系統即DBS(DataBase System),是指按照數據庫方式存儲和維護數據,并向應用程序提供數據訪問接口的系統。DBS通常由數據庫、計算機硬件(支持DB存儲和訪問)、軟件(包括操作系統、DBMS、及應用開發支撐軟件)和數據庫管理員(DBA,DataBaseAdministrator)四個部分組成,其中DBA是控制數據整體結構的人,負責數據庫系統的正常運行,承擔創建、監控和維護整個數據庫結構的責任。DBA必須具有下列素質:熟悉所有數據性質和用途,對用戶需求有充分了解,對系統性能非常熟悉。
在實際應用中,數據庫系統通常分為桌面型數據庫系統和網絡型數據庫系統兩大類。桌面型數據庫系統是指只在本機運行、不和其他計算機交換數據的數據庫系統,常用于小型信息管理系統,這類數據庫系統的典型代表是VFP和Access。
網絡型數據庫系統是指能通過計算機網絡進行數據共享和交換的數據庫系統,常用于構建較復雜的C/S結構或B/S結構的分布式應用系統,大多數數據庫系統均屬于此類,如Oracle、MicrosoftSQL Server、Sybase、DB2和Informix等。隨著計算機網絡的普及,計算模式正迅速從單機模式向網絡計算平臺遷移,網絡型數據庫系統的應用將越來越廣泛。
1.3.結構化查詢語言
SQL結構化查詢語言SQL(Structured Query Language)是用于關系數據庫操作的標準語言,最早由Boyce和Chambedin在1974年提出,稱為SEQUEL語言。1976年,IBM公司的San Jose研究所在研制關系數據庫管理系統System R時修改為SEQUEL2,后來簡稱為SQL。1976年,SQL開始在商品化關系數據庫管理系統中應用。1982年美國國家標準化組織(ANSI)確認SQL為數據庫系統的工業標準。1986年ANSI公布了SQL的第一個標準X3.135-1986,不久,國際標準化組織ISO也通過了這個標準,即通常所說的SQL-86。1987年,國際標準化組織(ISO)又將其采納為國際標準。1989年,ANSI和ISO公布了經過增補和修改的SQL-89。此后,又于1992年公布了SQL-92,又稱SQL-2。SQL-2對語言表達式做了較大擴充,同時,增加面向對象功能的SQL3也在起草之中。
目前,許多關系型數據庫供應商都在自己的數據庫中支持SQL語言,如Access、Oracle、Sybase、Infomix、DB2和Microsoft SQL Server等。
SQL語言由3部分組成:
(1) 數據定義語言(DDL,Data Desciption Language)。用于執行數據庫定義的任務,對數據庫以及數據庫中的各種對象進行創建、刪除、修改等操作。數據庫對象主要包括表、默認約束、規則、視圖、觸發器、存儲過程。
(2) 數據操縱語言(DML,Data Manipulation Language)。用于操縱數據庫中各種對象,檢索和修改數據。
(3) 數據控制語言(DCL,Data Control Language)。用于安全管理,確定哪些用戶可以查看或修改數據庫中的數據。
SQL語言主體由大約四十條語句組成,每一條語句都會對DBMS產生特定的動作,如創建新表、檢索數據、更新數據等。SQL語句通常由一個描述要產生的動作謂詞(Verb)關鍵字開始,如Create、Select、Update等。緊隨語句的是一個或多個子句(Clause),子句進一步指明語句對數據的作用條件、范圍、方式等。
1.4.表和視圖
表是關系數據庫中最主要的數據庫對象,它是用來存儲和操作數據的一種邏輯結構。表由行和列組成,因此也稱之為二維表。(1) 表(Table)表是在日常工作和生活中經常使用的一種表示數據及其關系的形式,
(1) 表(Table)表是在日常工作和生活中經常使用的一種表示數據及其關系的形式。
● 表結構
每個數據庫包含了若干個表。每個表具有一定的結構,稱之為表“型”,所謂表型是指組成表的各列的名稱及數據類型,也就是日常表格的“欄目信息”。
● 記錄
每個表包含了若干行數據,它們是表的“值”,表中的一行稱為一個記錄(Record),因此,表是記錄的有限集合。
● 字段
每個記錄由若干個數據項構成,將構成記錄的每個數據項稱為字段(Field)。字段包含的屬性有字段名、字段數據類型、字段長度及是否為關鍵字等,其中字段名是字段的標識,字段的數據類型可以是多樣的,如整型、實型、字符型、日期型或二進制類型等等。
例如學生情況表中,表結構為(學號,姓名,專業名,性別,出生時間),該表由4個記錄組成,它們分別是:(990201,王一,計算機,男,1980/10/01)、(990202,王巍,計算機,女,1981/02/08)、(990302,林滔,電子工程,男,1980/04/06),等等,每個記錄包含5個字段。
● 關鍵字
在學生情況表中,若不加以限制,每個記錄的姓名、專業、性別和出生時間這4個字段的值都有可能相同,但是學號字段的值對表中所有記錄來說一定不同,即通過“學號”字段可以將表中的不同記錄區分開來。
若表中記錄的某一字段或字段組合能唯一標識記錄,則稱該字段或字段組合為候選關鍵字(Candidate key)。若一個表有多個候選關鍵字,則選定其中一個為主關鍵字(Primarykey),也稱為主鍵。當一個表僅有唯一的一個候選關鍵字時,該候選關鍵字就是主關鍵字,例如學生表的主關鍵字為學號。
若某字段或字段組合不是數據庫中A表的關鍵字,但它是數據庫中另外表B的關鍵字,則稱該字段或字段組合為A表的外關鍵字(Foreign key)。
例如,設學生數據庫有三個表:學生表、課程表和學生成績表,其結構分別為:
學生表(學號,姓名,專業名,性別,出生時間)
課程表(課程號,課程名,學分)
學生成績表(學號,課程號,分數)
(帶下畫線表示的字段或字段組合為關鍵字)
可見,單獨的學號、課程號都不是學生成績表的關鍵字,但它們分別是學生表和課程表的關鍵字,所以它們都是學生成績表的外關鍵字。
外關鍵字表示了表之間的參照完整性約束。如學生數據庫中,在學生成績表中出現的學號必須是學生表中出現的,同樣課程號也必須是課程表中出現的。若在學生成績表中出現了一個未在學生表中出現的學號,則會違背參照完整性約束。
(2) 視圖(View)視圖是從一個或多個表(或視圖)導出的表。視圖與表不同,它是一個虛表,即視圖所對應的數據不進行實際存儲,數據庫中只存儲視圖的定義,對視圖的數據進行操作時,系統根據視圖的定義去操作與視圖相關聯的基本表。視圖一經定義以后,就可以像表一樣被查詢、修改、刪除和更新。使用視圖具有便于數據共享、簡化用戶權限管理和屏蔽數據庫的復雜性等優點。如對例表14.1所設的學生數據庫,可創建“學生選課”視圖,該視圖包含以下字段:學號、姓名、課程號、課程名、學分和成績。
二、Qt數據庫
Qt中的QtSql模塊提供了對數據庫的支持,該模塊中的眾多類基本上可以分為三層,如下圖所示。
其中
- 驅動層為具體的數據庫和SQL接口層之間提供了底層的橋梁;
- SQL接口層提供了對數據庫的訪問,其中的QSqlDatabase類用來創建連接,QSqlQuery類可以使用SQL語句來實現與數據庫交互,其他幾個類對該層提供了支持;
- 用戶接口層的幾個類實現了將數據庫中的數據鏈接到窗口部件上,這些類是使用前一章的模型/視圖框架實現的,它們是更高層次的抽象,即便不熟悉SQL也可以操作數據庫。
- 如果要使用QtQql模塊中的這些類,需要在項目文件(.pro文件)中添加QT += sql這一行代碼。對應數據庫部分的內容,大家可以在幫助中查看SQL Programming關鍵字。
QtSql模塊使用數據庫驅動來和不同的數據庫接口進行通信。由于Qt的SQL模型的接口是獨立于數據庫的,所以所有數據庫特定的代碼都包含在了這些驅動中。Qt現在支持的數據庫驅動如下圖所示。
需要說明的是,由于GPL許可證的兼容性問題,并不是這里列出的所有驅動插件都提供給了Qt的開源版本。
?
三、SQL語句
3.1?SQL?CREATE語句
3.1.1 SQL?CREATE TABLE?語句
CREATE TABLE 語句用于創建數據庫中的表。
表由行和列組成,每個表都必須有個表名。
SQL CREATE TABLE 語法
CREATE TABLE?table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);
column_name 參數規定表中列的名稱。
data_type 參數規定列的數據類型(例如 varchar、integer、decimal、date 等等)。
size 參數規定表中列的最大長度。
3.1.2?SQL CREATE DATABASE 語句
CREATE DATABASE 語句用于創建數據庫。
SQL CREATE DATABASE 語法
CREATE DATABASE?dbname;
3.2 SQL INSERT INTO 語句
3.2.1 SQL INSERT INTO 語句
INSERT INTO 語句用于向表中插入新記錄。
SQL INSERT INTO 語法
INSERT INTO 語句可以有兩種編寫形式。
第一種形式無需指定要插入數據的列名,只需提供被插入的值即可:
INSERT INTO?table_name
VALUES (value1,value2,value3,...);
第二種形式需要指定列名及被插入的值:
INSERT INTO?table_name?(column1,column2,column3,...)
VALUES (value1,value2,value3,...);
3.2.2 SQL INSERT INTO SELECT 語句
INERT INTO SELECT 語句從一個表復制數據,然后把數據插入到一個已存在的表中。目標表中任何已存在的行都不會受影響。
SQL INSERT INTO SELECT 語法
我們可以從一個表中復制所有的列插入到另一個已存在的表中:
INSERT INTO?table2
SELECT * FROM?table1;
或者我們可以只復制希望的列插入到另一個已存在的表中:
INSERT INTO?table2
(column_name(s))
SELECT?column_name(s)
FROM?table1;
3.3 SQL UPDATE 語句
UPDATE 語句用于更新表中已存在的記錄。
SQL UPDATE 語法
UPDATE?table_name
SET?column1=value1,column2=value2,...
WHERE?some_column=some_value;
| 請注意 SQL UPDATE 語句中的 WHERE 子句! WHERE 子句規定哪條記錄或者哪些記錄需要更新。如果您省略了 WHERE 子句,所有的記錄都將被更新! |
?
3.4 SQL SELECT 語句
3.4.1 SQL SELECT 語句
SELECT 語句用于從數據庫中選取數據。
結果被存儲在一個結果表中,稱為結果集。
SQL SELECT 語法
SELECT?column_name,column_name
FROM?table_name;
與
SELECT * FROM?table_name;
3.4.2 SQL SELECT DISTINCT 語句
在表中,一個列可能會包含多個重復值,有時您也許希望僅僅列出不同(distinct)的值。
DISTINCT 關鍵詞用于返回唯一不同的值。
SQL SELECT DISTINCT 語法
SELECT DISTINCT?column_name,column_name
FROM?table_name;
3.4.3 SQL SELECT TOP 子句
SELECT TOP 子句用于規定要返回的記錄的數目。
SELECT TOP 子句對于擁有數千條記錄的大型表來說,是非常有用的。
注意:并非所有的數據庫系統都支持 SELECT TOP 語句。 MySQL 支持 LIMIT 語句來選取指定的條數數據, Oracle 可以使用 ROWNUM 來選取。
3.4.4 SQL SELECT INTO 語句
SELECT INTO 語句從一個表復制數據,然后把數據插入到另一個新表中。
注意:
MySQL 數據庫不支持 SELECT ... INTO 語句,但支持?INSERT INTO ... SELECT?。
當然你可以使用以下語句來拷貝表結構及數據:
CREATE TABLE 新表 AS SELECT * FROM 舊表SQL SELECT INTO 語法
我們可以復制所有的列插入到新表中:
SELECT *
INTO?newtable?[IN?externaldb]
FROM?table1;
或者只復制希望的列插入到新表中:
SELECT?column_name(s)
NTO?newtable?[IN?externaldb]
FROM?table1;
?
3.5 SQL WHERE 子句
3.5.1 SQL WHERE 子句
WHERE 子句用于提取那些滿足指定條件的記錄。
SQL WHERE 語法
SELECT?column_name,column_name
FROM?table_name
WHERE?column_name operator value;
3.5.2 SQL AND & OR 運算符
如果第一個條件和第二個條件都成立,則 AND 運算符顯示一條記錄。
如果第一個條件和第二個條件中只要有一個成立,則 OR 運算符顯示一條記錄。
3.5.3 SQL?IN?操作符
IN 操作符允許您在 WHERE 子句中規定多個值。
SQL IN 語法
SELECT?column_name(s)
FROM?table_name
WHERE?column_name?IN (value1,value2,...);
3.5.4 SQL BETWEEN 操作符
BETWEEN 操作符選取介于兩個值之間的數據范圍內的值。這些值可以是數值、文本或者日期。
SQL BETWEEN 語法
SELECT?column_name(s)
FROM?table_name
WHERE?column_name?BETWEEN?value1?AND?value2;
3.5.5 SQL LIKE 操作符
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
SQL LIKE 語法
SELECT?column_name(s)
FROM?table_name
WHERE?column_name?LIKE?pattern;
3.5.6 SQL 通配符
在 SQL 中,通配符與 SQL LIKE 操作符一起使用。
SQL 通配符用于搜索表中的數據。
在 SQL 中,可使用以下通配符:
| % | 替代 0 個或多個字符 |
| _ | 替代一個字符 |
| [charlist] | 字符列中的任何單一字符 |
| [^charlist] 或 [!charlist] | 不在字符列中的任何單一 |
?
3.6 SQL ORDER BY 關鍵字
ORDER BY 關鍵字用于對結果集按照一個列或者多個列進行排序。
ORDER BY 關鍵字默認按照升序對記錄進行排序。如果需要按照降序對記錄進行排序,您可以使用 DESC 關鍵字。
SQL ORDER BY 語法
SELECT?column_name,column_name
FROM?table_name
ORDER BY?column_name,column_name?ASC|DESC;
?
3.7 SQL DELETE 語句
DELETE 語句用于刪除表中的行。
SQL DELETE 語法
DELETE FROM?table_name
WHERE?some_column=some_value;
| 請注意 SQL DELETE 語句中的 WHERE 子句! WHERE 子句規定哪條記錄或者哪些記錄需要刪除。如果您省略了 WHERE 子句,所有的記錄都將被刪除! |
?
3.8 DROP INDEX 語句
3.8.1 DROP INDEX 語句
DROP INDEX 語句用于刪除表中的索引。
用于 MS Access 的 DROP INDEX 語法:
DROP INDEX index_name ON table_name
用于 MS SQL Server 的 DROP INDEX 語法:
DROP INDEX table_name.index_name
用于 DB2/Oracle 的 DROP INDEX 語法:
DROP INDEX index_name
用于 MySQL 的 DROP INDEX 語法:
ALTER TABLE table_name DROP INDEX index_name
3.8.2 DROP TABLE 語句
DROP TABLE 語句用于刪除表。
DROP TABLE table_name
?
3.8.3 DROP DATABASE 語句
DROP DATABASE 語句用于刪除數據庫。
DROP DATABASE database_name
?
3.8.4 TRUNCATE TABLE 語句
如果我們僅僅需要刪除表內的數據,但并不刪除表本身,那么我們該如何做呢?
請使用 TRUNCATE TABLE 語句:
TRUNCATE TABLE table_name
?
3.9 ALTER TABLE 語句
ALTER TABLE 語句用于在已有的表中添加、刪除或修改列。
SQL ALTER TABLE 語法
如需在表中添加列,請使用下面的語法:
ALTER TABLE table_name
ADD column_name datatype
如需刪除表中的列,請使用下面的語法(請注意,某些數據庫系統不允許這種在數據庫表中刪除列的方式):
ALTER TABLE table_name
DROP COLUMN column_name
要改變表中列的數據類型,請使用下面的語法:
SQL Server / MS Access:
ALTER TABLE table_name
ALTER COLUMN column_name datatype
My SQL / Oracle:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype
Oracle 10G 之后版本:
ALTER TABLE table_name MODIFY column_name datatype;?
4、Qt常用數據庫操作
4.1 利用QSqlQuery操作sqlite數據庫
詳見《Qt學習筆記之SQLITE數據庫》
4.2 利用QSqlQuery操作MySQL數據庫
詳見《Qt學習筆記之MySQL數據庫》
參考資料:
1.?QSqlQuery 介紹
2.42.QT-QSqlQuery類操作SQLite數據庫(創建、查詢、刪除、修改)詳解
3.?SQL 教程
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Qt学习笔记之数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt学习笔记之事件处理
- 下一篇: Qt学习笔记之SQLITE数据库