mysql - 2013 - 2014-1--讲课内容

更新时间:2023-03-15 17:50:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Mysql----讲课内容 第1页 共70页

1-1周—讲课内容

console 控制台 操作台;manual 手册,指南; datatype 数据类型 identity 同一性,个性(标识列); low priority 低优先级; high priority 高优先级; DDL 数据定义语言 Temporary 临时的 primary key 主键 foreign key 外键 Column 列

Add 添加 select 查询 update 更新 delete 删除 Algorithm [?lɡ?rie?m] 运算法则;演算法;计算程序 merge [m?:d?] 混合;相融;融入;渐渐消失在某物中

cascade [k?‘ske?d] n.倾泻;小瀑布,瀑布状物 流注;大量落下 temptable 临时表 constraint 约束

ASCII 美国标准信息交换码 Procedure 过程 Status 状态

Mysql第一节说课

用“开始”—》“运行”—》输入 \\\\192.168.8.2,登录到教师机,拷贝安装文件和讲课内容。 从navicat 8 for mysql导出文件的方法:

右击要导出的数据库,选择“转储SQL文件”,选择保存路径和文件名; 导入文件的方法:

在navicat 8 for mysql中,新建一个数据库,双击激活这个数据库,右击选择“运行SQL文件”,选择路径,勾选下面的3个复选按钮,单击开始即可导入,刷新就能看到导入结果。 一、课程简介 1.课程背景

MySQL是一个中小型关系型数据库管理系统,目前被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。 2. 课程性质

数据库原理与应用是计算机科学与工程系专业必修课,是一门与实际应用紧密结合的技术。目前应用领域几

1

Mysql----讲课内容 第2页 共70页

乎所有的软件和网站都离不开数据库技术。 3. 课程作用

通过本课程的学习使学生进一步掌握数据库的一般概念,以及数据库的设计方法,使学生初步具备使用数据库技术分析问题和解决问题的能力。 二、课程设计 1.课程目标

1) 知识目标

使学生掌握数据库的基本知识及基本操作 2) 能力目标

初步形成:发现问题、分析可能原因、尝试解决问题的应用能力; 2. 课程内容

本课程选用电子工业出版社的 《MySQL实用教程》主编:郑阿奇 教材特点:

? 本教材从数据库里领域的基础知识入手,学生基本上不需要任何基础就能学会。 ? 本教材含有大量的例题和实训,注重学生动手能力的培养。 三、课程实施 四、考核方法

1-2周—讲课内容

第1章 数据库的基本概念

一、数据库基本概念 1. 数据库 DataBase

数据库(DB)是存放数据的仓库,只不过这些数据存在一定的关联,并按一定的格式存放在计算机上。从广义上讲,数据不仅包含数字,还包括了文本、图像、音频、视频等。

例如,把学校的学生、课程、学生成绩等数据有序地组织并存放在计算机内,就可以构成一个数据库。因此,数据库由一些持久的相互关联数据的集合组成,并以一定的组织形式存放在计算机的存储介质中。 2.数据库管理系统 DataBase Manegement System

数据库管理系统(DBMS)是管理数据库的系统,它按一定的数据模型组织数据。DBMS应提供如下功能:(了解)

(1)数据定义功能可定义数据库中的数据对象。

2

Mysql----讲课内容 第3页 共70页

(2)数据操纵功能可对数据库表进行基本操作,如插入、删除、修改、查询。 (3)数据的完整性检查功能保证用户输入的数据应满足相应的约束条件。 (4)数据库的安全保护功能保证只有赋予权限的用户才能访问数据库中的数据。 (5)数据库的并发控制功能使多个应用程序可在同一时刻并发地访问数据库的数据。

(6)数据库系统的故障恢复功能使数据库运行出现故障时进行数据库恢复,以保证数据库可靠运行。 (7)在网络环境下访问数据库的功能。

(8)方便、有效地存取数据库信息的接口和工具。编程人员通过程序开发工具与数据库的接口编写数据库应用程序。数据库管理员(DBA,DataBase Adminitrator)通过提供的工具对数据库进行管理。

数据、数据库、数据库管理系统与操作数据库的应用程序,加上支撑它们的硬件平台、软件平台和与数据库有关的人员一起构成了一个完整的数据库系统。

图表 1 数据库系统构成

3. 数据模型

数据库管理系统根据数据模型对数据进行存储和管理,数据库管理系统采用的数据模型主要有层次模型、网状模型和关系模型。 1)层次模型

以树形层次结构组织数据。

图表 2 层次模型

2)网状模型

每一个数据用一个节点表示,每个节点与其他节点都有联系,这样数据库中的所有数据节点就构成了一个复杂的网络。

3

Mysql----讲课内容 第4页 共70页

图表 3 网状模型

3)关系模型

以二维表格(关系表)的形式组织数据库中的数据。例如,学生成绩管理系统涉及的学生、课程和成绩三个表。“学生”表涉及的主要信息有学号、姓名、专业名、性别、出生日期、总学分和备注;“课程”表涉及的主要信息有课程号、课程名、类别、开课学期、学时和学分;“成绩”表涉及的主要信息有学号、课程号和成绩。附录A表A.4、表A.5和表A.6描述了学生成绩管理系统中学生、课程和成绩三个表的部分数据。表格中的一行称为一个记录,一列称为一个字段,每列的标题称为字段名。如果给每个关系表取一个名字,则有n个字段的关系表的结构可表示为:关系表名(字段名1,?,字段名n),通常把关系表的结构称为关系模式。

在关系表中,如果一个字段或几个字段组合的值可唯一标志其对应记录,则称该字段或字段组合为码。例如,表A.4的“学号”可唯一标志每一个学生,表A.5的“课程号”可唯一标志每一门课,表A.6的“学号”和“课程号”可唯一标志每一个学生一门课程的成绩。

有时一个表可能有多个码,如表A.4中,姓名不允许重名,则“学号”、“姓名”均是学生信息表码。对于每一个关系表通常可指定一个码为“主码”,在关系模式中,一般用下横线标出主码。设表A.4的名字为XS,关系模式可分别表示为:XS(学号,姓名,专业名,性别,出生日期,总学分,备注)。

按关系模型组织的数据表达方式简洁、直观,插入、删除、修改操作方便,而按层次、网状模型组织的数据表达方式复杂,插入、删除、修改操作复杂。因此,关系模型得到了广泛应用,MySQL是支持关系数据模型的数据库管理系统。 二、关系数据库设计 1. 概念结构设计

通常,把每一类数据对象的个体称为“实体”,而每一类对象个体的集合称为“实体集”,因此在学生成绩管理系统中主要涉及“学生”和“课程”两个实体集。其他非主要的实体可以很多,如班级、班长、任课教师、辅导员等实体。每个实体集涉及的信息项称为属性。就“学生”实体集而言,它的属性有学号、姓名、专业名、性别、出生日期、总学分、备注。“课程”实体集属性有课程号、课程名、类别、开课学期、学时和学分。 实体集中的实体彼此是可区别的,如果实体集中的属性或最小属性组合的值能唯一标志其对应实体,则将该属性或属性组合称为码。对于每一个实体集,可指定一个码为主码。如果用矩形框表示实体集,用带半圆的矩形框表示属性,用线段连接实体集与属性,当一个属性或属性组合指定为主码时,在实体集与属性的连接线上标记一斜线,则可以用图1.4描述学生成绩管理系统中的实体集及每个实体集涉及的属性。

4

Mysql----讲课内容 第5页 共70页

图表 4 学生和课程实体集属性的描述

实体:学生; 属性:实体的特性;

实体集:实体和属性统称为实体集; 二维表 学号 01 02 学号 01 02 课程号 0001 0001 成绩 90 80 姓名 张三 张三 专业名 网络技术 网络技术 性别 男 男 出生日期 1992.01.01 1992.01.01 总学分 20 20 备注 E-R模型:实体(Entity)-联系(Relationship)模型

实体集A和实体集B之间存在各种关系,通常把这些关系称为“联系”。通常将实体集及实体集联系的图表示为实体(Entity)-联系(Relationship)模型;从分析用户项目涉及的数据对象及数据对象之间的联系出发,到获取E-R图的这一过程称为概念结构设计。联系用菱形表示,通过直线与实体相连。这样构成的图就是E-R图,E-R图就是E-R模型的描述方法。两个实体集A和B之间的联系可能是以下三种情况之一。

实体间的联系主要分为一下三种: 1) 一对一的联系

班级 班长 身份证号 一个人 2) 一对多的联系

班级 学生

5

Mysql----讲课内容 第6页 共70页

一个人 qq号码 3) 多对多联系

课程 学生

三、逻辑结构设计

1. 一对一的联系到E-R图的转换

实体需要建立一个表,实体之间的联系也要建立一个表,它的属性可以选择参与方任一方的主码(主键);

学号 学号 班长 联系 班级编号 班级 专业名 人数 姓名 姓名编号 院系 2-1周—讲课内容

复习上次课讲课内容:

1.数据库基本概念

DB DBMS

LAMP(Linux+Apache+Mysql+Php)

数据模型(层次 网状 关系) 姓名 张三 学生 教师 课程 实体间的联系: 1:1 人 身份证号 1:n 班级 学生 m:n 学生 教师 E-R图(实体-联系模型) 2.数据库连接方式

ODBC ADO ADO.NET JDBC 3. C/S B/S 以及二者之间的区别

