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 教程
Qt学习笔记之数据库相关推荐
- Qt学习笔记之MySQL数据库
一.MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQ ...
- Qt学习笔记,Qt国际化
Qt学习笔记,Qt国际化 Qt国际化步骤: 第一步:设置.pro文件,加入TRANSLATIONS为国际化做准备 TRANSLATIONS = language/language_en.ts\ ...
- Qt学习笔记,Qt程序架构设计要旨
Qt学习笔记,Qt程序架构设计要旨 时间过得很快,转眼学习Qt已经有一个多月了,对Qt的学习也在不断的深入中.自己手下的code也很多了,不过不得不说,还有很多的部分没有接触过,比如网络编程,2D,3 ...
- oracle protocol=beq 不可用,学习笔记:Oracle数据库坏块 深入研究obj$坏块导致exp/expdp不能执行原因...
天萃荷净 深入研究Oracle坏块obj$导致exp/expdp不能执行导出的原因 上篇(案例:Oracle出现obj$坏块exp/expdp导出不能导出的解决办法ORA-01578 ORA-0111 ...
- Qt学习笔记之文件处理
Qt提供了通用的文件处理类QFile和处理文本的QTextStream类和处理二进制数据的QDataStream类,这些流操作极大地方便了对文件的督促存储.对文件信息和目录进行操作的类是QfileIn ...
- Qt学习笔记之国际化
国际化的英文表述为Internationalization,通常简写为I18N(首尾字母加中间的字符数),一个应用程序的国际化就是使该应用程序可以让其他国家的用户使用的过程. 1. 相关的Qt类和AP ...
- Qt学习笔记之 字符串类型小结
1. Qt常用字符串类型 1.1 QString QString是Unicode编码的字符串,存储一系列16位的QChar,每一个QChar对应一个Unicode 4.0编码的字符,详见<Qt学 ...
- 家族关系查询系统程序设计算法思路_【学习笔记】数据库基础 - 查询优化
目录 什么是数据库查询优化? 影响查询优化的因素 优化策略概述 查询优化的总体思路 语义优化 -- 内容等价性 语法优化(逻辑层优化)---语法等价性 执行优化(物理层优化) 查询优化在DBMS中的位 ...
- Qt学习笔记,再次分析EVA源码之后得出的结论-QListView,QListViewItem(Qt3);Q3ListView,Q3ListViewItem(Qt4)...
Qt学习笔记,再次分析EVA源码之后得出的结论-QListView,QListViewItem(Qt3);Q3ListView,Q3ListViewItem(Qt4) 今天再次分析了Eva的源码,也看 ...
最新文章
- 把java文件打包成.jar (jar命令详解)
- java中object转int
- 通过Runtime源码了解关联对象的实现
- Windows核心编程 第四章 进程(下)
- [转帖] 固定硬盘接口 U.2和M.2
- ARM的交叉编译工具
- 编写批处理文件-------基础
- 【直观理解】一文搞懂RNN(循环神经网络)基础篇
- Java交流|面试最后一问:你有什么问题想问我吗?
- 防止System.exit调用
- matlab计算16 1 3近似值,8. 科学计算软件Matlab中默认情况下π为近似值3.1416,该近似值与π真值的( )...
- Yii2 behaviors中verbs access的一些理解
- 机器学习之 特征工程
- 如何注册CUBA Studio
- hbase shell相关命令
- 风险预测模型_【期刊导读】长期NA治疗的慢乙肝患者也有专属肝癌风险预测模型...
- Centos7 Kubernetes(k8s) 开发服务器(单服务器)部署 kibana
- 计算机网络存储设备有哪些,存储设备有哪些
- Html+CSS三栏式伸缩布局
- 【Python】聊聊Python ctypes 模块
热门文章
- boost::mpl::plus相关的测试程序
- boost::mpl::less相关的测试程序
- boost::proto::switch_相关的测试程序
- 使用 Proto 构建了一个简单但功能强大的 lambda 库的测试程序
- boost::mp11::mp_map_update相关用法的测试程序
- boost::fusion::make_fused_function_object用法的测试程序
- Boost.Flyweight 复合设计示例
- Boost:bind绑定状态的测试程序
- Boost:bind绑定数据成员的测试程序
- OpenCV用代码解释单应性的基本概念