第13章Qt5数据库数据库基本概念13.113.2常用SQL命令Qt操作数据库及实例13.313.1数据库基本概念1.数据和数据库(DB)利用计算机进行数据处理,首先需要将信息以数据形式存储到计算机中,因为数据是可以被计算机接收和处理的符号。根据所表示的信息特征不同,数据有不同的类别,如数字、文字、表格、图形/图像和声音等。数据库(DataBase,DB),顾名思义,就是存放数据的仓库,其特点是数据按照数据模型组织,是高度结构化的,可供多个用户共享并且具有一定的安全性。2.数据库管理系统(DBMS)数据库管理系统即DBMS(DataBaseManagementSystem),它是位于用户应用程序和操作系统之间的数据库管理系统软件,其主要功能是组织、存储和管理数据,高效地访问和维护数据,即提供数据定义、数据操纵、数据控制和数据维护等功能。常用的数据库管理系统有Oracle、MicrosoftSQLServer和MySQL等。数据库系统即DBS(DataBaseSystem),是指按照数据库方式存储和维护数据,并向应用程序提供数据访问接口的系统。DBS通常由数据库、计算机硬件(支持DB存储和访问)、软件(包括操作系统、DBMS及应用开发支撑软件)和数据库管理员(DataBaseAdministrator,DBA)四个部分组成。其中,DBA是控制数据整体结构的人,负责数据库系统的正常运行,承担创建、监控和维护整个数据库结构的责任。13.1数据库基本概念3.结构化查询语言SQL结构化查询语言(StructuredQueryLanguage,SQL)是用于关系数据库操作的标准语言,最早由Boyce和Chambedin在1974年提出,称为SEQUEL语言。目前,许多关系型数据库供应商都在自己的数据库中支持SQL语言,如Access、MySQL、Oracle和MicrosoftSQLServer等,其中大部分数据库遵守的是SQL-89标准。SQL语言由以下三部分组成。(1)数据定义语言(DataDescriptionLanguage,DDL),用于执行数据库定义的任务,对数据库及数据库中的各种对象进行创建、删除和修改等操作。数据库对象主要包括表、默认约束、规则、视图、触发器和存储过程等。(2)数据操纵语言(DataManipulationLanguage,DML),用于操纵数据库中各种对象,检索和修改数据。(3)数据控制语言(DataControlLanguage,DCL),用于安全管理,确定哪些用户可以查看或修改数据库中的数据。13.1数据库基本概念4.表和视图(1)表(Table)。表是在日常工作和生活中经常使用的一种表示数据及其关系的形式,如表13.1为一个学生表。学号姓名专业名性别出生时间150201王一计算机男1996/10/01150202王巍计算机女1997/02/08150302林滔电子工程男1996/04/06150303江为中电子工程男1999/12/0813.1数据库基本概念下面是表的定义。表结构每个数据库包含若干个表。每个表具有一定的结构,称为表的“型”。所谓表型是指组成表的各列的名称及数据类型,也就是日常表格的“栏目信息”。记录每个表包含若干行数据,它们是表的“值”,表中的一行称为一个记录(Record)。因此,表是记录的有限集合。字段每个记录由若干个数据项构成,将构成记录的每个数据项称为字段(Field)。字段包含的属性有字段名、字段数据类型、字段长度及是否为关键字等。关键字在学生表中,若不加以限制,则每条记录的姓名、专业、性别和出生时间这四个字段的值都有可能相同,但是学号字段的值对表中所有记录来说则一定不同,即通过“学号”字段可以将表中的不同记录区分开来。13.1数据库基本概念(2)视图(View)。视图是从一个或多个表(或视图)导出的表。视图与表不同,它是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义操作与视图相关联的基本表。视图一经定义后,就可以像表一样被查询、修改、删除和更新。使用视图具有便于数据共享、简化用户权限管理和屏蔽数据库的复杂性等优点。13.2常用SQL命令13.2.1数据查询1.SELECT语句完备的SELECT语句很复杂,它主要的子句如下:SELECT[DISTINCT][别名.]字段名或表达式[AS列标题]/*指定要选择的列或行及其限定*///(a)FROMtable_source/*FROM子句,指定表或视图*/[WHEREsearch_condition]/*WHERE子句,指定查询条件*///(b)[GROUPBYgroup_by_expression]/*GROUPBY子句,指定分组表达式*/[ORDERBYorder_expression[ASC|DESC]]/*ORDERBY子句,指定排序表达式和顺序*///(c)13.2.1数据查询(1)查询Student数据库。查询students表中各个同学的姓名和总学分。USEStudentSELECTname,totalscoreFROMstudents(2)查询表中所有记录。查询students表中各个同学的所有信息。SELECT*FROMstudents(3)条件查询。查询students表中总学分大于等于120的同学的情况。SELECT*FROMstudentsWHEREtotalscore=120(4)多重条件查询。查询students表中所在系为“计算机”且总学分大于等于120的同学的情况。SELECT*FROMstudentsWHEREdepartment='计算机'ANDtotalscore=120(5)使用LIKE谓词进行模式匹配。查询students表中姓“王”且单名的学生情况。SELECT*FROMstudentsWHEREnameLIKE'王_'13.2.1数据查询(6)用BETWEEN…AND指定查询范围。查询students表中不在1997年出生的学生情况。SELECT*FROMstudentsWHEREbirthdayNOTBETWEEN'1997-1-1'and'1997-12-31'(7)空值比较。查询总学分尚不确定的学生情况。SELECT*FROMstudentsWHEREtotalscoreISNULL(8)自然连接查询。查找计算机系学生姓名及其“C程序设计”课程的考试分数情况。SLELCTname,gradeFROMstudents,courses,grades,WHEREdepartment='计算机'ANDcoursename='C程序设计'ANDstudents.studentid=grades.studentidANDcourses.courseid=grades.coursesid13.2.1数据查询(9)IN子查询。查找选修了课程号为101的学生情况。SELECT*FROMstudentsWHEREstudentidIN(SELECTstudentidFROMcoursesWHEREcourseid='101')在执行包含子查询的SELECT语句时,系统首先执行子查询,产生一个结果表,再执行外查询。本例中,首先执行子查询:SELECTstudentidFROMcourses,students,gradesWHEREcourseid='101'ANDstudents.studentid=grades.studentidANDcourses.courseid=grades.coursesid13.2.1数据查询(10)比较子查询。这种子查询可以认为是IN子查询的扩展,它是表达式的值与子查询的结果进行比较运算。查找课程号206的成绩不低于课程号101的最低成绩的学生学号。SELECTstudentidFROMgradesWHEREcourseid='206'ANDgrade!ANY(SELECTgradeFROMgradesWHEREcourseid='101')(11)EXISTS子查询。EXISTS谓词用于测试子查询的结果是否为空表,若子查询的结果集不为空,则EXISTS返回TRUE,否则返回FALSE。EXISTS还可与NOT结合使用,即NOTEXISTS,其返回值与EXISTS刚好相反。查找选修206号课程的学生姓名。SELECTnameFROMstudentsWHEREEXISTS(SELECT*FROMgradesWHEREstudentid=students.studentidANDcourseid='206')13.2.1数据查询(12)查找选修了全部课程的同学姓名(即查找没有一门功课不选修的学生)。SELECTnameFROMstudentsWHERENOTEXISTS(SELECT*FROMcoursesWHERENOTEXISTS(SELECT*FROMgradesWHEREstudentid=students.studentidANDcourseid=courses.courseid))(13)查询结果分组。将各课程成绩按学号分组。SELECTstudentid,gradeFROMgradesGROUPBYstudentid(14)查询结果排序。将计算机系的学生按出生时间先后排序。SELECT*FROMstudentsWHEREdepartment='计算机'ORDERBYbirthday13.2.1数据查询2.常用聚合函数对表数据进行检索时,经常需要对结果进行汇总或计算,如在学生成绩数据库中求某门功课的总成绩、统计各分数段的人数等。聚合函数用于计算表中的数据,返回单个计算结果。常用的聚合函数列于表13.2中。函数名说明AVG求组中值的平均值COUNT求组中项数,返回int类型整数MAX求最大值MIN求最小值SUM返回表达式中所有值的和VAR返回给定表达式中所有值的统计方差13.2.1数据查询本例对Students数据库表执行查询,使用常用的聚合函数。(1)求选修101课程学生的平均成绩。SELECTAVG(grade)AS'课程101平均成绩'FROMgradesWHEREcourseid='101'(2)求选修101课程学生的最高分和最低分。SELECTMAX(grade)AS'课程101最高分',MIN(grade)AS'课程101最低分'FROMgradesWHEREcourseid='101'(3)求学生的总人数。SELECTCOUNT(*)AS'学生总数'FROMstudents13.2.2数据操作1.插入数据语句INSERTINSERT可添加一条或多条记录至一个表中。INSERT有两种语法形式。语法1:INSERTINTOtarget[INexternaldatabase](fields_list)//(a){DEFAULTVALUES|VALUES(DEFAULT|expression_list)}//(b)语法2:INSERTINTOtarget[INexternaldatabase]fields_list{SELECT…|EXECUTE…}13.2.2数据操作2.删除数据语句DELETEDELETE用于从一个或多个表中删除记录。DELETE语句的语法格式如下:DELETEFROMtable_names[WHERE…]例如,用以下语句从students表中删除姓名为“罗亮”的记录:DELETEFROMstudentsWHEREname='罗亮'13.2.2数据操作3.更新数据语句UPDATEUPDATE语句用于更新表中的记录。UPDATE语句的语法格式如下:UPDATEtable_nameSETField_1=expression_1[,Field_2=expression_2…][FROMtable1_name|view1_name[,table2_name|view2_name…]][WHERE…]其中,Field是需要更新的字段,expressi