6

年龄 20 电话 1861234567 Mysql----讲课内容 第7页 共70页

新内容:

一.结构化查询语言SQL(Structured Query Language) 起源于美国,1974年,经过逐步发展,功能已很完善; SQL语言的功能:

用来访问和操作数据库系统。

SQL适用用目前很多的关系型DBMS都支持SQL 语言,例如:Oracle, Mysql,Sqlserver,Access等。SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。 可以把 SQL 分为两个部分:

数据操作语言 (DML) 和 数据定义语言 (DDL)。 查询和更新指令构成了 SQL 的 DML 部分:

? ? ? ?

Select - 从数据库表中查询(获取)数据 Update - 更新数据库表中的数据 Delete - 从数据库表中删除数据 Insert Into - 向数据库表中插入数据

SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。 SQL 中最重要的 DDL 语句:

? ? ? ? ? ? ?

create Database - 创建新数据库 Alter Database - 修改数据库 Create Table- 创建新表

Alter Table - 变更(改变)数据库表 Drop Table - 删除表

Create Index - 创建索引(搜索键) Drop Index - 删除索引

二.Mysql介绍和软件安装

1. Mysql介绍

Mysql是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL的SQL语言是用于访问数据库的最常用标准化语言。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。由于其社区版的性能卓越,搭配PHP和Apache可组成良好的开发环境。

7

Mysql----讲课内容 第8页 共70页

其他的大型数据库例如Oracle、DB2、SQL Server等相比,MySQL自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。Linux作为

LAMP 操作系统,Apache和Nginx作为Web服务器,MySQL作为数据库,PHP/Perl/Python作为服务器端脚本解释器。由于这四个软件都是免费或开放源码软件(FLOSS),因此使用这种方式不用花一分钱(除开人工成本)就可以建立起一个稳定、免费的网站系统,被业界称为“LAMP“组合。

LAMP组合:Linux+Apache+Mysql+Php 总体来说,MySQL数据库具有以下主要特点: 同时访问数据库的用户数量不受限制; 可以保存超过50,000,000条记录;

是目前市场上现有产品中运行速度最快的数据库系统; 用户权限设置简单、有效。

2. Mysql软件安装

1)、运行mysql安装文件。

2)、 按Next,然后选择安装方式,有\(默认)\、\(完全)\、\(用户自定义)\,选择第二个选项\; 3)下一步,

MySQL Server(mysql服务器), Developer Components(开发者部分), Debug Symbols(调试符号),

8

Mysql----讲课内容 第9页 共70页

Server data files(服务器数据文件)默认

4)、改变安装路径;原路径是\Files\\MySQL\\MySQL Server 5.5\\\,也可以修改为:\Files\\MySQL Server5)

5.5\\\。

下一步,安装,会弹出窗口,点下一步,再点下一步,选择\Configuration Wizard\,意思是启动MySQL实例配置向导,再点击Finish;

6) 下一步,Detailed Configuration(详细配置)和Standard Configuration(标准配置)默认,选择详细配置;

7) 下一步

选择服务器类型,

Developer Machine(开发测试类,mysql占用很少资源)Server Machine(服务器类型,mysql占用较多资源)DedicatedMySQL Server Machine(专门的数据库服务器,mysql占用所有可用资源)\,根据自己的类型选择,测试软件选\,服务器选\下一步。

8) 选择创建MySQL表时使用的表处理器,\(通用多功能型,好,同时使用InnoDB和MyISAM储存引擎)、\Database Only\(服务器类型,专注于事务处理,主要使用InnoDB只偶尔使用MyISAM,一般)、\(非事务处理型,较简单,完全禁用InnoDB储存引擎,将所有服务器资源指派给MyISAM储存引擎),随自己的用途而选择。

3. 连接MYSQL

格式:mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL。

首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:mysql>

2.例2:连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:

mysql -h110.110.110.110 -uroot -pabcd123 (注:u与root可以不用加空格,其它也一样) 3.退出MYSQL命令:exit (回车)

注意:想要成功连接到远程主机,需要在远程主机打开MySQL远程访问权限 方法如下:

9

Mysql----讲课内容 第10页 共70页

在远程主机中以管理员身份进入 输入如下命令

mysql>GRANT ALL PRIVILEGES ON *.* TO 'agui'@%'IDENTIFIEDBY '123' WITH GRANT OPTION; FLUSH PRIVILEGES;

//赋予任何主机访问数据的权限 mysql>FLUSH PRIVILEGES //修改生效

agui为我们使用的用户名 密码为123

即:在远程主机上作好设置,我们即可通过mysql -h110.110.110.110 -uagui -p123连接进远程主机 修改密码

格式:mysqladmin -u用户名 -p旧密码 password 新密码

1.例1:给root加个密码ab12。首先在DOS下进入目录mysqlbin,然后键入以下命令 mysqladmin -uroot -password ab12

注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。 2.例2:再将root的密码改为djg345。 mysqladmin -uroot -pab12 password djg345

小结第1章

1.熟悉数据库的基本概念;

2.了解数据库的三种模式,熟悉关系模式数据库; 3.了解数据库的连接方式,了解C/S和B/S及区别; 4. 了解SQL语言。

2-2周—讲课内容

第2章 数据库和表

三.创建数据库和表 仓库 货架

在Mysql中已有的2个数据库:information_schema和mysql,它们把有关数据库的信息存储在其中,果删除了这2个数据库,则mysql就不能工作。 1.创建DB

如10

Mysql----讲课内容 第11页 共70页

语法格式:create database if not exists 数据库名 功能:用于创建数据库;

例如:create database if not exists my_db 注意:

? if not exists是判断数据库名是否存在,如果存在就不创建;

? 因为当前服务器上会同时存在几个数据库,如果要对哪个数据库进行操作,需要先指定哪个数据库,指定的方法是: use 数据库名; 2. 修改DB

语法格式:alter database 数据库名; 功能:更改DB的全局特性;

例如:alter database my_db default character set gb2312; 3. 删除数据库

语法格式:drop database if not exists 数据库名; 功能:删除DB;

注意:? if not exists是判断数据库名是否存在,即不能删除一个不存在的DB; 例1:drop database my_db;

3-1周—讲课内容

复习上次课讲课内容: 1. SQL语言介绍;

2. mysql的安装,环境配置和简单实用; 3. 数据库的创建、删除 补充内容:

information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。再简单点,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在information_schema表里面。

数据库schema有两种含义,一种是概念上的schema,指的是一组DDL(数据定义语言)语句集,该语句集完整地描述了数据库的结构。还有一种是物理上的 Schema,指的是数据库中的一个名字空间,它包含一组表、视图和存储过程等命名对象。物理Schema可以通过标准SQL语句来创建、更新和修改。 新内容:

11

Mysql----讲课内容 第12页 共70页

The schema is a database. schema就是一个数据库。 一.创建表(货物架子)

表(数据表)是数据库中存放数据的数据对象。数据库中所有的数据都要存放到表中,没有表的数据库就是一个空数据库。

1. 创建表

语法格式:create temporary table if not exists表名称 (

列名称1 数据类型,index_definition 列名称2 数据类型, index_definition 列名称3 数据类型, index_definition .... )

功能:用于创建数据库中的表;

例:创建一个XSCJ(学生成绩)数据库,在数据库中创建一个表 XS(学号,姓名,专业名?.)。 Create databse XSCJ;

Use XSCJ; // 指定要操作的数据库 create table XS(

学号 char(6) not null primary key, 姓名 char(10) not null, 专业名 char(20), 性别 tinyint(1), 出生日期 date, 总学分 tinyint, 照片 blob, 备注 text);

数据类型(data_type)规定了列可容纳何种数据类型。下面的表格包含了SQL中最常用的数据类型: 数据类型 描述 12

Mysql----讲课内容 第13页 共70页

integer(size) int(size) smallint(size) tinyint(size) decimal(size,d) numeric(size,d) 仅容纳整数。在括号内规定数字的最大位数。 容纳带有小数的数字。 \规定数字的最大位数。\规定小数点右侧的最大位数。 容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。 char(size) 在括号中规定字符串的长度。 容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。 varchar(size) date(yyyymmdd) 在括号中规定字符串的最大长度。容纳日期。2012-09-01 这种数据类型表现自动生成的二进制数,确保这些数在数据库中是唯一的。timestamp 一般用作给表行加版本戳的机制。存储大小为 8 字节。 timestamp 注意问题:

1) temporary:该关键字表示用create命令新建的表为临时表。不加该关键字创建的表通常称为持久表,在数

据库中持久表一旦创建将一直存在,多个用户或者多个应用程序可以同时使用持久表。有时候需要临时存放数据,例如,临时存储复杂的SELECT语句的结果。此后,可能要重复地使用这个结果,但这个结果又不需要永久保存。这时,可以使用临时表。用户可以像操作持久表一样操作临时表。只不过临时表的生命周期较短,而且只能对创建它的用户可见,当断开与该数据库的连接时,MySQL会自动删除它们; 2) if not exists:在建表前加上一个判断,只有该表目前尚不存在时才执行;

3) index_definition:表索引项定义,主要定义表的索引、主键、外键等,具体定义将在第5章中讨论; 4) 如果你想使用外键,事务等功能,记得用innodb引擎。使用方法是create table xxx()engine=innodb; InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 有它自己的缓冲池,能缓冲数据和索引,InnoDB 还把数据和索引存放在表空间里面,可能包含好几个文件,这和 MyISAM 表完全不同,在 MyISAM 中,表被存放在单独的文件中,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB。

