QT 数据库及其使用_qt自带的数据库位置-程序员宅基地

技术标签: QT  数据库基本概念  数据库  数据库基本操作  

数据库基本概念
1、数据库( DataBase,DB)

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

2、关系型数据库

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

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

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

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());
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bloke_come/article/details/83016394

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签