QT数据库及使用方法_qt数据库前端-程序员宅基地

技术标签: qt  qt教程  qt开发  qt数据库  QT开发  数据库  qt编程  C++数据库  

数据库基本概念

1、数据库( DataBase,DB)

存放数据的地方,特点是数据按照数据模型组织,是高度结构化的,可供多个用户共享并具有一定的安全性。

2、关系型数据库

按照二维表结构方式组织的数据集合,二维表由行和列组成,表的行称为元组,列称为属性,对表的操作称为关系运算,主要的关系运算有投影、选择和连接等。

3、数据库管理系统(DataBase Management System,DBMS)

它是位于用户应用程序和操作系统之间的数据库管理系统软件,其主要功能是组织、存储和管理数据,高效地访问和维护数据,即提供数据定义、数据操纵、数据控制和数据维护等功能。常用的数据库管理系统有Oracle、Microsoft SQL Server和MySQL等。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(Qt实战项目,C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

4、数据库系统(DataBase System,DBS)

指按照数据库方式存储和维护数据,并向应用程序提供数据访问接口的系统
DBS通常由数据库、计算机硬件(支持DB存储和访问)、软件(包括操作系统、DBMS及应用开发支撑软件)和数据库管理员(DataBase Administrator,DBA)四个部分组成。

分为两类:桌面型和网络型

桌面型数据库系统指只在本机运行、不与其他计算机交换数据的系统,常用于小型信息管理系统,这类数据库系统的典型代表是VFP和Access。

网络型数据库系统指通过计算机网络进行数据共享和交换的系统,常用于构建较复杂的C/S结构或B/S结构的分布式应用系统,大多数数据库系统均属于此类,如Oracle、Microsoft SQL Sever等。

5、结构化查询语言SQL

结构化查询语言(Structured Query Language,SQL)是用于关系数据库操作的标准语言,最早由Boyce和Chambedin在1974年提出,称为SEQUEL语言。
SQL语言由以下三部分组成。
(1)数据定义语言(Data Description Language,DDL),用于执行数据库定义的任务,对数据库及数据库中的各种对象进行创建、删除和修改等操作。数据库对象主要包括表、默认约束、规则、视图、触发器和存储过程等。
(2)数据操纵语言(Data Manipulation Language,DML),用于操纵数据库中各种对象,检索和修改数据。
(3)数据控制语言(Data Control Language,DCL),用于安全管理,确定哪些用户可以查看或修改数据库中的数据。

6、数据库的增删改查

查询语句 SELECT

(1)查询Student数据库。查询students表中各个同学的姓名和总学分。

USE Student SELECT name,totalscore FROM students

(2)查询表中所有记录。查询students表中各个同学的所有信息。

SELECT * FROM students

(3)条件查询。查询students表中总学分大于等于120的同学的情况。

SELECT * FROM students 
  WHERE totalscore >=  120

(4)多重条件查询。查询students表中所在系为“计算机”且总学分大于等于120的同学的情况。

SELECT * FROM students
  WHERE department='计算机' AND totalscore >= 120

(5)使用LIKE谓词进行模式匹配。查询students表中姓“王”且单名的学生情况。

SELECT * FROM students 
  WHERE name LIKE '王_'

(6)用BETWEEN…AND指定查询范围。查询students表中不在1999年出生的学生情况。

SELECT * FROM students 
  WHERE birthday NOT BETWEEN '1999-1-1' and '1999-12-31'

(7)空值比较。查询总学分尚不确定的学生情况。

SELECT * FROM students
  WHERE totalscore IS NULL

(8)自然连接查询。查找计算机系学生姓名及其“C程序设计”课程的考试分数情况。

SLELCT name,grade
FROM students, courses,grades,
WHERE department = '计算机' AND coursename= ' C程序设计' AND
students.studentid = grades.studentid AND courses.courseid =
grades.coursesid

(9)IN子查询。查找选修了课程号为101的学生情况。

SELECT * FROM students
	WHERE studentid IN
		  ( SELECT studentid FROM courses WHERE courseid = '101' )

在执行包含子查询的SELECT语句时,系统首先执行子查询,产生一个结果表,再执行外查询。本例中,首先执行子查询:

SELECT studentid FROM courses, students,grades WHERE courseid = '101'
AND students.studentid = grades.studentid AND courses.courseid =
grades.coursesid

得到一个只含有studentid列的结果表,courses中courseid列值为101的行在该结果表中都有一行。

(10)比较子查询。这种子查询可以认为是IN子查询的扩展,它是表达式的值与子查询的结果进行比较运算。查找课程号206的成绩不低于课程号101的最低成绩的学生学号。

SELECT studentid FROM grades
	 WHERE courseid = '206' AND grade !< ANY 
	     ( SELECT grade FROM grades WHERE courseid = '101')

(11)EXISTS子查询。EXISTS谓词用于测试子查询的结果是否为空表,若子查询的结果集不为空,则EXISTS返回TRUE,否则返回FALSE。EXISTS还可与NOT结合使用,即NOT EXISTS,其返回值与EXISTS刚好相反。查找选修206号课程的学生姓名。

SELECT name FROM students
      WHERE EXISTS
         ( SELECT * FROM grades
                 WHERE studentid = students.studentid AND courseid = '206' 
		)

(12)查找选修了全部课程的同学姓名(即查找没有一门功课不选修的学生)。

SELECT name FROM students
   WHERE NOT EXISTS
       ( SELECT * FROM courses
             WHERE NOT EXISTS
             	( SELECT * FROM grades
                   	WHERE studentid= students.studentid
                          AND courseid=courses.courseid)
       )

(13)查询结果分组。将各课程成绩按学号分组。

SELECT studentid,grade FROM grades
    GROUP BY studentid

(14)查询结果排序。将计算机系的学生按出生时间先后排序。

SELECT * FROM students
   WHERE department = '计算机'
     ORDER BY birthday

(15)聚合函数的使用

// 求选修101课程学生的平均成绩。
SELECT AVG(grade) AS ' 课程101平均成绩'
    FROM grades   
    WHERE courseid = '101'
// 求选修101课程学生的最高分和最低分。
SELECT MAX(grade) AS '课程101最高分' , MIN(grade) AS '课程101最低分'
    FROM grades   
    WHERE courseid = '101'
// 求学生的总人数。
SELECT COUNT(*) AS '学生总数'
   	FROM students

插入语句 INSERT

INSERT可添加一条或多条记录至一个表中。

INSERT有两种语法形式。

语法1:

INSERT INTO target [IN externaldatabase] (fields_list)
{DEFAULT VALUES|VALUES(DEFAULT|expression_list)}

语法2:

INSERT INTO target [IN externaldatabase] fields_list
{SELECT…|EXECUTE…}

第1种形式将一个记录或记录的部分字段插入到表或视图中。

第2种形式的INSERT语句插入来自SELECT语句或来自使用EXECUTE语句执行的存储过程的结果集。

例如,用以下语句向students表添加一条记录:

INSERT INTO students
VALUES('170206','罗亮', 0 ,'1/30/1998', 1, 150)

删除语句 DELETE

DELETE用于从一个或多个表中删除记录。

DELETE语句的语法格式如下:

DELETE FROM table_names [WHERE…]

例如,用以下语句从students表中删除姓名为“罗亮”的记录:

DELETE FROM students
WHERE name = '罗亮'

数据库操作

QT提供QtSql模块实现对数据库的访问,同时提供调用接口。

SQLite数据库介绍:

Qt提供了一种进程内数据库SQLite。它小巧灵活,无须额外安装配置且支持大部分ANSI SQL92标准,是一个轻量级的数据库。
概括起来具有以下优点。
(1)SQLite的设计目的是嵌入式SQL数据库引擎,它基于纯C语言代码,已经应用于非常广泛的领域内。
(2)SQLite在需要持久存储时可以直接读写硬盘上的数据文件,在无须持久存储时也可以将整个数据库置于内存中,两者均不需要额外的服务器端进程,即SQLite是无须独立运行的数据库引擎。
(3)开放源代码,整个代码少于3万行,有良好的注释和90%以上的测试覆盖率。
(4)少于250KB的内存占用容量(gcc编译情况下)。
(5)支持视图、触发器和事务,支持嵌套SQL功能。
(6)提供虚拟机用于处理SQL语句。
(7)不需要配置,不需要安装,也不需要管理员。
(8)支持大部分ANSI SQL92标准。
(9)大部分应用的速度比目前常见的客户端/服务器结构的数据库快。
(10)编程接口简单易用。

QtSql模块使用驱动插件(driver plugins)与不同的数据库接口通信

以SQLite数据库为例

QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());// 设置显示中文
QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE");      // 访问QSQLITE驱动
db.setHostName("easybook-3313b0");                          // 设置数据库主机名
db.setDatabaseName("qtDB.db");                              // 设置数据库名
db.setUserName("zhouhejun");                                // 设置数据库用户名
db.setPassword("123456");                                   // 设置数据库密码
db.open();                             		            // 打开连接