5) 在mysql的console(控制台)输入sol命令,一定要加分号,作为sol语句的结束,回车就可以执行该命令。

在Navicat 8 for MySql中看执行结果时,先用F5刷新,才能看到结果;

13

Mysql----讲课内容 第14页 共70页

例如:在my_db的数据库中创建一个表stud,有2个字段 num char(8) not null primary key,

name char(10) not null

sol语句:create table stud(

num char(8) not null primary key, name char(10) not null )engine=innodb;

P31页 课后题

2. 先建立XSCJ数据库,再建立学生情况表, create database if not exists XSCJ; Query OK, 1 row affected

create table 学生情况表(学号 char(6) not null primary key, 姓名 char(8) not null, 专业名 char(10),

性别 tinyint(1) not null, 出生日期 date not null, 总学分 tinyint(1), 照片 blob(16), 备注 text(16) )engine=innodb; Query OK, 0 rows affected 3. SQL 约束

约束用于限制加入表的数据的类型。

可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。 我们将主要探讨以下几种约束:

14

Mysql----讲课内容 第15页 共70页

? ? ? ? ? ?

NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录 ; UNIQUE 约束唯一标识数据库表中的每条记录; PRIMARY KEY 约束列或列集合提供了唯一性的保证; FOREIGN KEY指向另一个表中的 PRIMARY KEY CHECK 约束用于限制列中的值的范围; DEFAULT 约束用于向列中插入默认值。

index_definition标注列的主键、外键、索引等;

例如:CREATE TABLE Persons

(

CREATE TABLE Persons (

Dip int NOT NULL,

Last Name varchar(255) NOT NULL, First Name varchar(255), Address varchar(255), City varchar(255) )) 二.修改表

语法格式:alter table 表名 ??

功能:ALTER TABLE 语句用于在已有的表中添加、修改或删除列; 在表中添加列,请使用下列语法:

ADD column name datatype 要删除表中的列,请使用下列语法:

DROP COLUMN column name

要改变表中列的数据类型,请使用下列语法:

ALTER COLUMN column name datatype 例1:删除“学生情况表”中的“性别”列。

15

Mysql----讲课内容 第16页 共70页

use XSCJ; 打开学生情况表所在的数据库; alter table 学生情况表 drop column 性别; 例2::向“学生情况表”中的添加“电话”列。 use XSCJ;

alter table 学生情况表 add 电话char(11); Query OK, 0 rows affected

Records: 0 Duplicates: 0 Warnings: 0 三. 修改表名

语法格式:rename table 改前表名 to 改后表名; 功能:用于更改表的名字;

例3: rename table 学生情况表 to stud; 注意问题:

You have an error in your SQL syntax; 在sol语法中,有1个错误;

check the manual that corresponds to your MySQL server version for the right syntax to use near 'use XSCJ' at line 3;检查对应于你的MySQL服务器版本使用近# 039正确的语法手册;使用xscj和# 039;在3行; 四. 复制表 语法格式:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [ ( ) LIKE old_tbl_name [ ] ] | [AS (select_statement)] ; 说明:

使用LIKE关键字创建一个与old_table_name表相同结构的新表,列名、数据类型、空指定和索引也将复制,但是表的内容不会复制,因此创建的新表是一个空表。使用AS关键字可以复制表的内容,但索引和完整性约束是不会复制的。select_statement表示一个表达式,例如,可以是一条SELECT语句。 例4:cteate table 新的表名 link 老的表名

create table stu1 like stud; 这样就创建了一个新表,表结构和stud相同,表名是stu1; 5. 删除表

需要删除一个表时可以使用DROP TABLE语句。 语法格式:

DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...

16

Mysql----讲课内容 第17页 共70页

其中,

tb1_name:要被删除的表名。

IF EXISTS:避免要删除的表不存在时出现错误信息。

这个命令将表的描述、表的完整性约束、索引及和表相关的权限等都全部删除。 2. 熟练掌握使用sol命令创建数据库、创建表,修改数据库,修改表。

3-2周—讲课内容

第3章 表数据操作

§3.1 命令行操作表数据 一、插入表数据(记录)

一旦创建了数据库和表,下一步就是向表里插入数据。通过INSERT或REPLACE语句可以向表中插入一行或多行数据。 语法格式:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({expr | DEFAULT},...),(...),... | SET col_name={expr | DEFAULT}, ...

[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

insert into stud(学号,姓名) values(“000001”,“李四”); 注意问题:

1)tb1_name:被操作的表名;

2)col_name:需要插入数据的列名。如果要给全部列插入数据,列省名可以略。如果只给表的部分列插入数据,需要指定这些列。对于没有指出的列,它们的值根据列默认值或有关属性来确定,MySQL处理的原则是: (1)具有IDENTITY属性的列,系统生成序号值来唯一标志列。 (2)具有默认值的列,其值为默认值。

(3)没有默认值的列,若允许为空值,则其值为空值;若不允许为空值,则出错。 (4)类型为timestamp的列,系统自动赋值。

3) VALUES子句:包含各列需要插入的数据清单,数据的顺序要与列的顺序相对应。若tb1_name后不给出列名,则在VALUES子句中要给出每一列(除IDENTITY和timestamp类型的列)的值,如果列值为空,则值必须置为NULL,否则会出错。VALUES子句中的值:

(1)expr:可以是一个常量、变量或一个表达式,也可以是空值NULL,其值的数据类型要与列的数据类型一致。

17

Mysql----讲课内容 第18页 共70页

例如,列的数据类型为int,插入的数据是‘aaa’就会出错。当数据为字符型时要用单引号括起。 (2)DEFAULT:指定为该列的默认值。前提是该列原先已经指定了默认值。 如果列清单和VALUES清单都为空,则INSERT会创建一行,每个列都设置成默认值。

例1:向XSCJ数据库的表stud(表中列包括学号、姓名、专业、性别、出生日期、总学分、照片、备注)中插入如下的一行:

081101,王林,计算机,1,1990-02-10,50 ,NULL,NULL 使用下列语句: USE XSCJ; INSERT INTO XSCJ

VALUES('081101', '王林' , '计算机', 1, '1990-02-10', 50, NULL,NULL);

例2: 若表stud中专业的默认值为“计算机”,照片、备注默认值为NULL,插入上例那行数据可以使用以下命令:

INSERT INTO XS (学号, 姓名, 性别, 出生日期, 总学分) VALUES('081101', '王林', 1, '1990-02-10', 50); 与下列命令效果相同: INSERT INTO XS

VALUES('081101', '王林', DEFAULT, 1, '1990-02-10', 50, NULL,NULL); 当然,也可以使用SET子句来实现: INSERT INTO XS

SET 学号='081101', 姓名='王林', 专业=DEFAULT, 性别=1,出生日期='1990-02-10', 总学分=50;、 例3:向XS表中插入一行数据:

081102,程明,计算机,1,1991-02-01,50,picture.jpg,NULL 其中,照片路径为D: \\IMAGE\\ picture.jpg。 使用如下语句: INSERT INTO XS

VALUES('081102', '程明', '计算机', 1, '1991-02-01', 50, 'D:\\IMAGE\\picture.jpg', NULL); 下列语句是直接存储图片本身: INSERT INTO XS

VALUES('081102', '程明', '计算机', 1, '1991-02-01', 50, LOAD_FILE('D:\\IMAGE\\picture.jpg'), NULL);

18

Mysql----讲课内容 第19页 共70页

4-1周—讲课内容

复习上次课讲课内容: 1. 上机任务

建立XSCJ的数据库,在其中建立三个表,分别录入相应记录。 语句相应的写法,以及出现的问题。 字符集的设置:gb2312;

每个单词之间有1个空格,所有的标点符号都应该是英文格式的;

实际的上机调试经验,需要亲自调试,出现问题之后,想办法解决,上机经验才会增加,水平才能提高。 创建数据库: create database XSCJ; 选择数据库: use XSCJ;

修改数据库字符集:alter database XSCJ default character set gb2312;

创建表: create table if not exists XS(字段名1 类型(大小) 是否空 是否主键,

字段名1 类型(大小) 是否空 是否主键??);

例1:创建表XS

create table if not exists XS(学号 char(6) not null primary key,姓名 char(8) not null,专业名 char(10),性别 tinyint(1),出生日期 date,总学分 tinyint,照片 blob,备注 text); 录入记录:

insert into XS(学号,姓名,专业名,性别,出生日期,总学分) values('000001','张三','网络技术','1','1990-01-01','50'); 例2:创建表KC

create table if not exists KC(课程号 char(6) not null primary key,课程名 char(16) not null,开课学期 tinyint not null,学时 tinyint(1),学分 tinyint); 录入记录:

insert into KC(课程号,课程名,开课学期,学时,学分) values('000001','MYSQL','2','96','5'); 例3:创建表XS_KC

create table if not exists XS_KC(学号 char(6) not null primary key,课程号 char(16) not null,成绩 tinyint not null,学分 tinyint);

录入记录:

insert into XS_KC values('000001','MYSQL','85', '5'); 复制表:create table stud like XS;

19

Mysql----讲课内容 第20页 共70页

删除表: drop table XS;

修改表名:rename table stud to stu1;

