1.數(shù)據(jù)庫(kù)基本概念
數(shù)據(jù)庫(kù)(Database)是指存儲(chǔ)、管理和組織數(shù)據(jù)的集合。它是一個(gè)組織化的、可持久化的數(shù)據(jù)集合,用于支持?jǐn)?shù)據(jù)的存儲(chǔ)、檢索、更新和管理。
數(shù)據(jù)庫(kù)系統(tǒng)(Database System)是建立在計(jì)算機(jī)上的數(shù)據(jù)管理系統(tǒng),由數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)和應(yīng)用程序組成。它能夠在計(jì)算機(jī)上創(chuàng)建、使用和維護(hù)數(shù)據(jù)庫(kù),提供數(shù)據(jù)的存儲(chǔ)、檢索和管理功能。
數(shù)據(jù)庫(kù)管理系統(tǒng)(Database Management System,DBMS)是一種軟件系統(tǒng),用來(lái)管理數(shù)據(jù)庫(kù),提供對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)和操作接口,包括數(shù)據(jù)的存儲(chǔ)、檢索、更新、刪除、查詢(xún)等功能。常見(jiàn)的DBMS有MySQL、Oracle、SQL Server等。
數(shù)據(jù)庫(kù)模型(Database Model)是數(shù)據(jù)庫(kù)中數(shù)據(jù)的邏輯組織方式。常見(jiàn)的數(shù)據(jù)庫(kù)模型有層次模型、網(wǎng)狀模型、關(guān)系模型和面向?qū)ο竽P?。其中,關(guān)系模型是最常用的數(shù)據(jù)庫(kù)模型,它將數(shù)據(jù)組織為表格(即關(guān)系),并使用關(guān)系代數(shù)和關(guān)系演算進(jìn)行數(shù)據(jù)操作。
數(shù)據(jù)庫(kù)管理系統(tǒng)通過(guò)SQL(Structured Query Language)語(yǔ)言來(lái)操作數(shù)據(jù)庫(kù)。SQL是一種專(zhuān)門(mén)用來(lái)管理和操作關(guān)系型數(shù)據(jù)庫(kù)的語(yǔ)言,它可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢(xún)、更新、刪除、插入等操作。
數(shù)據(jù)庫(kù)的基本概念還包括數(shù)據(jù)模型、數(shù)據(jù)表、字段、記錄、主鍵、外鍵、索引等。數(shù)據(jù)模型定義了數(shù)據(jù)庫(kù)中數(shù)據(jù)的組織方式和關(guān)系;數(shù)據(jù)表是數(shù)據(jù)庫(kù)中數(shù)據(jù)的邏輯結(jié)構(gòu),它由多個(gè)字段組成;字段是數(shù)據(jù)表中的一個(gè)屬性,代表存儲(chǔ)數(shù)據(jù)的最小單元;記錄是數(shù)據(jù)表中的一行,代表一條具體的數(shù)據(jù);主鍵是數(shù)據(jù)表中唯一標(biāo)識(shí)記錄的字段;外鍵是數(shù)據(jù)表中關(guān)聯(lián)其他表的字段;索引是對(duì)數(shù)據(jù)庫(kù)中某個(gè)字段或多個(gè)字段的值進(jìn)行排序和存儲(chǔ),提高查詢(xún)效率。
2.常用SQL語(yǔ)句
2.1 數(shù)據(jù)查詢(xún)
常用的數(shù)據(jù)庫(kù)查詢(xún)SQL語(yǔ)句如下:
-
SELECT: 用于查詢(xún)數(shù)據(jù)庫(kù)中的數(shù)據(jù),可以選擇要查詢(xún)的字段、表格和條件。 例如:SELECT * FROM 表名; // 查詢(xún)表中的所有字段和數(shù)據(jù) SELECT 列名1, 列名2 FROM 表名; // 查詢(xún)指定字段的數(shù)據(jù) SELECT * FROM 表名 WHERE 條件; // 查詢(xún)滿足條件的數(shù)據(jù)
-
INSERT INTO: 用于向數(shù)據(jù)庫(kù)中插入新的數(shù)據(jù)。 例如:INSERT INTO 表名 (列名1, 列名2) VALUES (值1, 值2); // 插入指定字段的數(shù)據(jù)
-
UPDATE: 用于更新數(shù)據(jù)庫(kù)中的數(shù)據(jù)。 例如:UPDATE 表名 SET 列名1 = 新值1, 列名2 = 新值2 WHERE 條件; // 更新滿足條件的數(shù)據(jù)
-
DELETE: 用于刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)。 例如:DELETE FROM 表名 WHERE 條件; // 刪除滿足條件的數(shù)據(jù)
-
WHERE: 用于篩選滿足條件的數(shù)據(jù)。 例如:SELECT * FROM 表名 WHERE 列名 = 值; // 查詢(xún)滿足條件的數(shù)據(jù)
-
ORDER BY: 用于對(duì)查詢(xún)結(jié)果進(jìn)行排序。 例如:SELECT * FROM 表名 ORDER BY 列名 ASC/DESC; // 按照指定列的升序/降序排序
-
GROUP BY: 用于對(duì)查詢(xún)結(jié)果進(jìn)行分組。 例如:SELECT 列名1, 列名2 FROM 表名 GROUP BY 列名1; // 按照指定列進(jìn)行分組
-
JOIN: 用于將多個(gè)表格連接在一起進(jìn)行查詢(xún)。 例如:SELECT * FROM 表名1 JOIN 表名2 ON 表名1.列名 = 表名2.列名; // 連接兩個(gè)表格查詢(xún)數(shù)據(jù)
-
HAVING: 用于在GROUP BY語(yǔ)句中對(duì)分組后的結(jié)果進(jìn)行篩選。 例如:SELECT 列名1, COUNT(列名2) FROM 表名 GROUP BY 列名1 HAVING COUNT(列名2) > 值; // 篩選滿足條件的分組結(jié)果
-
DISTINCT: 用于去重查詢(xún)結(jié)果。 例如:SELECT DISTINCT 列名 FROM 表名; // 查詢(xún)指定字段的去重結(jié)果
以上是一些常用的數(shù)據(jù)庫(kù)查詢(xún)SQL語(yǔ)句,可以根據(jù)具體需求進(jìn)行組合和擴(kuò)展。
2.2 數(shù)據(jù)操作
常用的數(shù)據(jù)庫(kù)數(shù)據(jù)操作SQL語(yǔ)句如下:
-
INSERT INTO: 用于向數(shù)據(jù)庫(kù)中插入新的數(shù)據(jù)。 例如:INSERT INTO 表名 (列名1, 列名2) VALUES (值1, 值2); // 插入指定字段的數(shù)據(jù)
-
UPDATE: 用于更新數(shù)據(jù)庫(kù)中的數(shù)據(jù)。 例如:UPDATE 表名 SET 列名1 = 新值1, 列名2 = 新值2 WHERE 條件; // 更新滿足條件的數(shù)據(jù)
-
DELETE: 用于刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)。 例如:DELETE FROM 表名 WHERE 條件; // 刪除滿足條件的數(shù)據(jù)
-
TRUNCATE TABLE: 用于快速清空表中的數(shù)據(jù),但不會(huì)回滾事務(wù)。 例如:TRUNCATE TABLE 表名; // 清空表中的數(shù)據(jù)
-
CREATE TABLE: 用于創(chuàng)建新的數(shù)據(jù)庫(kù)表。 例如:CREATE TABLE 表名 (列名1 數(shù)據(jù)類(lèi)型, 列名2 數(shù)據(jù)類(lèi)型, ...); // 創(chuàng)建表結(jié)構(gòu)
-
ALTER TABLE: 用于修改數(shù)據(jù)庫(kù)表的結(jié)構(gòu)。 例如:ALTER TABLE 表名 ADD 列名 數(shù)據(jù)類(lèi)型; // 添加新的列 ALTER TABLE 表名 MODIFY 列名 數(shù)據(jù)類(lèi)型; // 修改列的數(shù)據(jù)類(lèi)型 ALTER TABLE 表名 DROP 列名; // 刪除列
-
CREATE INDEX: 用于創(chuàng)建索引,加快查詢(xún)速度。 例如:CREATE INDEX 索引名 ON 表名 (列名); // 在指定列上創(chuàng)建索引
-
DROP INDEX: 用于刪除索引。 例如:DROP INDEX 索引名 ON 表名; // 刪除指定表的索引
-
CREATE VIEW: 用于創(chuàng)建視圖,可以將數(shù)據(jù)庫(kù)中的數(shù)據(jù)以虛擬表的形式展現(xiàn)。 例如:CREATE VIEW 視圖名 AS SELECT 列名1, 列名2 FROM 表名; // 創(chuàng)建視圖
-
DROP VIEW: 用于刪除視圖。 例如:DROP VIEW 視圖名; // 刪除視圖
以上是一些常用的數(shù)據(jù)庫(kù)數(shù)據(jù)操作SQL語(yǔ)句,可以根據(jù)具體需求進(jìn)行組合和擴(kuò)展。
3. QT操作數(shù)據(jù)庫(kù)
3.1 QT操作SQLite數(shù)據(jù)庫(kù)
在QT5中操作SQLite數(shù)據(jù)庫(kù)需要使用QT的數(shù)據(jù)庫(kù)模塊,需要引入以下頭文件:
#include <QtSql>
首先,需要?jiǎng)?chuàng)建一個(gè)Qt數(shù)據(jù)庫(kù)連接對(duì)象,代碼如下:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("database.db"); // 數(shù)據(jù)庫(kù)文件名,可以是絕對(duì)路徑或相對(duì)路徑
if (!db.open()) {
qDebug() << "Failed to open database!";
return;
}
在數(shù)據(jù)庫(kù)打開(kāi)成功后,可以執(zhí)行SQL語(yǔ)句進(jìn)行數(shù)據(jù)操作。例如,創(chuàng)建一個(gè)表并插入數(shù)據(jù):
QSqlQuery query;
query.exec("CREATE TABLE students (id INT PRIMARY KEY, name TEXT, age INT)");
query.prepare("INSERT INTO students (id, name, age) VALUES (?, ?, ?)");
query.addBindValue(1);
query.addBindValue("John");
query.addBindValue(20);
query.exec();
注意,在執(zhí)行SQL語(yǔ)句之前,需要?jiǎng)?chuàng)建一個(gè)QSqlQuery對(duì)象,用于執(zhí)行和操作SQL語(yǔ)句??梢允褂胑xec()函數(shù)執(zhí)行SQL語(yǔ)句,或使用prepare()和bindValue()函數(shù)準(zhǔn)備并執(zhí)行參數(shù)化查詢(xún)。
執(zhí)行查詢(xún)語(yǔ)句并獲取結(jié)果:
if (query.exec("SELECT * FROM students")) {
while (query.next()) {
int id = query.value(0).toInt();
QString name = query.value(1).toString();
int age = query.value(2).toInt();
qDebug() << "ID:" << id << "Name:" << name << "Age:" << age;
}
}
以上代碼演示了如何執(zhí)行SELECT語(yǔ)句并獲取查詢(xún)結(jié)果。可以通過(guò)value()函數(shù)根據(jù)字段索引或字段名獲取對(duì)應(yīng)的值。
最后,關(guān)閉數(shù)據(jù)庫(kù)連接:
db.close();
以上是簡(jiǎn)單的示例代碼,通過(guò)QT的數(shù)據(jù)庫(kù)模塊可以實(shí)現(xiàn)更復(fù)雜的數(shù)據(jù)庫(kù)操作,如更新、刪除、事務(wù)處理等。詳細(xì)的API文檔可以參考QT官方文檔。
3.2 QT操作主從視圖及XML
在QT中,可以使用QTableView和QStandardItemModel來(lái)實(shí)現(xiàn)主從視圖的操作。
首先,需要?jiǎng)?chuàng)建兩個(gè)QTableView和對(duì)應(yīng)的QStandardItemModel,一個(gè)是主視圖,一個(gè)是從視圖。代碼如下:
QTableView* masterTableView = new QTableView;
QStandardItemModel* masterModel = new QStandardItemModel;
QTableView* detailTableView = new QTableView;
QStandardItemModel* detailModel = new QStandardItemModel;
然后,將數(shù)據(jù)模型設(shè)置給相應(yīng)的視圖:
masterTableView->setModel(masterModel);
detailTableView->setModel(detailModel);
接下來(lái),可以使用模型的方法來(lái)填充數(shù)據(jù),例如:
QStandardItem* item1 = new QStandardItem("Item 1");
QStandardItem* item2 = new QStandardItem("Item 2");
QStandardItem* item3 = new QStandardItem("Item 3");
masterModel->appendRow({ item1, item2, item3 });
在主視圖中,可以監(jiān)聽(tīng)當(dāng)前選中的行,并根據(jù)選中的行來(lái)更新從視圖的數(shù)據(jù)。代碼如下:
connect(masterTableView->selectionModel(), &QItemSelectionModel::currentRowChanged, [=](const QModelIndex& current, const QModelIndex& previous) {
if (current.isValid()) {
int row = current.row();
// 根據(jù)選中的行更新從視圖的數(shù)據(jù)
// ...
}
});
以上代碼演示了如何根據(jù)主視圖的選中行來(lái)更新從視圖的數(shù)據(jù)。你可以根據(jù)實(shí)際需求來(lái)獲取選中行的數(shù)據(jù),并更新從視圖的模型。
關(guān)于XML的操作,QT提供了QXmlStreamReader和QXmlStreamWriter兩個(gè)類(lèi)來(lái)讀取和寫(xiě)入XML數(shù)據(jù)。
例如,讀取XML文件并解析數(shù)據(jù):
QFile file("data.xml");
if (file.open(QIODevice::ReadOnly)) {
QXmlStreamReader reader(&file);
while (!reader.atEnd()) {
if (reader.isStartElement()) {
if (reader.name() == "name") {
QString name = reader.readElementText();
qDebug() << "Name:" << name;
}
}
reader.readNext();
}
if (reader.hasError()) {
qDebug() << "XML Error:" << reader.errorString();
}
file.close();
}
以上代碼演示了如何逐行讀取XML文件中的數(shù)據(jù)。你可以根據(jù)標(biāo)簽名來(lái)獲取相應(yīng)的數(shù)據(jù)。
寫(xiě)入XML數(shù)據(jù)的過(guò)程與讀取類(lèi)似,首先創(chuàng)建QXmlStreamWriter對(duì)象,并調(diào)用相應(yīng)的方法來(lái)寫(xiě)入數(shù)據(jù):
QFile file("data.xml");
if (file.open(QIODevice::WriteOnly)) {
QXmlStreamWriter writer(&file);
writer.setAutoFormatting(true);
writer.writeStartDocument();
writer.writeStartElement("root");
writer.writeTextElement("name", "Name 1");
writer.writeEndElement();
writer.writeEndDocument();
file.close();
}
以上代碼演示了如何創(chuàng)建一個(gè)XML文件,并寫(xiě)入一些簡(jiǎn)單的數(shù)據(jù)。你可以根據(jù)實(shí)際需求來(lái)添加更多的標(biāo)簽和數(shù)據(jù)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-814570.html
QT提供了豐富的API來(lái)處理主從視圖和XML數(shù)據(jù)操作,上述代碼只是簡(jiǎn)單示例,具體的使用方式可以參考QT官方文檔。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-814570.html
到了這里,關(guān)于QT基礎(chǔ)篇(13)QT5數(shù)據(jù)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!