//创建数据库表
QSqlQuery query;
bool success=query.exec("create table automobil(id int primary key,attribute varchar,type varchar,kind varchar,nation int,carnumber int,elevaltor int,distance int,oil int,temperature int)");
if(success)
    qDebug()<<QObject::tr("数据库表创建成功!\n");
else
    qDebug()<<QObject::tr("数据库表创建失败!\n");

//查询
query.exec("select * from automobil");
QSqlRecord rec = query.record();
qDebug() << QObject::tr("automobil表字段数:" )<< rec.count();

//插入记录
QTime t;
t.start();
query.prepare("insert into automobil values(?,?,?,?,?,?,?,?,?,?)");

long records=100;
for(int i=0;i<records;i++)
{
    query.bindValue(0,i);
    query.bindValue(1,"四轮");
    query.bindValue(2,"轿车");
    query.bindValue(3,"富康");
    query.bindValue(4,rand()%100);
    query.bindValue(5,rand()%10000);
    query.bindValue(6,rand()%300);
    query.bindValue(7,rand()%200000);
    query.bindValue(8,rand()%52);
    query.bindValue(9,rand()%100);

    success=query.exec();
    if(!success)
    {
        QSqlError lastError=query.lastError();
        qDebug()<<lastError.driverText()<<QString(QObject::tr("插入失败"));
    }
}
qDebug()<<QObject::tr("插入 %1 条记录,耗时:%2 ms").arg(records).arg(t.elapsed());