在表中插入记录:insert into stud values(字段值1,字段值2??); insert into XS(学号,姓名) values('000001','张三'); insert into XS values(‘000002’,’李四’,’’,’’,’’); 新内容: 一、删除表数据

1. 使用DELETE语句删除数据 从单个表中删除,语法格式:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count] 注意问题:

1)QUICK修饰符:可以加快部分种类的删除操作的速度。

2)FROM子句:用于说明从何处删除数据,tbl_name为要删除数据的表名。 3)WHERE子句:where_definition中的内容为指定的删除条件。

4)ORDER BY子句:各行按照子句中指定的顺序进行删除,此子句只在与LIMIT联用时才起作用。ORDER BY子句

和LIMIT子句的具体定义将在SELECT语句中介绍。

5)LIMIT子句:用于告知服务器在控制命令被返回到客户端前被删除的行的最大值。 例1:假设数据库mydata中有一个表table1,table1中有如下数据:

姓名 年龄 职业 张三 42 教师 李四 28 工人

要删除张三的信息可使用如下语句: USE mydata DELETE FROM table1

WHERE 姓名='张三';

例2:删除XS表中,姓名是张三的这条记录。 Use XSCJ;

Delete from XS where 姓名=’张三’;

20

Mysql----讲课内容 第46页 共70页

姓名 varchar(8) NOT NULL UNIQUE, 出生日期 datetime NULL, PRIMARY KEY(学号) );

注意问题:关键字UNIQUE表示“姓名”是一个替代键,其列值必须是唯一的。 替代键也可以定义为表的完整性约束,前面语句可以这样定义: CREATE TABLE XS1 (

学号 varchar(6) NULL, 姓名 varchar(8) NOT NULL, 出生日期 datetime NULL, PRIMARY KEY(学号), UNIQUE(姓名) );

在MySQL中替代键和主键的区别主要有以下几点。

(1)一个数据表只能创建一个主键。但一个表可以有若干个UNIQUE键,并且它们甚至可以重合,例如,在C1和C2列上定义了一个替代键,并且在C2和C3上定义了另一个替代键,这两个替代键在C2列上重合了,而MySQL允许这样。

(2)主键字段的值不允许为NULL,而UNIQUE字段的值可取NULL,但是必须使用NULL或NOT NULL声明。 (3)一般创建PRIMARY KEY约束时,系统会自动产生PRIMARY KEY索引。创建UNIQUE约束时,系统自动产生UNIQUE索引。

通过PRIMERY KEY约束和UNIQUE约束可以实现表的所谓实体完整性约束。定义为PRIMERY KEY和UNIQUE KEY的列上都不允许出现的值。 三、参照完整性约束(外键约束)

存储在XS_KC表中的所有学号必须存在于XS表的学号列中。XS_KC表中的所有课程号也必须出现在KC表的课程号列中。这种类型的关系就是参照完整性约束(referential integrity constraint)。参照完整性约束是一种特殊的完整性约束,实现为一个外键。所以XS_KC表中的学号列和课程号列都可以定义为一个外键。可以在创建表或修改表时定义一个外键声明。

xs(学号,姓名,性别,电话,照片,备注,出生日期) kc(课程号,课程名,学分,开课学期) xs_kc(学号,课程号,成绩,学分)

46

Mysql----讲课内容 第47页 共70页

foreign key:外键

xs(主键表):学号 xs_kc(外键表):学号 定义外键的语法格式:

References 表名[(列名,...)]

[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}] 注意问题:

这个表名,又叫参照表,即外键所在的表叫做参照表, 列名即被参照的列名;

On delete /on update是每个外键定义参照的动作;

restrict:当要删除或更新父表中被参照列上在外键中出现的值时,拒绝对父表的删除或更新操作; cascade:从父表删除或更新行时自动删除或更新子表中匹配的行;

例5:创建XS1表,所有的XS表中学生学号都必须出现在XS1表中,假设已经使用学号列作为主键创建了XS表。 CREATE TABLE XS1 (

学号 varchar(6) NULL, 姓名 varchar(8) NOT NULL, 出生日期 datetime NULL, PRIMARY KEY (姓名), FOREIGN KEY (学号) REFERENCES XS (学号) ON DELETE RESTRICT ON UPDATE RESTRICT );

四、check完整性约束(列完整性约束)

主键、替代键、外键都是常见的完整性约束的例子。但是,每个数据库都还有一些专用的完整性约束。 例如,kc表中星期数要在1~7之间,XS表中出生日期必须大于1986年1月1日。这样的规则可以使用CHECK完整性约束来指定。

check完整性约束在创建表的时候定义。可以定义为列完整性约束,也可以定义为表完整性约束。 语法格式为: check(表达式)

47

Mysql----讲课内容 第48页 共70页

说明:expr是一个表达式,指定需要检查的条件,在更新表数据的时候,MySQL会检查更新后的数据行是否满足check的条件。

例6: 创建表student,只考虑学号和性别两列,性别只能包含男或女。 CREATE TABLE student (

学号 char(6) NOT NULL, 性别 char(1) NOT NULL

CHECK(性别 IN ('男', '女')) );

例7:创建表student1,只考虑学号和出生日期两列,出生日期必须大于1980年1月1日。 CREATE TABLE student1 (

学号 char(6) NOT NULL, 出生日期 date NOT NULL

CHECK(出生日期>'1980-01-01') ); 注意问题:

前面的CHECK完整性约束中使用的表达式都很简单,MySQL还允许使用更为复杂的表达式。例如,可以在条件中加入子查询。

如果指定的完整性约束中,要相互比较一个表的两个或多个列,那么该列完整性约束必须定义表完整性约束。

前面的CHECK完整性约束中使用的表达式都很简单,MySQL还允许使用更为复杂的表达式。例如,可以在条件中加入子查询。

也可以同时定义多个CHECK完整性约束,中间用逗号隔开。

例8:创建表student2,只考虑学号和性别两列,并且确认性别列中的所有值来源于student表的性别列中。 CREATE TABLE student2 (

学号 char(6) NOT NULL, 性别 char(1) NOT NULL CHECK( 性别 IN

48

Mysql----讲课内容 第49页 共70页

(SELECT 性别 FROM student) ) );

例9:创建表student3,有学号、最好成绩和平均成绩3列,要求最好成绩必须大于平均成绩。 CREATE TABLE student3 (

学号 char(6) NOT NULL, 最好成绩 INT(1) NOT NULL, 平均成绩 INT(1) NOT NULL, CHECK(最好成绩>平均成绩) );

12-2周讲课内容:

复习上次课内容: 1. 实体完整性约束 用主键实现 例1: //创建表

create table mm(a varchar(10) not null,b char(6)); //插入记录

insert into mm values(‘001’,’tom’); insert into mm values(‘001’,’jerry’); 都可以成功插入 // 添加主键(a)

Alter table mm add constraint akey primary key(a);

不允许添加主键 语句正确,问题在:记录有问题,打开表,修改第二条记录,改成002 就能执行了;

Insert into mm values(‘001’,’john’); 不允许添加,为什么? 2. 域完整性约束 数据类型自动实现

Tinyint 整型 char 字符类型

49

Mysql----讲课内容 第50页 共70页

3. 参照完整性约束

通过外键实现 例2:创建表nn

Create table nn(a varchar(10) not null,c char(20)); 创建nn表和mm表之间的参照完整性约束,外键mm(a) nn(a) 主键表:mm 外键表:nn 相关联字段:a 创建外键

Alter table nn add constraint a foreign key(a) references mm(a); 给nn表添加记录:

Insert into nn(‘003’,’langfangcity’); 不嫩执行,为什么? 4. check 约束:限定只能给字段输入特定字符 例如:sex 性别 1(男) 0(女) 工资:2000---10000之间 年龄:18—60

例3: 给nn表中c 字段添加约束,要求只能输入1或0,不能输入其他字符串。 Alter table nn add constraint cyueshu check(c in(‘1’,’0’)); 五、命名完整性约束

如果一条INSERT、UPDATE或DELETE语句违反了完整性约束,则MySQL返回一条出错消息并且拒绝更新,一个更新可能会导致多个完整性约束的违反。在这种情况下,应用程序获取几条出错消息。为了确切地表示是违反了哪一个完整性约束,可以为每个完整性约束分配一个名字,随后,出错消息包含这个名字,从而使得消息对于应用程序更有意义。

constraint关键字用来指定完整性约束的名字。语法格式为: constraint [symbol]

symbol为指定的名字,这个名字在完整性约束的前面被定义,在数据库里这个名字必须是唯一的。如果它没有被给出,则MySQL自动创建这个名字。只能给表完整性约束指定名字,而无法给列完整性约束指定名字。

例10:创建与例5.8中相同的XS1表,并为主键命名。 CREATE TABLE XS1 (

学号 varchar(6) NULL, 姓名 varchar(8) NOT NULL, 出生日期 datetime NULL

50

Mysql----讲课内容 第21页 共70页

例3:将XSCJ数据库的XS表(具体数据参照附录A)中总学分小于50的所有行删除,使用如下语句: USE XSCJ

DELETE FROM XS WHERE 总学分<50; 注意问题:

在编写sol语句时,如果字段是char或text类型,需要加上单引号;如果是tinyint或其他的整型,则不需要加单引号。 二、修改表数据

UPDATE可以用来修改一个表,也可以修改多个表。 1)修改单个表,语法格式:

UPDATE tbl_name SET col_name1=expr1 [, col_name2=expr2 ...]

