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

智能推荐

JWT(Json Web Token)实现无状态登录_无状态token登录-程序员宅基地

文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录

SDUT OJ逆置正整数-程序员宅基地

文章浏览阅读293次。SDUT OnlineJudge#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a;b=a%10;c=a/10%10;d=a/100%10;int key[3];key[0]=b;key[1]=c;key[2]=d;for(int i = 0;i<3;i++){ if(key[i]!=0) { cout<<key[i.

年终奖盲区_年终奖盲区表-程序员宅基地

文章浏览阅读2.2k次。年终奖采用的平均每月的收入来评定缴税级数的,速算扣除数也按照月份计算出来,但是最终减去的也是一个月的速算扣除数。为什么这么做呢,这样的收的税更多啊,年终也是一个月的收入,凭什么减去12*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表

matlab 提取struct结构体中某个字段所有变量的值_matlab读取struct类型数据中的值-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值

Android fragment的用法_android reader fragment-程序员宅基地

文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment

FFT of waveIn audio signals-程序员宅基地

文章浏览阅读2.8k次。FFT of waveIn audio signalsBy Aqiruse An article on using the Fast Fourier Transform on audio signals. IntroductionThe Fast Fourier Transform (FFT) allows users to view the spectrum content of _fft of wavein audio signals

随便推点

Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具_awesomemac-程序员宅基地

文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac

java前端技术---jquery基础详解_简介java中jquery技术-程序员宅基地

文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术

Ant Design Table换滚动条的样式_ant design ::-webkit-scrollbar-corner-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;amp;::-webkit-scrollbar { height: 5px; } &amp;amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner

javaWeb毕设分享 健身俱乐部会员管理系统【源码+论文】-程序员宅基地

文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!

论文开题报告怎么写?_开题报告研究难点-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点

原生JS 与 VUE获取父级、子级、兄弟节点的方法 及一些DOM对象的获取_获取子节点的路径 vue-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏17次。原生先获取对象var a = document.getElementById("dom");vue先添加ref <div class="" ref="divBox">获取对象let a = this.$refs.divBox获取父、子、兄弟节点方法var b = a.childNodes; 获取a的全部子节点 var c = a.parentNode; 获取a的父节点var d = a.nextSbiling; 获取a的下一个兄弟节点 var e = a.previ_获取子节点的路径 vue

推荐文章

热门文章

相关标签