//排序
t.restart();
success=query.exec("select * from automobil order by id desc");
if(success)
    qDebug()<<QObject::tr("排序 %1 条记录,耗时:%2 ms").arg(records).arg(t.elapsed());
else
    qDebug()<<QObject::tr("排序失败!");

//更新记录
t.restart();
for(int i=0;i<records;i++)
{
   query.clear();
   query.prepare(QString("update automobil set attribute=?,type=?,"
                         "kind=?,nation=?,"
                         "carnumber=?,elevaltor=?,"
                         "distance=?,oil=?,"
                         "temperature=? where id=%1").arg(i));

   query.bindValue(0,"四轮");
   query.bindValue(1,"轿车");
   query.bindValue(2,"富康");
   query.bindValue(3,rand()%100);
   query.bindValue(4,rand()%10000);
   query.bindValue(5,rand()%300);
   query.bindValue(6,rand()%200000);
   query.bindValue(7,rand()%52);
   query.bindValue(8,rand()%100);

   success=query.exec();
   if(!success)
   {
       QSqlError lastError=query.lastError();
       qDebug()<<lastError.driverText()<<QString(QObject::tr("更新失败"));
   }
}
qDebug()<<QObject::tr("更新 %1 条记录,耗时:%2 ms").arg(records).arg(t.elapsed());