[WHERE where_definition] [ORDER BY ...] [LIMIT row_count] 注意问题: 1)

SET子句:根据WHERE子句中指定的条件对符合条件的数据行进行修改。若语句中不设定WHERE子句,则更新所有行。col_name1、col_name2?为要修改列值的列名,expr1、expr2?可以是常量、变量或表达式。可以同时修改所在数据行的多个列值,中间用逗号隔开。

例4:将XS表中所有学生的总学分都增加10。将姓名为“罗林琳”的同学的备注改为“转专业学习”,学号改为“081251”。

UPDATE XS SET 总学分 = 总学分+10;

UPDATE XS SET学号 ='081251' , 备注 ='转专业学习' WHERE 姓名 = '罗林琳'; SELECT 学号, 姓名, 总学分, 备注 FROM XS; 例5:把 XS表中所有专业名改成 网络技术 Update XS set 专业名=’网络技术’

4-2周上机作业:

1. 分别删除3个表中1条符合条件的记录;

2. 删除KC表中学分小于某一个值的记录;

3. 修改XS表中某个符合条件记录的名字改为 其他名字;

5-1周---讲课内容:

复习上次课内容:

上机主要任务是建立XSCJ数据库,以及3个表,并录入记录;根据条件删除表数据,更改表数据。 总体情况不错。

21

Mysql----讲课内容 第22页 共70页

会导入和导入mysql数据库文件。

根据条件删除表数据:delete from 表名 where 删除条件 更改表数据:update 表名 set 字段=字段的值 where 条件 新内容: 二、修改表数据

1)修改单个表,语法格式:update 表名 set 字段=字段的值 where 条件 2)修改多个表,语法格式:

UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]

说明:table_references中包含了多个表的联合,各表之间用逗号隔开

例6:表tb1和表tb2中都有两个字段id INT(4),pwd CHAR(4),其中id为主键。当表tb1中id值与tb2中id值相同时,将表tb1中对应的pwd值修改为“AAA”,将表tb2中对应的pwd值改为“BBB”。 UPDATE tb1 , tb2 SET tb1.pwd='AAA' , tb2.pwd='BBB' WHERE tb1.id=tb2.id; 注意问题:命令总结

1. 显示数据库列表: show databases; 2.显示库中的数据表: use mysql; //选择数据库 show tables; //显示所有表

3. 显示数据表的结构: describe 表名; 4. 建库 create database 库名;

5. 建表 reate table 表名 (字段设定列表);

6. 删库和删表: drop database 库名; drop table 表名; 7. 将表中记录清空: delete from 表名; 8. 显示表中的记录: select * from 表名; 9. 导出sol脚本

10. 从navicat 8 for mysql导出文件的方法:

右击要导出的数据库,选择“转储SQL文件”,选择保存路径和文件名; 导入文件的方法:

22

Mysql----讲课内容 第23页 共70页

在navicat 8 for mysql中,新建一个数据库,双击激活这个数据库,右击选择“运行SQL文件”,选择路径,勾选下面的3个复选按钮,单击开始即可导入,刷新就能看到导入结果。 11. 往表中插入记录:insert into 表名(字段1,字段2?.) value(字段的值); Insert into 表名 value(所有字段的值);

注意问题: char类型字段必须加单引号,tinyint类型字段不用加单引号; 12. 删除表数据:delete from 表名 where 删除条件;

13. 更新表数据: update 表名 set 字段=字段的值 where 条件;

update 表1名,表2名 set 字段=字段值 where 两个表连接条件; 注意问题:所有sol命令都必须以分号作为结束。 §2.3 有关表结构

一、 空值和列的identity(标志)属性 1. 空值(NULL)概念

空值就是可以空着,可以不填写数据。非空就是必须要填写数据。 2. 列的IDENTITY(标志)属性

对任何表都可创建包含系统所生成序号值的一个标志列,该序号值唯一标志表中的一列,可以作为键值。每个表只能有一个列设置为标志属性,该列只能是decimal、int、numeric、smallint、bigint 或 tinyint 数据类型。定义标志属性时,可指定其种子(即起始)值、增量值,二者的默认值均为 1。系统自动更新标志列值,标志列不允许空值。 二、MySQL隐含地改变列类型

一下几种情况,隐含改变列类型: 1. 长度小于4的varchar被改变为char;

2. 如果在一个表中的任何列有可变长度,结果使整个行是变长的。因此,如果一张表包含任何变长的列

(varchar、text或Blob),所有大于3个字符的char列被改变为varchar列。这在任何方面都不影响用户如何使用列。在MySQL中这种改变可以节省空间并且使表操作更快捷;

3. timestamp的显示尺寸必须是偶数且在2~14的范围内。如果指定0显示尺寸或比 14大,尺寸被强

制为14。从1~13范围内的奇数值尺寸被强制为下一个更大的偶数;

4. 不能在一个timestamp列里面存储一个NULL,将它设为NULL默认为当前的日期和时间;

小结第2章

1. 熟练掌握数据库的创建、修改,表的创建、修改,表记录的插入、修改; 2. 了解MySQL隐含地改变列类型

第3章 表数据操作

23

Mysql----讲课内容 第24页 共70页

§3.1 命令行操作表数据 一、插入表数据 二、删除表数据 三、修改表数据

四、SHOW和DESCRIBE语句 1. show语句

语法格式:SHOW TABLES或SHOW TABLES FROM DATABASE_NAME; 功能:显示当前数据库中所有表的名称。

例1:show databases; 显示MySQL中所有数据库的名称。

show 列名 from 表名 from 数据库名; 或show 列名 from 数据库名.表名; 显示表中列的名称。 show grants for 用户名; 显示一个用户的权限,显示结果类似于GRANT命令。 show xindex from 表名; 显示表的索引。

show status; 显示一些系统特定资源的信息,例如,正在运行的线程数量。 show variables; 显示系统变量的名称和值。

Show processlist; 显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看他们自己的进程,但是如果他们拥有PROCESS权限,就可以查看所有人的进程,包括密码。 SHOW TABLE STATUS:显示当前使用或者指定的DATABASE中的每个表的信息。信息包括表类型和表的最新更新时间。 2. describe语句

语法格式:{describe | desc} 表名 [列名 | wild ] 功能:句用于显示表中各列的信息。 注意问题:

1) desc是describe的简写,二者用法相同;

2) 列名可以是一个列的名字,也可以是包含‘%’和‘_’的通配符的字符串,用于获得对于带有与字

符串相匹配的名称的各列的输出。没有必要在引号中包含字符串,除非其中包含空格或其他特殊字符。

例1:用describe语句查看XS表的列的信息。 USE XSCJ

describe XS;

查看XS表学号列的信息: desc XS 学号; §3.2 界面操作表数据

除了用命令方式修改表和表数据之外,更简单的方法是使用MySQL Administrator修改表、表数据。

24

Mysql----讲课内容 第25页 共70页

打开navicat for mysql 8, 插入记录、修改记录、删除记录。

6-2周—讲课内容

复习上次课讲课内容: 1. 插入记录(表数据)

Insert into 表名 values(字段值);

Insert into 表名(学号,字段2) values(001,值2) 注:tinyint ‘char’ ‘date’ replace into表名 values(字段值);

用replace和insert的区别是:插入记录时,如果有相同的primary key,则先删除以前的记录,再插入这个最新的记录。 2. 删除记录

删除数据库,删除表 drop database drop table xs; Delete from 表名 where 设定条件

删除多个表的记录: delete 表1,表2 from 所有相关表 Where 表之间的链接条件; 3. 修改表数据

Update 表名 set 字段1=值1,?? where 设定条件 4. 显示表内容和表结构

Show 显示表内容

Desc(describe 描述) 显示表结构 5. navicat 8 for mysql的界面操作

小结第3章

1. 掌握记录的插入、修改和删除。 2. 掌握show和desc的基本使用; 3. 会使用菜单、窗口方式修改表和记录。

第4章

§4.1 连接、选择和投影

都是关系代数的运算符,关系代数运算的对象和结果都是表(二维表,字段,表记录)。 一、选择(Selection)

是单目运算符,运算对象是1个表。、

25

数据库的查询和视图

Mysql----讲课内容 第26页 共70页

主要功能:该运算按给定的条件,从表中选出满足条件的行形成一个新表作为运算结果。(从行上对表进行划分)。 选择运算的记号为?F(R)=?条件(表名)。

例1:要从xs表中查询性别是女的所有记录:?性别=‘女‘(xs) 二、投影(projection)

是单目运算符,运算对象是1个表。、

主要功能:从表中选出制定字段(属性)组成一个新表(从列上对表进行划分))。 投影运算的记号为?A(R)=?要选出的字段(表名)。

例2:要从xs表中学号和姓名这2个字段:?学号,姓名(xs) 三、连接(join)

是双目运算符,运算对象是2个表。、

主要功能:把2个表中的行按给定的条件进行拼接而形成新表。 连接运算的记号为:R S

最常见的连接是 等值连接 表1.学号=表2.学号

自然连接:要求2个表有共同的列,2个表自然连接的结果是参与操作的2个表的共同字段上进行等值连接,后再去除重复的字段得到的新表。 例3: T1 1 6 2 A B T1 1 2 T2 A B T3 1 2 T4 3 0 T5 M N 表4.4 A表 表4.5 B表 T2 A F B T3 1 2 T4 3 0 T5 M N 7-1周—讲课内容:

