数据库基本概念
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模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