//删除
t.restart();
query.exec("delete from automobil where id=15");
qDebug()<<QObject::tr("删除一条记录,耗时:%1 ms").arg(t.elapsed());

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(Qt实战项目,C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_73443478/article/details/132713972

智能推荐

class和struct的区别-程序员宅基地

文章浏览阅读101次。4.class可以有⽆参的构造函数,struct不可以,必须是有参的构造函数,⽽且在有参的构造函数必须初始。2.Struct适⽤于作为经常使⽤的⼀些数据组合成的新类型,表示诸如点、矩形等主要⽤来存储数据的轻量。1.Class⽐较适合⼤的和复杂的数据,表现抽象和多级别的对象层次时。2.class允许继承、被继承,struct不允许,只能继承接⼝。3.Struct有性能优势,Class有⾯向对象的扩展优势。3.class可以初始化变量,struct不可以。1.class是引⽤类型,struct是值类型。

android使用json后闪退,应用闪退问题:从json信息的解析开始就会闪退-程序员宅基地

文章浏览阅读586次。想实现的功能是点击顶部按钮之后按关键字进行搜索,已经可以从服务器收到反馈的json信息,但从json信息的解析开始就会闪退,加载listview也不知道行不行public abstract class loadlistview{public ListView plv;public String js;public int listlength;public int listvisit;public..._rton转json为什么会闪退

如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet-程序员宅基地

文章浏览阅读219次。如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet

系统项目报表导出功能开发_积木报表 多线程-程序员宅基地

文章浏览阅读521次。系统项目报表导出 导出任务队列表 + 定时扫描 + 多线程_积木报表 多线程

ajax 如何从服务器上获取数据?_ajax 获取http数据-程序员宅基地

文章浏览阅读1.1k次,点赞9次,收藏9次。使用AJAX技术的好处之一是它能够提供更好的用户体验,因为它允许在不重新加载整个页面的情况下更新网页的某一部分。另外,AJAX还使得开发人员能够创建更复杂、更动态的Web应用程序,因为它们可以在后台与服务器进行通信,而不需要打断用户的浏览体验。在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种常用的技术,用于在不重新加载整个页面的情况下,从服务器获取数据并更新网页的某一部分。使用AJAX,你可以创建异步请求,从而提供更快的响应和更好的用户体验。_ajax 获取http数据

Linux图形终端与字符终端-程序员宅基地

文章浏览阅读2.8k次。登录退出、修改密码、关机重启_字符终端

随便推点

Python与Arduino绘制超声波雷达扫描_超声波扫描建模 python库-程序员宅基地

文章浏览阅读3.8k次,点赞3次,收藏51次。前段时间看到一位发烧友制作的超声波雷达扫描神器,用到了Arduino和Processing,可惜啊,我不会Processing更看不懂人家的程序,咋办呢?嘿嘿,所以我就换了个思路解决,因为我会一点Python啊,那就动手吧!在做这个案例之前先要搞明白一个问题:怎么将Arduino通过超声波检测到的距离反馈到Python端?这个嘛,我首先想到了串行通信接口。没错!就是串口。只要Arduino将数据发送给COM口,然后Python能从COM口读取到这个数据就可以啦!我先写了一个测试程序试了一下,OK!搞定_超声波扫描建模 python库

凯撒加密方法介绍及实例说明-程序员宅基地

文章浏览阅读4.2k次。端—端加密指信息由发送端自动加密,并且由TCP/IP进行数据包封装,然后作为不可阅读和不可识别的数据穿过互联网,当这些信息到达目的地,将被自动重组、解密,而成为可读的数据。不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。2.使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。_凯撒加密

工控协议--cip--协议解析基本记录_cip协议embedded_service_error-程序员宅基地

文章浏览阅读5.7k次。CIP报文解析常用到的几个字段:普通类型服务类型:[0x00], CIP对象:[0x02 Message Router], ioi segments:[XX]PCCC(带cmd和func)服务类型:[0x00], CIP对象:[0x02 Message Router], cmd:[0x101], fnc:[0x101]..._cip协议embedded_service_error

如何在vs2019及以后版本(如vs2022)上添加 添加ActiveX控件中的MFC类_vs添加mfc库-程序员宅基地

文章浏览阅读2.4k次,点赞9次,收藏13次。有时候我们在MFC项目开发过程中,需要用到一些微软已经提供的功能,如VC++使用EXCEL功能,这时候我们就能直接通过VS2019到如EXCEL.EXE方式,生成对应的OLE头文件,然后直接使用功能,那么,我们上篇文章中介绍了vs2017及以前的版本如何来添加。但由于微软某些方面考虑,这种方式已被放弃。从上图中可以看出,这一功能,在从vs2017版本15.9开始,后续版本已经删除了此功能。那么我们如果仍需要此功能,我们如何在新版本中添加呢。_vs添加mfc库

frame_size (1536) was not respected for a non-last frame_frame_size (1024) was not respected for a non-last-程序员宅基地

文章浏览阅读785次。用ac3编码,执行编码函数时报错入如下:[ac3 @ 0x7fed7800f200] frame_size (1536) was not respected for anon-last frame (avcodec_encode_audio2)用ac3编码时每次送入编码器的音频采样数应该是1536个采样,不然就会报上述错误。这个数字并非刻意固定,而是跟ac3内部的编码算法原理相关。全网找不到,国内音视频之路还有很长的路,音视频人一起加油吧~......_frame_size (1024) was not respected for a non-last frame

Android移动应用开发入门_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量-程序员宅基地

文章浏览阅读230次,点赞2次,收藏2次。创建Android应用程序一个项目里面可以有很多模块,而每一个模块就对应了一个应用程序。项目结构介绍_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量

推荐文章

热门文章

相关标签