4.2 数据库的查询 一、select语句

数据库和表的主要目的是存储数据以便在需要时进行检索、统计或组织输出,通过SQL语句的查询可以从表或视图中迅速方便地检索数据。SQL的SELECT语句可以实现对表的选择、投影及连接操作。

26

Mysql----讲课内容 第27页 共70页

语法格式: select * from 表名 where 查询条件

或者:select 字段1,字段2? from 表名 where 查询条件

或者:select 字段1 as 别名1,字段2 as 别名2? from 表名 where 查询条件 注:where中不允许用别名。 复习上次课内容:

1.3种关系代数运算 选择 投影 连接 从行的方向对表进行分割; 投影从列的方向对表进行分割; 3. 查询

select * from 表名; select 学号,姓名 from 表名; select 学号 as id,姓名 from 表名; 新内容:

一、 select语句

选择列、 指定别名、 计算列值、

替换查询结果中的数据;

Select 学分*2 from kc; 1)

替换查询结果中的数据

语法格式: select 字段名, case

when 条件1 then 表达式1 when 条件2 then 表达式2 ?? else 表达式

end as 别名

from 表名 where 设定条件;

27

Mysql----讲课内容 第28页 共70页

例1:查询XS表中计算机系各同学的学号、姓名和总学分,对其总学分按以下规则进行替换:若总学分为空值,替换为“尚未选课”;若总学分小于50,替换为“不及格”;若总学分在50~52之间,替换为“合格”;若总学分大于52,替换为“优秀”。列标题更改为“等级”。

select 学号, 姓名,

case

when 总学分 is null then '尚未选课'

when 总学分 < 50 then '不及格'

when 总学分 >=50 and 总学分<=52 then '合格'

esle '优秀' end as 等级

from xs where 专业名='计算机';

例2:按120分计算成绩,显示XS_KC表中学号为081101的学生课程信息。

select 学号, 课程号, 成绩*1.20 as 成绩120 from xs_kc where 学号= '081101'; 注意问题:

① 在select后紧跟要查询的字段,多个字段之间用逗号作为间隔;查询所有字段,直接用*就可以; ② 可以使用case ?when ?then?else?end实现查询结果的替换; ③ 可以直接在要查询的字段中用公式进行列至计算; ④ 在select后紧跟distinct就可以消除结果集中的重复行; 二、聚合函数

在SELECT中可以添加聚合函数。聚合函数常常用于对一组值进行计算,然后返回单个值。聚合函数通常与GROUP BY子句一起使用。如果SELECT语句中有一个GROUP BY子句,则这个聚合函数对所有列起作用,如果没有,则SELECT语句只产生一行作为结果。

注意问题:除COUNT函数外,聚合函数都会忽略空值。

28

Mysql----讲课内容 第29页 共70页

聚合函数列表 函 数 名 count(*,列名) max(数值型列名) min(数值型列名) sum(数值类型列名) avg(数值类型列名) STD或STDDEV VARIANCE GROUP_CONCAT BIT_AND BIT_OR BIT_XOR 注意问题:

1.count( )如果用*,则统计所有的行数(包括空行);如果用字段名,则统计字段不为空的记录;

介绍几个常用聚合函数的使用方法: 1. COUNT函数

功能:用于统计组中满足条件的行数或总行数,返回SELECT语句检索到的行中非NULL值的数目,若找不到匹配的行,则返回0。

语法格式为:COUNT ( { [ ALL | DISTINCT ] expression } | * ) 注意问题:

expression是一个表达式,其数据类型是除BLOB或TEXT之外的任何类型。ALL表示对所有值进行运算,DISTINCT表示去除重复值,默认为ALL。使用COUNT(*)时将返回检索行的总数目,不论其是否包含 NULL值。 例1:求学生的总人数

SELECT COUNT(*) AS '学生总数' FROM XS; 例2:统计备注不为空的学生数目

29

说 明 统计行数( int) 求最大值 求最小值 返回表达式中所有值的和 求平均值 返回给定表达式中所有值的标准差 返回给定表达式中所有值的方差 返回由属于一组的列值连接组合而成的结果 逻辑或 逻辑与 逻辑异或 Mysql----讲课内容 第30页 共70页

SELECT COUNT(备注)AS '备注不为空的学生数目' FROM XS;

注意:这里COUNT(备注)计算时备注为NULL的行被忽略,所以这里是7而不是22。 例3:统计总学分在50分以上的人数

select count(总学分) from xs where 总学分>50;

2. max和min

功能:MAX和MIN分别用于求表达式中所有值项的最大值与最小值; 语法格式:max / min ( [ all | distinct ] expression ); 注意问题:

其中,expression是常量、列、函数或表达式,其数据类型可以是数字、字符和时间日期类型。 例4:求选修101课程的学生的最高分和最低分

select max(成绩), min(成绩)from xs_kc where 课程号 = '101'; 注意:当给定列上只有空值或检索出的中间结果为空时,MAX和MIN函数的值也为空。 3. sum函数和avg函数

功能:SUM和AVG分别用于求表达式中所有值项的总和与平均值; 语法格式:sum / avg ( [ all | distinct ] expression ) 注意问题:

其中,expression是常量、列、函数或表达式,其数据类型只能是数值型数据。 例5: 求学号081101的学生所学课程的总成绩

SELECT SUM(成绩) AS '课程总成绩' FROM XS_KC WHERE 学号 = '081101'; 例6:求选修101课程的学生的平均成绩

SELECT AVG(成绩) AS '课程101平均成绩' FROM XS_KC WHERE 课程号 = '101'; 4.

VARIANCE和STDDEV(STD)函数

功能:VARIANCE和STDDEV函数分别用于计算特定的表达式中的所有值的方差和标准差 语法格式:VARIANCE / STDDEV ( [ ALL | DISTINCT ] expression ) 例6: 求选修101课程的成绩的方差。

SELECT VARIANCE(成绩) FROM XS_KC WHERE 课程号= '101'; 注意问题:方差的计算按照以下几个步骤进行。 ① 计算相关列的平均值;

② 求列中的每一个值和平均值的差; ③ 计算差值的平方的总和; ④ 用总和除以(列中的)值得结果。

30

Mysql----讲课内容 第31页 共70页

STDDEV函数用于计算标准差。标准差等于方差的平均根。所以,STDDEV(?)和SQRT(VARIANCE(?))这两个表达式是相等的。

例7:求选修101课程的成绩的标准差

SELECT STDDEV(成绩) FROM XS_KC WHERE 课程号= '101';例1:查询姓李的同学的学号、姓名和专业名。

7-2周—讲课内容:

复习上次课内容:

1.select中选择列、计算列值、替换查找到的数据、聚合函数(count(姓名)、max(),min(),sum()、avg() ) 新内容: 一、FROM子句

功能:指定查询数据的来源;

语法格式:from 表名[ , table_reference]; 例1:select * from xs; 多个表的查询: xs.学号=xs_kc.学号 1.

多个表的数据查询

如果在多个表中查询数据,则必须在from中指定多个表之间的连接方式,连接方式主要有2中:全连接和join连接。

1)

全连接

多个表之间用逗号隔开,就是全连接方式。 例1:查询xs,xs_kc表中的学号、姓名和成绩。

select xs.学号,xs.姓名,xs_kc.成绩 from xs,xs_kc where 学号=’081101’; 注意问题:distinct可以去掉重复行。 select dintinct *from?.. 2)join连接

join连接又分为3种,分别是:内连接、外连接和交叉连接。 内连接:即指定inner关键字的连接,即内连接。 格式:from 表1 inner 表2 on(连接条件) 例2:查询xs,xs_kc表中的学号、姓名和成绩。

select 姓名,成绩 from xs join xs_kc on

31

Mysql----讲课内容 第32页 共70页

xs.学号 = xs_kc.学号

where 课程号 = '206' and 成绩>=80; 例3:用内连接实现以下查询,查找选修了“计算机基础”课程且成绩在80分以上的学生学号、姓名、课程名及成绩。(3个表:xs kc xs_kc)

select xs.学号, 姓名, 课程名, 成绩 from xs join xc_kc on xs.学号 = xs_kc.学号 join kc on xs_kc.课程号 = kc.课程号 where 课程名 = '计算机基础' and 成绩>=80 ; 四、where子句

功能:设定查询条件;用在from后面。 语法格式:where查询条件

执行过程:where子句会根据条件对from子句的中间结果中的行一行一行地进行判断,当条件为true的时候,一行就被包含到where子句的中间结果中。 1.

比较运算符 4=5 值:假 不符合条件

4>5

4!=6 值:真

=(等于)、 <(小于)、 <=(小于等于)、 >(大于)、 >=(大于等于)、 <=>(相等或都等于空)、<>(不等于)、!=(不等于)。

例:学号=‘081101’ 成绩>60 备注<=>null 专业名=‘计算机’ and 性别=0 2.

模式匹配 like

值: 假

功能:指出一个字符串是否与指定的字符串相匹配,返回值为false或true; 语法格式:

字段 [not] like “%_” 注意问题:

? “%”代表0个或多个字符,“_”代表单个字符;

? escape_character:转义字符,escape_character 没有默认值,且必须为单个字符。当要匹配的字符串中含有与特殊符号(_和%)相同的字符时,此时应通过该字符前的转义字符指明其为模式串中的一个匹配字符。使用关键字ESCAPE可指定转义符。

例1:查询XSCJ数据库XS表中姓“王”的学生学号、姓名及性别。单表查询 select 学号,姓名,性别

32

Mysql----讲课内容 第33页 共70页

from xs

where 姓名 like '王%';

例2:查询XSCJ数据库XS表中学号倒数第二个数字为0的学生学号、姓名及专业名。单表

select 学号,姓名,专业名 from xs where 学号 like '%0_'; 例3:查询XS表中学号中包含下画线_的学生学号和姓名。

select 学号,姓名 from xs where 学号 like '%#_%' escape '#'; like ‘#_’escape ’#’ 3.

模式匹配 regexp

运算符用来执行更复杂的字符串比较运算。它是正则表达式(regular expression)的缩写。和like运算符一样,regexp运算符有多种功能,但它不是SQL标准的一部分,regexp运算符的一个同义词是rlike。

语法格式:

match_expression [ not ][ regexp | rlike ] match_expression

like运算符有两个符号具有特殊的含义:“_”和“%”。而regexp运算符则有更多的符号有特殊的含义,参见表4.11。

表4.11 属于REGEXP运算符的特殊字符 特殊字含 义 符 匹配字符串的开^ 始部分 匹配字符串的结$ 束部分 匹配任何一个字. 符(包括回车和新行) 匹配星号之前的* 0个或多个字符任何序列 匹配加号之前的+ 1个或多个字符的任何序列 ?

特殊字符 含 义 [abc] 匹配方括号里出现的字符串abc 匹配方括号里出现的a~z之间的1[a-z] 个字符 匹配方括号里出现的不在a~z之间[^a-z] 的1个字符 | 匹配符号左边或右边出现的字符串 匹配方括号里出现的符号(如空格、[[. .]] 换行、括号、句号、冒号、加号、连字符等) [[:<:]和[[:>:]] 匹配一个单词的开始和结束 33

匹配问号之前0 Mysql----讲课内容 第34页 共70页

个或多个字符 匹配括号前的内{n} 容出现n次的序列 匹配括号里的内() 容

例1:查询姓李同学的学号、姓名和专业名。 用like模式匹配: 姓名 like ‘李%’

Select 学号,姓名,专业名 from xs where 姓名 regexp '^李';

例2:查询学号里包含4、5、6的学生学号、姓名和专业名。 select 学号,姓名,专业名 from xs where 学号 regexp '[4,5,6]';

[[: :] 一个字符 匹配方括号里出现的字符中的任意8-1周讲课内容:

复习上次课内容: 1. 2.

掌握where中关系运算符

掌握第1种模式匹配 like % _ 转义字符 escape # 转义字符具体用法:姓名 like’%#_%’escape’#’

3.

第2种模式匹配 regexp

新内容:

§4.2 数据库的查询

一、模式匹配 regexp(正则表达式)

例3:查询学号以08开头,以08结尾的学生学号、姓名和专业名。 select 学号,姓名,专业名from xs where 学号 regexp '^08.*08$'; 二. 范围比较 between和in

语法格式:expression [ NOT ] between 值1 and 值2

功能:要查询的条件是某个值的范围时,可以使用between关键字。between关键字指出查询范围。

注意问题:当不使用not时,若表达式的值在值1与值2之间(包括这两个值),则返回TRUE,否则返回FALSE;

34

Mysql----讲课内容 第35页 共70页

使用not时,返回值刚好相反。

例4:查询XSCJ数据库XS表中不在1989年出生的学生情况。 select 学号, 姓名, 专业名, 出生日期 from xs

where 出生日期 not between '1989-1-1' and '1989-12-31';

例5:查询XS表中专业名为“计算机”、“通信工程”或“无线电”的学生的情况。 select * from xs

where 专业名 in('计算机', '通信工程', '无线电'); 该语句与下列语句等价: Select * from xs

where 专业名 ='计算机' or 专业名 = '通信工程' or 专业名 = '无线电'; 三. 空值比较

语法格式:表达式或值 is [ not ] null; 功能:判定一个表达式的值是否为空值; 例6:查询XSCJ数据库中总学分尚不定的学生情况。 select * from xs

where 总学分 is null; 四. 子查询

定义:在查询条件中,可以使用另一个查询的结果作为条件的一部分,即子查询。 注意问题:

? SQL标准允许SELECT多层嵌套使用,用来表示复杂的查询

? 子查询除了可以用在select语句中,还可以用在insert、update及delete语句中。 ? 子查询通常与in、exist谓词及比较运算符结合使用。 1)in子查询

语法格式:表达式或值 [ not ] in ( 子查询)

功能:用于进行一个给定值是否在子查询结果集中的判断;

分析过程:当表达式expression与子查询subquery的结果表中的某个值相等时,IN谓词返回TRUE,否则返

回FALSE;若使用了NOT,则返回的值刚好相反。

例7:查找在XSCJ数据库中选修了课程号为206的课程的学生的姓名、学号。 select 姓名,学号 from xs

where 学号 in

35

Mysql----讲课内容 第36页 共70页

( select 学号 from xs_kc where 课程号 = '206'

);

注意问题:在执行包含子查询的SELECT语句时,系统先执行子查询,产生一个结果表,再执行外查询。 2) 比较子查询

语法格式:表达式或值{ < 、 <= 、 = 、 > 、 >= 、!= 、<> } ( 子查询) 功能:使表达式的值与子查询的结果进行比较运算, 例8: 查找选修了离散数学的学生学号。 select 学号 from xs_kc where 课程号 = ( select 课程号 from kc

where 课程名 ='离散数学'

);

例9:查找XS表中比所有计算机系的学生年龄都大的学生学号、姓名、专业名、出生日期。 select 学号, 姓名, 专业名, 出生日期 from xs

where 出生日期

where 专业名 ='计算机'

);

例10:查找XS_KC表中课程号206的成绩不低于课程号101的最低成绩的学生的学号。 select 学号 from xs_kc where 课程号 = '206' and 成绩 >=any ( Select 成绩 from xs_kc

where 课程号 ='101'

36

Mysql----讲课内容 第37页 共70页

);

五、group by子句

语法格式:group by {字段名| 表达式 | position} [asc |desc], ... [with rollup] 功能:根据字段对行分组

例11:将XSCJ数据库中各专业名输出。 select 专业名 from xs group by 专业名; 例12:求XSCJ数据库中各专业的学生数。

select 专业名,count(*) as '学生数' from xs group by 专业名; 例13:求被选修的各门课程的平均成绩和选修该课程的人数。

select 课程号, avg(成绩) as '平均成绩' ,count(学号) as '选修人数' from xs_kc group by 课程号; 注意问题:

1. asc(升序)或desc(降序),默认是asc升序 六、havging子句

havging子句的功能和where的功能类似,只不过where用在from后,用来设定条件;havging子句用在group by后设定排序的条件。例如:查找XSCJ数据库中平均成绩大于85的学生信息,就是在XS_KC表上按学号分组后筛选出符合平均成绩大于等于85的学生。 语法格式: Having 选择条件

例14:查找XSCJ数据库中平均成绩在85分以上的学生的学号和平均成绩。 select 学号, avg(成绩) as '平均成绩' from xs_kc group by学号 having avg(成绩) >=85;

例15:查找选修课程超过2门且成绩都在80分以上的学生的学号。 select 学号 from xs_kc where 成绩 >= 80 group by 学号

having count(*) > 2; 注意问题:

1. having中可以包含聚合函数,而where中不能包含聚合函数; 七、order by子句

37

Mysql----讲课内容 第38页 共70页

在select语句中,不使用order by,结果中行的顺序是不可预料的。使用order by后可以保证结果中的行按一定顺序排列。

语法格式:order by {列名 | 表达式 | position} [asc | desc] , ... 例16:将通信工程专业的学生按出生日期先后排序。 select 学号,姓名,专业名,出生日期 from xs

where 专业名 = '通信工程' order by 出生日期;

例17:将计算机专业学生的“计算机基础”课程成绩按降序排列。 select 姓名,课程名,成绩 from xs,kc,xs_kc

where xs.学号= xs_kc.学号 and xs_kc.课程号= kc.课程号 and 课程名= '计算机基础' and 专业名= '计算机' order by 成绩 desc;

10-1周—讲课内容:

§4.3 数据库视图 一、视图的概念

视图(view)是一个虚表,并不存储数据,它的数据真正来源于表。可以对视图进行查询、修改、删除和更新的操作。视图是数据库的一个对象。 优点:

(1) 视图可以将多个表的数据集中到一起,方便用户的查询和处理; (2) 屏蔽了复杂的数据库;

(3) 简化用户权限的管理,增加了安全性; (4) 便于数据库共享;

(5) 视图可以重新组织数据以便输出到其他应用程序中。 二、创建视图

1. 创建视图 create view

语法格式:

38

Mysql----讲课内容 第39页 共70页

create or replace view 视图名 as sql语句

注意问题:

? or replace能够替换已有的同名视图;

? algorithm 有3个值可选,分别是merge(混合)、temptable(临时表)、undefined(未定义的,这个是默认项); ? sql语句用来创建视图,可在sql语句中查询多个表或视图;但sql语句中不能包含子查询,如果引用的不是当前的数据库,需要在表或视图前加上数据库的名字;

? with check option 即在可更新视图上进行的修改都要符合sql语句的限定条件。 例1:创建了一个视图shitu_xs,数据来源于 Xs表:

create view shitu_xs as select * from xs;

例2:创建视图 cs_kc,包括计算机专业各学生 的学号、其选课的课程号和成绩,要保证对 该视图的修改都要符合专业名为计算机 这个条件。

Xscj:xs , kc , xs_kc 数据表 create view cs_kc as

select xs.学号,课程号,成绩 from xs,xs_kc

where xs.学号=xs_kc.学号

and xs.专业名=‘计算机‘

with check option;

例2: 创建xscj数据库的计算机专业学生的平均成绩视图,视图名字是cs_kc_avg,包括学号(在视图中列名为num)、平均成绩(在视图中列名为score_avg). rreate view cs_kc_avg as

select 学号,avg(成绩) from cs_kc group by 学号; 三、查询视图

视图定义后,可以对视图进行查询。

例3:在视图cs_kc中查找计算机专业的学生学号和选修的课程号。 select 学号, 课程号

39

Mysql----讲课内容 第40页 共70页

from cs_kc;

例4:查找平均成绩在80分以上的学生的学号和平均成绩。 首先创建学生平均成绩视图xs_kc_avg,包括学号和平均成绩 : create view xs_kc_avg(num,score_avg) as

select 学号,avg(成绩) from xs_kc group by 学号;

再对xs_kc_avg视图进行查询: select * from xs_kc_avg where score_avg>=80; 注意问题:

? 若与该视图相关联的表或视图被删除,则该视图将不能再使用; 四、更新视图

在下列情况下,视图不能进行更新: (1)聚合函数; (2)DISTINCT关键字; (3)GROUP BY子句; (4)ORDER BY子句; (5)HAVING子句; (6)UNION运算符;

(7)位于选择列表中的子查询; (8)FROM子句中包含多个表;

(9)SELECT语句中引用了不可更新视图;

(10)WHERE子句中的子查询,引用FROM子句中的表;

(11)ALGORITHM 选项指定为TEMPTABLE(使用临时表总会使视图成为不可更新的)。 其它情况下,视图可以进行更新,具体更新操作如下: 1. 插入数据

通过视图,使用insert向表中插入数据。

例5:创建视图CS_XS,视图中包含计算机专业的学生信息,并向CS_XS视图中插入一条记录:('081255','李

40

Mysql----讲课内容 第41页 共70页

牧','计算机',1,'1990-10-21',50,NULL,NULL) 首先创建视图CS_XS: Create or replace view cs_xs as select * from xs

where 专业名 = '计算机'

with check option; 接下来插入记录: Insert into cs_xs

values('081255', '李牧', '计算机', 1, '1990-10-14', 50,null,null);

注意问题:

? with check option子句会在更新数据的时候检查新数据是否符合视图定义中where子句的条件。With check option子句只能和可更新视图一起使用。

? 这样情况下,插入记录时专业名只能为“计算机”. 2. 修改数据

通过视图,使用update修改表的数据。 例6:将cs_xs视图中所有学生的总学分增加8。 Updatae cs_xs

Set 总学分 = 总学分+ 8; 注意问题:

? 若一个视图依赖于多个基本表,则一次修改该视图只能变动一个基本表的数据。。 ? 这样情况下,插入记录时专业名只能为“计算机” 3. 删除数据

通过视图,可以使用delete删除表中数据。 例7:删除CS_XS中女同学的记录 Delete from cs_xs where 性别 = 0; 注意问题:

? 对依赖于多个基本表的视图,不能使用DELETE语句

41

Mysql----讲课内容 第42页 共70页

小结第4章

1.了解mysql中的关系代数运算 投影、连接、选择

2. 熟练掌握select语句的使用 Select from where Group by having Order by 3. 理解视图

定义视图、删除视图、更新视图

第11-2周讲课内容:

第5章 索引与数据完整性约束

§ 5.1 索引 一、 索引的分类

目前的索引都是以B-TREE方式存储的,索引分为4类,分别是普通索引(index)、唯一性索引(unique)、主键(primary key)和全文索引(fulltext).

注意问题:

? 普通索引是最基本的索引类型;

? 唯一性索引要求所有的值必须是唯一的; ? 主键是一种唯一性索引

? MySQL支持全文检索和全文索引,全文索引的索引类型为FULLTEXT,全文索引只能在VARCHAR或TEXT类型的列上创建 二、创建索引

1. 使用create index创建索引 Create database Create table Create view

语法格式:create [unique |fulltext | spatital] index 索引名 [using 索引类型]

on tbl_name (index_col_name,...)

例1:根据xs表的学号列上的前5个字符建立一个升序索引xh_xs。

42

Mysql----讲课内容 第43页 共70页

create index xh_xs on xs(学号(5) asc);

复合索引:可以在一个索引的定义中包含多个列,中间用逗号隔开,但是它们要属于同一个表。这样的索引叫做复合索引。

例2:在xs_kc表的学号列和课程号列上建立一个复合索引XSKC_IN。 create index xskc_in on xs_kc(学号,课程号); 2. 在创建表时创建索引

索引也可以在创建表时一起创建。在创建表的CREATE TABLE语句中可以包含索引的定义。 语法格式:CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [ ( [column_definition] , ... | [index_definition] ) ] [table_option] [select_statement];

例3:创建XS_KC表的语句如下,XS_KC表带有学号和课程号的联合主键,并在成绩列上创建索引。 CREATE TABLE XS_KC ( 学号 CHAR(6) NOT NULL, 课程号 CHAR(3) NOT NULL, 成绩 TINYINT(1), 学分 TINYINT(1), PRIMARY KEY(学号,课程号), INDEX CJ(成绩)

);

三、删除索引

1. 使用drop index语句删除索引 例4:删除xs表上的xs_xh索引。 Drop view 视图名;

drop index xs_xh on xs; 2. 使用alter table语句删除索引 例5:删除XS表上的主键和mark索引。 alter table xs

drop primary key,

43

Mysql----讲课内容 第44页 共70页

drop index mark;

四、界面方式创建和删除索引 §5.2 数据完整性约束

一、主键约束(实体完整性约束)

通过定义primary key约束来创建主键,而且primary key约束中的列不能取空值。

由于primary key约束能确保数据的唯一,所以经常用来定义标志列。当为表定义PRIMARY KEY约束时,MySQL为主键列创建唯一性索引,实现数据的唯一性,在查询中使用主键时,该索引可用来对数据进行快速访问。

如果 primary key约束是由多列组合定义的,则某一列的值可以重复,但 PRIMARY KEY 约束定义中所有列的组合值必须唯一。

定义主键有2种方式:

? 定义字段时,定义主键,这是最常用的方式; 例1:创建表XS1,将姓名定义为主键。 CREATE TABLE XS1 (

学号 varchar(6) NULL, PRIMARY KEY 姓名 varchar(8) NOT NULL, 出生日期 datetime );

例2:创建course表来记录每门课程的学生学号、姓名、课程号、学分和毕业日期。其中学号、课程号和毕业日期构成复合主键。 CREATE TABLE course ( );

原则上,任何列或者列的组合都可以充当一个主键。但是主键列必须遵守一些规则。这些规则源自于关系模型理论和MySQL所制定的规则:

44

学号 姓名 毕业日期 课程号 学分

varchar(6) NOT NULL, varchar(8) NOT NULL,

date

NOT NULL,

varchar(3) ,

tinyint ,

PRIMARY KEY (学号, 课程号, 毕业日期)

Mysql----讲课内容 第45页 共70页

(1)每个表只能定义一个主键。来自关系模型的这一规则也适用于MySQL。

(2)关系模型理论要求必须为每个表定义一个主键。然而,MySQL并不要求这样,可以创建一个没有主键的表。但是,从安全角度应该为每个基础表指定一个主键。主要原因在于,没有主键,可能在一个表中存储两个相同的行。因此,两个行不能彼此区分。在查询过程中,它们将会满足同样的条件,在更新的时候也总是一起更新,可能会导致数据库崩溃。

(3)表中的两个不同的行在主键上不能具有相同的值。这就是唯一性规则。

(4)如果从一个复合主键中删除一列后,剩下的列构成主键仍然满足唯一性原则,那么,这个复合主键是不正确的,这条规则称为最小化规则(minimality rule)。也就是说,复合主键不应该包含一个不必要的列。 (5)一个列名在一个主键的列列表中只能出现一次。

MySQL自动地为主键创建一个索引。通常,这个索引名为PRIMARY。然而,可以重新给这个索引起名。 例3:创建例5.9中的course表,把主键创建的索引命名为INDEX_course。 CREATE TABLE course ( ); 注意问题:

域完整性约束:表的数据要符合数据类型的范围; Char ‘aba’ ‘123’ 100 Tinyint 100 2000 二、替代键约束

在关系模型中,替代键像主键一样,是表的一列或一组列,它们的值在任何时候都是唯一的。替代键是没有被选做主键的候选键。定义替代键的关键字是UNIQUE。 例4:在表XS1中将姓名列定义为一个替代键。 CREATE TABLE XS1 (

学号 varchar(6) NULL,

45

学号 姓名

varchar(6) NOT NULL, varchar(8) NOT NULL, datetime

NOT NULL,

毕业日期 课程号 学分

varchar(3),

tinyint ,

PRIMARY KEY INDEX_course(学号, 课程号, 毕业日期)

本文来源:https://www.bwwdw.com/article/nq6v.html

Top