计算机二级MySQL笔记
| 知识点 | 内容 |
|---|---|
| 数据库的基本概念与方法 | 数据库概念和特点、数据库系统结构、数据模型、数据库设计方法 |
| MySQL平台下的sql交互操作 | 数据库、表、视图和索引概念、创建以及使用方法,数据完整性约束的概念、定义以及使用方法 |
| MySQL的数据库编程 | 触发器、事件、存储过程函数概念以及触发器的使用,事件的创建使用,存储函数的创建使用 |
| MySQL的管理与维护 | MySQL的安装配置,MySQL用户账号权限管理的作用和方法,MySQL数据库备份概念和方法;二进制文件使用 |
| MySQL的应用编程 | PHP语言的基本使用方法;MySQL平台下编辑PHP简单应用程序(简单了解) |
重点
-
MySQL的安装与配置
-
MySQL平台下的sql交互操作
-
MySQL的数据库编程
选择题40分 操作题60分
数据库的基本概念、原理、技术(初步掌握)
数据库系统的三级模式结构
数据库系统的运行与应用结构
关系规范化的基本方法
关系数据设计的方法与过程
第一章 数据库技术的基本概念与方法!!!
-
基本概念
-
什么是数据?
指存储在某种介质上能够识别的物理符号如文字、图像等等。
-
什么是数据库?
保存在磁盘等外存介质上的数据集合,能被各类用户所共享,按一定的数据模型组织、描述和存储、较高的数据独立性和易扩展性。
-
什么是数据库管理系统(DBMS)?
用户与操作系统之间的数据管理软件。如access、MySQL等,是数据库的核心。
功能如下:
-
数据定义
-
数据操纵
-
数据库运行管理
-
数据库的建立与维护提供方便、有效存取数据库信息的接口和工具
-
-
什么是数据库系统?(DBS)
引入数据库的计算机系统是一个集合体 ,包括:应用系统、数据库管理系统、应用开发工具、数据库管理员和用户
用户------应用开发工具------数据库管理系统(DBMS)------应用系统(OS)------数据库(数据库------DBA(数据库管理员------DBMS))
-
-
数据库系统的特点
-
数据结构化
-
数据冗余度小(无法避免一切的冗余)
-
数据共享性好
-
数据独立性好
-
数据由DBMS统一管理和控制
注:数据库系统最根本是解决数据共享问题
-
-
数据库系统的结构
3.1 数据库系统的三级模式结构
-
模式 (是对数据库中全体数据逻辑结构和特征 的描述,是所有用户的公共数据视图,也叫逻辑模式或概念模式)
-
外模式 (也叫子模式或用户模式,是对数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图 ,是与某一应用有关的数据逻辑表示。一个数据库可以有多个外模式。)
-
内模式 (也叫存储模式,是对数据库中数据物理结构和存储方式的描述,是数据在数据库内部的表示形式。一个数据库只有一个内模式)
关系:模式是内模式的逻辑表示,内模式是模式的物理实现,外模式是模式的部分抽取。
3.2 三级模式结构的两层映像与两级数据独立性
-
外模式/模式映像 ,定义各个外模式与概念模式之间的映像关系,体现数据的逻辑独立性
-
模式/内模式映像 ,定义数据库全局逻辑结构与存储结构之间的对应关系,体现数据的物理独立性
3.3 数据库系统的运行与应用结构
-
客户/服务器(client/server,c/s)结构
数据库的使用者使用命令客户端、图形化界面管理工具或应用程序等来连接数据库管理系统,并对其中的数据进行操作。分为单机方式 和网络方式。
-
浏览器/服务器(brower/server,b/s)结构,也叫三层客户/服务器结构,将客户端分为表示层和处理层,表示层通常浏览器。
-
-
数据模型
在数据库中,用数据模型来抽象、表示和处理现实世界中的数据和信息。
-
物理层(物理数据模型),面向计算机物理表示的模型。
-
逻辑层(数据模型:层次模型、网状模型、关系模型、面向对象模型),面向数据库系统的模型。
-
概念层(概念模型:实体-联系模型),是对客观世界复杂事物的结构描述及它们之间的内在联系的刻画。
4.1 概念模型
实体(entity):客观存在并相互区别的万事万物,也可以是抽象的事件,如一堂课
属性(attribute):实体的特征(外在表现)。如学生的学号、姓名等
实体型(entity type):属性的集合表示一个实体,而属性的集体表示一种实体的类型,称为实体型。
实体集(entity set):性质相同的同类实体的集合
码(key):唯一标识实体的属性集
域(domain):属性的取值范围
!!!联系(relationship):实体内部的联系和实体之间的联系
-
一对一:表A中的一条记录只与表B中的一条记录联系(一个学校只有一个校长)
-
一对多:表A中的一条记录与表B中的多条记录联系(一个学校有多个老师)
-
多对多:表A中的一条记录与表B中多条记录联系,反之如此。(一个学生可以选多个选修课,而一门选修课可以被多个学生选择)
P7可以看ER图
4.2 关系模型------用二维表表示
-
关系:一个表就是一个关系,即一个二维表
-
元组:一个二维表中,水平方向的行称为元组
-
属性:二维表中垂直方向的列称为属性
-
域:属性的取值范围
-
分量:元组的一个属性值
-
关系模式:对关系的描述,表示为"关系名(属性1,属性2....,属性n),MySQL中的表:表名(字段名1....)
-
表:有行和列组成
-
行:表中的记录
-
主键:其值能够唯一标识一个元组的属性或属性的组合,也叫主码或主关键字
-
外键:表中的一个字段不是本表的主关键字,而是另外一个表的主关键字,这个字段就称为外关键字。
-
数据类型:所允许的数据类型(char什么的)
为了减少数据库中的数据冗余,增强数据的易操作性,消除数据插入、删除异常等现象(多表信息有些相同,修改要一起改),关系模型要求关系必须规范化 。规范条件从对表的基本约束到严格依次分为第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF。
-
第一范式 ,无重复的列,某属性不能 有多个值或者不能有重复的属性
-
第二范式 ,满足1NF,没有部分函数依赖,属性完全依赖于主键,每个实例或行必须可以唯一区分
-
第三范式 ,满足2NF,没有传递函数依赖,不依赖于其它非主属性,即要求一个数据库中不包含其他表中已包含的非主关键字信息
-
BCNF ,符合3NF,表中不存在 主建列对主键的部分函数依赖和传递函数依赖
-
-
数据库设计
分为六个阶段:需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库实施、数据库存运行与维护
5.1 概念结构设计
将用户需求抽象为信息结构,是整个数据库设计的关键,通常使用E-R图来描述现实世界的概念模型。
5.2逻辑结构设计
把E-R图转换为关系模型(表及其联系),对其性能进行优化,逻辑模式规范化及调整、实现,根据需要设计更符合局部用户需要的用户外模式。
5.3物理设计
数据库逻辑结构在存储设备上的实现
(1)确定数据库的物理结构
(2)对物理结构进行评价
第二章 Mysql系统特性、管理工具及MySQL语言结构
Mysql系统特性、管理工具及MySQL语言结构
MySQL的安装与配置过程及方法
-
MySQL系统特性
MySQL是一个中小型关系数据库管理系统,具有体积小、速度快、开放源代码、遵循GPL等特点,许多中小型网站选择MySQL作为网站数据库。
具有可移植性、支持多种操作系统平台、支持多种语言、方便支持上千万条记录、为多种编程语言提供API、提供多种数据库连接途径等特点。
MySQL在Internet上构建网站与信息管理系统应用环境有两种:
LAMP(Linux+Apache+MySQL+PHP/Perl/Python)
WAMP(Windows+Apache+MySQL+PHP/Perl/Python)
-
MySQL服务器的安装与配置
可以在MySQL站点上获得大多数主要的软件包格式(RPM、MSI、TGZ),可运行在不同的操作平台下。
此处采用MySQL5.5.25a 为例,在Windows XP操作系统下进行安装配置,在MySQL官网上免费下载
不会考具体的安装配置
例子:1.在MySQL的安装过程中,若选用"启动TCP/IP网络",则MySQL会默认选用端口号是3306
2.MySQL安装成功后,系统会默认建立一个root用户
-
MySQL服务器的启动与关闭
windows开始菜单--控制面板--管理工具--服务 ,在弹出的服务列表中找到MySQL服务,通过"关闭"、"暂停"、"启动"等按钮进行操作。
-
MySQL客户端管理工具
-
MySQL命令行客户端
windows开始菜单--所有程序--MySQL--MySQL server2.2--mysql 5.5command line Client
命令行提示符MySQL> 后面写代码
-
MySQL客户端程序与实用工具
在MySQL客户端程序运行平台中正确执行,才能以c/s工作模式来连接和管理MySQL服务器。
开启DOS终端 作为MySQL客户端程序与实用工具的运行平台,进入MySQL安装目录下的bin目录,再输入各种MySQL客户端脚本和程序命令。
常用的MySQL客户端程序和实用工具有:MySQL、mysqlaccess、mysqladmin、mysqlbinlog、mysqldump等
-
MySQL图形化工具
-
phpMysamin,B/S工作模式
-
Navicat,C/S工作模式
-
MySQL Workbench
-
-
-
MySQL语言结构
-
结构化查询语言SQL
专门用来与数据库通信,每个SQL语句由一个或多个关键字构成,几乎所有DBMS都支持SQL,简单易学,可进行复杂和高级的数据库操作。语句不区分大小写。
-
MySQL语言组成
-
数据定义语言(DDL) ,对数据库及数据库中的各种对象进行创建、删除、修改等操作:create、alter、drop
-
数据操纵语言(DML) ,操纵数据库中各种对象,主要是检索和修改数据:select、insert、update、delete
-
数据控制语言(DCL) ,用于安全管理:grant、revoke
-
-
MySQL扩展增加的语言要素
-
常量,程序运行过程中值不变的量
-
字符串常量:"how do you do"
-
数值常量:123、3.1415926、2.34E+2
-
十六进制常量:0x2A、0XFFFF
-
时间日期常量:'2013-07-16'
-
位字段常量:b'0'
-
布尔值:true和false,分别数字值为"1"、"0"
-
null值:没有值、无数据
-
-
变量,用于临时存放数据,有名字和数据类型两个属性,分为用户变量和系统变量,用户变量前添加一个符号"@",系统变量前添加两个"@" set @name='王林' select @@version(可以看到该MySQL的版本)
-
运算符
-
算术运算符:+,-,*,/,% 18/5=3.6 18%5=3
-
位运算符:&位或、|位或、^位异或、~位取反、>>位右移、<<位左移
例:3->00000011 5->00000101 3&5=00000001(相同得该数,不同得0 假)
0|0=0 0|1=1 1|0=1 1|1=0(有一方真 就真)
0^0=0 0^1=1 1^0=1 1^1=0(不同为真,相同为假)
100得二进制01100100 ~100=10011011(取相反)
4<<2值为16 000000100 00010000(前两位往右移动)
-
比较运算符:= < > <> >= != <=>
-
逻辑运算符:NOT或! AND或&& OR或|| XOR逻辑异或
-
-
表达式,是常量、变量、复杂计算、运算符和函数的组合
表达式的值也是具有某种数据类型的,字符类型、值类型、日期时间类型等
-
内置函数,函数名后要跟圆括号,如NOW()
-
-
-
总结
安装、配置数据库 并进行启动关闭,端口号
客户端管理工具(MySQL命令行客户端)
结构化查询语言SQL由DDL、DML、DCL及MySQL扩展增加啊的语言要素构成
常量、变量、运算符、表达式、函数的概念等
第三章 数据库的创建与使用 表的创建和修改!!!!!
MySQL中使用SQL语句创建和操作数据库的方法
MySQL中使用SQL语句创建和操作表的方法
-
数据库的创建与使用
-
创建 数据库 create {DATABASE |SCHEMA} IF NOT EXISTS (判断我的数据库存不存在) db_name DEFAULT CHARACTER SET = charset_name |DEFAULT COLLATE = collation_name
eg.创建一个名为mysql_test的数据库 create database mysql_test;
-
use db_name;
只有使用use命令指定某数据库为当前数据库,才能对该数据库及其存储的数据对象执行各种后续操作。
-
修改数据库
alter {database|schema} db_name (可省略,只要是当前数据库) default character set = charset_name(默认字符集) | default collate = collation_name(校对规则)
eg.修改数据库mysql_test默认字符集为2312 ,校对规则为gb2312_chinese_ci
mysql->alter database mysql_test
->default charcter set gb2312
->default collate gb2312_chinese_ci
aleter {database|schema} db_name upgrade data directry name(有可能因为数据库版本升级导致名字不对应,用此语句进行修改)
-
删除数据库
drop {database |schema} if exists db_name
eg.删除数据库mytest
drop database if exists mytest;
注意:information_schema和mysql两个系统数据库是系统自动创建,别删
-
查看数据库
show {database|schemas} like'pattern'
eg.列出当前可查看的数据库
show database;
列出以my开头的数据库
show databases like'my%';
-
-
创建和操纵表
-
创建表
create temporary table if not exists tbl_name (**create_definition,...** ) table_options partition_options create_definition: col_name data_type(数据类型) not null\|null default default_value auto_increment primary key
-
表创建基础
table_name: 表名需符合规则 ,可指定为db_name.tbl_name的格式,如加引号需写如下形式:'mydb'.'mytbl';
表创建定义 (create_definition),每列定义以列名开始,后跟列的数据类型以及可选参数,在圆括号里写出完整的字段,字段名间用逗号隔开,所有的SQL陈述以分号";"结束
temporary:临时表,只能对创建它的用户可见,断开与数据库连接时,MySQL会自动删除它;
if not exists子句:建表前进行判断,避免出现已经存在无法再新建的错误;
table_option:表选项,用于描述表存储特性;
partition_options:分区选项
-
常用的数据类型如下:
int,interger---整型,存储整数
float---浮点型,小数数据
double---双精度浮点型,双精度存储的小数数据
date---日期型,3个字节
time---以hh:mm:ss格式的时间
datetime---yyyy-mm--dd hh:mm:ss
timetamo---yyyy-mm-dd hh:mm:ss格式记录即时时间
char(M)---固定字符型,M个字节,0<=M<=255
varchar(M)---可变长的字符串类型
blob---二进制字符串,存储二进制数据,如
text---可变字符串型,存储大型文本数据
decimal---高准确度小数数据
-
auto_increment:只有整型列可设置成auto_increment属性,且每个表只能有一个,并且必须被索引;
-
指定默认值:只支持常量,blob和text类型的列不能赋予默认值,如果没有为列指定默认值,MySQL会根据列的类型
-
null为默认设置,null时没有值,不是空串,空串是一个有效值,比如'';
-
主键值必须唯一,并且not null;
-
MySQL支持多种类型的数据库引擎,可通过show engines 显示系统中可用的数据库引擎和默认引擎innoDB
-
-
例子:
create table customers(
cust_id int not null auto_incremnt (自动增长) (primary key),(末尾有主键编写,其实也可以写在这里)
cust_name char(50) not null,
cust_sex char(1) not null default 0,
cust_address char(50) null,
cust_contact char(50) null,
primary key(cust_id)
)engine=innoDB;(用innoDB做为数据库的引擎)
-
更新表
-
alter table tbl_name
alter_specification\[alter_specication\]...
-
addcolumn(列)子句
增加新列,可同时增加多个列
eg. alter table mysql_test.customers add column cust_city char(10) not null default'whhan'after cust_sex(在cust_sex这一列之后)
-
changecolumn子句
同时修改 表中的指定列的名称和数据类型,多个changecolumn子句,彼此间用逗号分隔。
eg. alter table mysql_test.customers change column cust_sex(旧列) sex char(1) null default'M'(新列);
注意:列数据类型更换,可能会丢失该列原有数据!!!
-
altercolumn子句
修改或删除表中指定列的默认值
eg. alter table mysql_test.customers alter column cust_city set default'beijing';
-
modifycolumn子句
只修改指定列的数据类型,可通过first或after指定列在表中位置
eg.alter table mysql_tst.customers modify column cust_name char(20)(要修改的数据类型) first;
-
dropcolumn子句
删除列的同时列中的一切内容也被删除
eg. alter table mysql_test.customers drop column cust_contact;
-
rename to子句
重新赋予表名
eg. alter table mysql_test.customers rename to mysql_test.backup_customers;(若在当前数据库 可不写数据库)
或者 rename table tbl_name to new_tbl_name,tbl_name2 to new_tbl_name2
-
-
复制表
create temporary table if not exists tbl_name {like old tbl_name|(like old_tbl_name)}
eg. create table mysql_test.customers_copy like mysql_test.customers;
注意 :like关键字只创建与原表结构相同的表,不复制表内容
AS(select_statement)可复制表内容,但索引和完整性约束不复制
-
删除表
drop temporary table if exists tbl_nametbl_name...
表被删除时,存储的数据和分区信息均会被删除
eg.删除数据库mysql_test中customers_copy表 drop table mysql_test.customers_copy;
-
查看表
-
显示表
show tables{from\|in} db_name
eg.查看当前可见的表 show tables;
-
显示表的结构
-
show columns{from|in} tbl_name from\|in db_name (没有use那个数据库)
-
desc tbl_name
-
-
-
对表结构的进一步说明
-
关于空值(null) ,不可与数字0或字符类型的空字符混为一谈 ,表的关键字不允许空值 ,任意两个空值不相等
-
关于列的标志(identity) 属性,每个表只能有一个列 设置为标志属性,不允许 为空值 ,可作为键值。也是设置字增长的,但用得不多。
-
关于列类型的隐含改变
-
总结:
-
数据库的创建(create database)、选择(USE),修改(alter)、修改(drop)和查看(show)
-
表的创建(create table),数据类型、auto_increment的使用,默认值,null值,主键
-
表的更新(alter)、重命名(rename...to...)、复制(...like...)、删除(drop...)和查看(show...、desc....)
-
第四章 表数据的操作!!!!!
考核目标
MySQL中使用SQL语句插入、删除和修改表数据的方法
-
插入表数据
-
使用insert语句插入表数据
-
insert low_priority(减低插入语句的优先级)\|delayed(把相应的数据放在缓存区里)\|high_priority(提高插入语句的优先级)
ignore(忽略错误)\] \[**into** \] **tbl_name** \[(col_name(列),...)
{values|value}({expr|default},...),(...)...
on duplicate key update col_name=expr\[,col_name=expr...](用于值与主键冲突后,进行的修改)
tbl_name:表名
col_name :列名,如所有列插入数据,全部列名可省略,但不安全,如只是部分列插入数据·,需明确指定列名,没有指定的列,根据默认值或相关属性处理:
indentity属性列---自动生成序号
默认值列---指定关键字default
没有默认值,允许空值列---指定关键字null
timestamp列---自动赋值
auto_increment列---表中其他列被赋值后自动生成
values或value子句:数据顺序必须的顺序相对应
expr:一个常量、变量或表达式,null,数值类型要与数据类型一致 ,列值为字符型 ,需用单引号括起来
default:已经明确指定了默认值,可通过它引用
-
insert into tbl_name set col_name={expr|default],....
set子句:给表中某列指定对应列值,未指定列,列值会被指定为该列的默认值
insert into tbl_name select...
select子句:将一个或多个表中的数据取出,并插入到另一个表中,字段数、字段的数据类型必须一致
eg. use mysql_test;
insert into customers(表)
values(901,'张三','F','北京市','朝阳区');
eg. 只有明确给出cust_name和cust_address的值,分别为"李四"和"武汉市",cust_id系统自动生成,cust_sex用默认值,cust_contact不指定(null)
-
insert into customers values(0,'李四',default(引用默认值),'武汉市',null);
或 insert into customers**(cust_id,cust_name,cust_sex,cust_address,cust_contact)**
values(0(自己会赋值,不需要填值),'李四',default,'武汉市',null);(更为安全)
insert into customers**(cust_address,cust_name,cust_sex)**
values ('武汉市','李四',default);(把系统自动生成和不指定省略)
注意:values必须以指定次序匹配列名
-
insert into customers set cust_name='李四',cust_address='武汉市',cust_sex=default;
eg.以insert...values语句的形式在customers中插入两行数据
insert into customers(cust_address,cust_sex,cust_name) values('武汉市',default,'李四'),('北京市','F','张三');
注意:insert有多组数据时,每组数据用一对圆括号括起来
eg.customers有备份表customers_copy,以insert...select语句的形式将customers_copy中的数据合并到表customers
insert into customers(cust_id,cust_name,cust_sex,cust_address,cust_contact)
select cust_id,cust_name,cust_sex,cust_address,cust_contact
from customers_copy;
注意:列名可以不相同;如果主键值重复,插入数据时省略这个列(在进行插入时id会自己进行一个自增长),检索出的数据行数为0是合法的
-
-
-
使用replace语句插入表数据
-
待插入表存在primary key或unique key,如插入数据与原值冲突无法插入,可使用replace语句替换(替代原语句)
replace into tbl_name(col_name,...)
{values|value} (expr|default),...),(...),....
eg.replace into customers(cust_id,cust_name,sex,cust_address,cust_contact)
values(901,'王五','M','guangzhou','yuexiu');
-
-
-
删除表数据
-
使用delete语句从单个表中删除数据
delect from tbl_name(col_name,...) **where** where_condition
eg.删除数据库mysql_test的表customers中的客户为'王五'的客户信息
delete from customer where cust_name='王五';
删除数据库mysql_test的表customers所有数据
delete from customers;
注意:delect from中间是没有*的!!!!
-
使用delete语句从多个表中删除数据
delete tbl_name.\* ,tbl_name\[ . \*...]
from table table_references(关联表) **where** where_condition
delete from tbl_name tbl_name.\* ,tbl_name . \*...
using table_references**where** where_condition
-
eg.假设数据库中有三个表tbl1,tbl2,tbl3,均含有id列,现要求删除表tbl中的id值等于tbl2的id值的所有行,以及tb2中id值等于表tbl3的id值的所有行
delete tbl1,tbl2 from tbl1,tbl2,tbl3 where tbl1.id=tbl2.id and tbl2.id=tbl3.id;
delete from tbl1,tbl2 using tbl1,tbl2,tbl3 where tbl1.id=tbl2.id and tbl2.id=tbl3.id;
-
-
使用truncate语句从删除表数据
如要删除所有行,使用truncate语句,执行速度更快。
truncate table tbl_name;
注意:
-
数据删除后无法恢复
-
使用语句后,auto_increment被重置为初始值
-
对于参与索引和视图的表,不能使用,应使用delete
-
比delete使用的系统和事务日志资源少
eg.使用delete语句将数据库db_test的表content中的留言人姓名为MySQL初学者的留言信息删除
delete from db_test.content where usename='MySQL初学者';
-
-
-
修改表数据
-
使用update语句修改单个表
update table_reference set col_name1={expr|default} ,col_name2={expr2\|deault}... **where** where_condition
table_reference:表名
set子句 :指定表中要修改的列名及其列值
where子句 :限定表中修改的行
eg.使用update语句将数据库mysql_test的表customers中姓名为"张三"的客户的地址更新为"武汉市"
update customers set cust_address='武汉市' where cust_name='张三';
注意事项:
-
update语句可修改表中行的列数据;
-
删除表中某个列的值 ,在允许该列可为空值的前提 下,可将它设置为null
-
同时修改数据行的多个列值 ,彼此间逗号分隔
-
-
使用update语句修改多个表
update table_references set col_name1={expr1|default} ,col_name2={expr\|default}... **where** where_condition
eg.假设数据库中有两个表tbl1和tbl2,都有两个名为id和name的列,id为各自表的主键,现要在tbl1中id值与tbl2id值相同时,将表tbl1中name列改为"李明",将表tbl2中name的值改为"宋亮"
update tbl1,tbl2 set tbl1.name='李明', tbl2.name='张亮' where tbl1.id=tbl2.id;
-
总结:
插入数据(insert...,replace...)
删除数据(delete from...,truncate...(选择题考核较多))
修改数据(update...set...)
第五章 如何对表进行查询!!!!!
考核目标
SELECT语句对MYSQL数据库进行查询
-
SELECT语句
select all \| DISTINCT(按照记录,比如工资相同,只显示一个,后在列,要把列放在括号中)
select_expr ,select_expr...
FROM table_references
**WHERE** where_condition
**GROUP BY** {col_name\|expr\|position}\[**ASC\|DESC**,...] (进行分组)
**HAVING** where_condition (对分组的条件)
**ORDER BY** {col_name\|expr\|position} ASC\|DESC,...] (对分组进行排序)
**LIMIT** {\[offset,\]row_count\|row_count OFFSET offset}
**INTO OUTFILE** 'file_name' (放文件)
ALL|DISTINCT :默认为ALL,即SELECT后可能存在重复行,DISTINCT则可消除重复行
select_expr :指定需要查询的内容
INTO OUTFILE :构成SELECT...INTO OUTFILE 将表中的行导出到服务器主机的一个文件
-
列的选择与指定
-
选择指定的列
列名之间用逗号 隔开,查询所有列可用*****通配符,列名也可写成tbl_name.col_name的格式
例题:
(1)查询数据库mysql_test的表customers中各个客户的姓名、性别和地址信息
use mysql_test;
select cust_name,cust_sex,cust_address from customers;
(2)检索用户表中工资有哪几种
select dictinct(salary) from userinfo;
(3)查询数据库mysql_test的表customers中各个客户的所有信息
select * from customers;
-
定义并使用列的别名
column_name **AS** column_alias(在select from中间加在列上)
例题:查询数据库mysql_test表customers中客户的cust_name列、cust_address列、cust_contact,并将cust_address列的名称用"地址"替代
select cust_name,cust_address as '地址',cust_contact from customers;
-
替换查询结果集中的数据(也是写在select from的中间!!!)
CASE
WHEN 条件1 THEN 表达式1
WHEN 条件2 THEN 表达式2
...
ELSE 表达式
END **AS** column_alias
例题:查询customers中的cust_name和cust_sex,要求判断结果集中cust_sex列的值,如果该列的值为M,则显示输出
"男",否则为"女",同时将cust_sex列用别名"性别"标注
select cust_name,case when cust_sex='M' then '男' else '女' end as '性别' from customers case ;
-
计算列值
例题:查询customers中的cust_name和cust_sex,并对cust_id列加上数字100后的值
select cust_name,cust_sex,cust_id+100 from customers;
计算聚合函数(后面跟列名时,列名要放在括号里面)
函数名 COUNT 求组中项数,返回INT类型整数 (查多少记录) MAX 求最大值 MIN 求最小值 SUM 求和 AVG 求平均值
-
-
FROM子句与连接表
-
FROM子句的语法
FROM table_references
table_references:
tbl_name \[**AS** alias]|tables_reference **INNER\| CROSS JOIN** table_name
可以使用关键字AS选项为表指定别名,表别名主要用于相关子查询或连接查询中。
-
连接表
SELECT使用"连接"运算符将不同表中需要查询的数据组合到一个结果集中,并以临时表的形式返回
-
交叉 连接(cross join)
又称笛卡儿积,或没有连接
SELECT * FROM tbl1 CROSS JOIN tbl2;
SELECT * FROM tbl1,tbl2
两张表记录行数的乘积
-
内 连接(inner join)
是系统默认表连接,使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据
SELECT * FROM userinfo inner join department on userinfo.departmentid=department.departmentid
根据所使用的比较方式不同,内连接又分为:
相等连接:连接条件采用运算符"=",通常包含一个主键一个外键
自连接:与它自身连接,为表指定两个不同别名
不等连接:使用除运算符"="之外的比较运算符
-
自然 连接(natural join)
-
外 连接(outer join)
外连接将连接的两张表分为基表和参考表 ,再以基表为依据返回满足和不满足条件的记录。(以基本表的记录为主显示内容)
外连接可在表中没有匹配记录 的情况下仍返回记录。分为左外连接和右外连接
-
外连接(outer join)左外连接
-
外连接(outer join)右外连接
例题:
查询出工资多于3500的员工号、姓名和部门名称
select id,name,dep_name from userinfo,department
where userinfo.departmentid=department.departmentid salary>3500;
-
-
-
WHERE子句
WHERE where_condition 过滤条件
-
比较运算= <> != < <= > >= <=>
例题:在数据库mysql_test的表customer中查找所有男性客户的信息
use mysql_test;
select * from customers where sex='M';
在表userinfo中查找工资大于4000的用户名字,薪水,部门ID的信息
select name,salary,departmentid from userinfo where salary>4000;
在用户信息表中查找工资大于3000同时性别为male的用户名、性别、工资、部门号。
select name,sex,salary,departmentid from userinfo where salary>3000 and sex='male';
查找部门不是101的用户信息
SELECT * FROM userinfo where departmentid!=101;
查找userinfo表中部门号为101的最高工资
select max(salary) from userinfo where departmentid=101;
-
字符串匹配
-
运算符LIKE%--任何字符,且出现任意次数
在数据库mysql_test的表customers中查找所有姓"王"客户信息
select * from customers where name like '王%';
-
运算符LIKE
注意:默认不区分大小写,若要区分大小写,则需要更换字符集的校对规则;
%可代表0个、1个或多个字符;
%不能匹配空值NULL;
尾空格可能会干扰通配符的匹配,可在搜索模式的最后附加一个%
-
运算符__匹配单个字符(有多少个就加多少个 _)
例题:在表customers中查找只有两个中文字符的"万"姓客户的名字和ID
select cust_name,cust_id from customers where cust_name like '万_';
-
运算符__匹配单个字符
SHOW databases LIKE 'mysq_';
SHOW databases LIKE 'mysq%';
-
在使用LIKE运算符时,可使用ESCAPE和一个指定的转义字符 ,临时改变通配符的作用。(比如想要查找带有_的名字,临时有符号转义 _的查找单个字符的作用,进行查找 _的名字时不出错)
例题:在表customers中,查找客户地址中含有下划线"_"的所有客户地址
SELECT cust_address FROM customers WHERE cust_address LIKE '%#_%'ESCAPE'#';
注意:不要过度 使用通配符(%,_....);除非必要,不要把它们用在搜索模式开始处 ,会让检索变慢 ;注意位置。
-
-
文本匹配
使用正则表达式进行文本串的匹配比较
-
基本字符匹配
在customers表中,分别使用字符串匹配和文本匹配的方式,查询客户地址中带有"市"的地址信息
select distnict cust_address from customers where cust_address like '%市%'
SELECT DISTINCT cust_address FROM customers WHERE cust_address REGEXP '市';
注意:区分大小写,需在REGEXP 之后再加BINARY
-
| 选择匹配
例题:在customers中,查询带有"北京""上海""武汉"的城市地址信息
SELECT DISTINCT cust_address FROM customers WHERE cust_address REGEXP'北京|武汉|上海';
-
范围匹配:\[\]所包含的字符或数字的组合
-
特殊字符匹配:在特殊字符前使用\作为前导
-
字符类匹配:经常使用的数字、字符等定义成一个预定义字符集
-
重复匹配:
*0或多个, +1或多个, ?0或1个, {n}指定数目
例题:在表customers中,查找名字中出现两个"丽"的客户名字(连续的两个丽)
select cust_name from customers where cust_name REGEXP '丽'{2};
-
使用定位符匹配:^文本的开始 $文本的结尾
例题:在表userinfo中查询salary以数字3或4开头的客户信息
SELECT * FROM userinfo where salary regexp '^3-4';
-
-
判定范围
-
BETWEEN...AND NOT BETWEEN...AND(两边都是闭区间)
在表customers中,查询cust_id在903-905之间的客户信息
select * from customers cust_id between 903 and 905;
在成绩中要查找成绩**≥** 80且成绩**≤**90的学生,正确的条件表达式是 成绩Between 80 And 90
-
IN(查找范围在一个可间断的区间里面)
在customers中,查询cust_id分别为903、905和908三个用户的信息
select * from customers where cust_id in(903,905,908);
-
-
判定空值--- IS NOT NULL
例题:在表customers中,查询是否存在没有填写客户联系方式的客户名字
select cust_name from customers where cust_contact is null;
-
子查询
嵌套在SELECT查询中的SELECT查询
-
NOT IN
例题:查询员工中工资大于4000的部门信息
select * from department where departmentid IN
(SELECT departmentid FROM userinfo WHERE salary>4000);
-
结合比较运算符
Expression 比较运算符 {ALL(全部输出) |SOME|ANY(只有有一条成功就可以了)}(subquery)
-
结合EXIST使用的子查询
EXIST(subquery)(子查询的结果集必须存在)
-
-
-
GROUP BY子句与分组数据
GROUP BY {col_name|expr | position}
ASC\| DESC(降序)\],...\[WITH ROLLUP(再进行汇总人数)
例题:在customers表中获取一个数据结果集,要求该结果集中包含每个相同地址的男性客户人数和女性客户人数
SELECT cust_address,cust_sex ,COUNT(*) AS '人数'
FROM customers GROUP BY cust_address,cust_sex;
在customers表中获取数据结果集,要求该结果集中包含每个相同地址的男性客户人数和女性客户人数、总人数以及客户总人数
例题:SELECT cust_address,cust_sex COUNT(*) AS '人数'
FROM customers GROUP BY cust_address,cust_sex
WITH ROLLUP;
题目:已知"借阅"表中有 "借阅编号"、"学号"和
"借阅图书编号"等字段,每个学生每借阅一本书生成一条记录,要求按学生学号统计出每个学生的借阅次数,下列SQL语句中,正确的是 Select 学号, count(学号) from 借阅 group by 学号
题目:在userinfo表中得出各部门的员工的平均工资,列出字段显示为部门号、平均工资
select departmentid as '部门号',avg(salary) as '平均工资' from userinfo group by departmentid;
-
HAVING子句
HAVING where_condition,用于在分组里指定过滤条件 ,必须与GROUP BY一起使用
与WHERE的差异:
WHERE 用于过滤行 ,HAVING 用于过滤分组;
WHERE不包含聚合函数(sum、max...),HAVING可以;
WHERE在分组前,HAVING在分组后。
例题:在customers中查找客户信息:同一地址中客户人数小于3的客户姓名及其对应地址
select cust_name,cust_address from customers group by cust_address having count(cust_name)<=3;
例题:在userinfo表中至少有两个男员工的部门的男员工的总工资,包含部门号,男员工人数,总工资信息
select departmentid as'部门号', count(sex) as '男员工人数' sum(salary) from userinfo where sex='male' group by departmentid having count (sex)>=2;
-
ORDER BY子句(用于排序)
ORDER BY col_name ASC \| DESC
例题:对于userinfo表,依次按照工资降序,部门号升序输出所有信息
select * from userinfo order by salary desc,departmentid asc;(先对工资进行排序,然后有相同的工资在进行部门号排序)
-
LIMIT子句
限制SELECT返回的行数
LIMIT {offset, row_count | row_count OFFSET offset}
offset:默认数值为0,偏移量,SELECT的第一行的偏移量为0
row_count:返回的数据行
row_count OFFSET offset:MYSQL5.0后支持,从offset行开始取row_count行
例题:在customers中查找从第三位 客户开始的两位客户的ID和姓名信息
select cust_id,cust_name from customers order by cust_id limit 2,2;
select cust_id,cust_name from customers order by cust_id limit 2 offset 2;
-
UNION语句与联合查询
SELECT ... UNIONALL \| DISTINCT SELECT...(union后面的默认是distinct)
在customers中查找性别为'F'或地址是"北京市"的客户姓名
select cust_name from customers where cust_sex='F' union select cust_name where cust_address='北京市';
例题:在customers中查找性别为'F'或地址是"北京市"的客户姓名
select cust_name from customers where cust_sex='F' or cust_address='北京市';
WHERE与UNION相比:执行性能有所不同,UNION ALL 可包含重复行
总结:
SELECT...FROM...WHERE
GROUP BY...HAVING...
ORDEY BY
LIMIT
SELECT ...UNION...SELECT
第六章 索引!!!!!!
考核目标
了解索引的基本知识
掌握使用SQL创建、查看和删除索引的方法
-
索引概述
-
索引是一张描述索引列的列值与原表中的记录行 之间一一对应关系的有序表 ,好比是一本书的目录,可加快数据库的查询速度,用来定位。
MYSQL用以下两种方法访问表中的行
(1)顺序访问(2)索引访问
select * from table1 where id=10000有索引和没索引的区别
-
-
索引的存储与分类
-
索引在物理上分为
(1)B-树索引,目前大部分索引以这种方法存储,也叫BTREE索引,采用树的数据结构形式存储文件
(2)哈希索引 ,也叫散列索引或HASH索引,根据索引列对应的哈希值来获取表中的记录行
-
索引在逻辑上分为
(1)普通索引(INDEX),INDEX或KEY创建
(2)唯一性索引(UNIQUE),索引列中的所有值只能出现一次
(3)主键(PRIMARY KEY),每个表只能有一个主键
(4)全文索引(FULLTEXT),只能在VARCHAR或TEXT,MyISAM中创建
(5)空间索引,地理空间数据
-
索引在实际应用中
(1)单列索引
(2)组合索引,组合索引(col1,col2,col3)在查询中分为单列索引(col1),双列索引(col1,col2)和多列索引(col1,col2,col3)
-
B-树索引
(1)聚集索引
键值相近的记录元组存储的物理位置相同,一个表只能有一个聚集索引。
(2)覆盖索引
包含满足查询的所有数据
-
-
索引的创建
-
使用CREATE INDEX创建索引
CREATE UNIQUE(唯一) \| FULLTEXT(全文) \| SPATIAL(空间) INDEX index_name
USING{BTREE(B数)\|HASH(哈希}
ON tbl_name(col_name (length) ASC \| DESC,...)
UNIQUE:唯一索引
FULLTEXT:全文索引
SPATIAL:空间索引
不能用CREATE INDEX 创建PRIMARY KEY索引
CREATE UNIQUE \| FULLTEXT \| SPATIAL INDEX index_name
USING{BTREE\|HASH}
ON tbl_name(col_name (length) ASC \| DESC,...)
col_name :可考虑将WHERE子句和JOIN子句里出现的列作索引列
length :前length个字符创建索引,BLOB和TEXT必须使用
ASC | DESC:默认ASC
例题:在表customers中,根据客户姓名列的前三个字符采用默认索引类型创建一个升序索引index_customers
create index index_customers on customers(cust_name(3) asc);
通过SHOW INDEX FROM customers查看
例题:在表customers中根据cust_name和cust_id采用BTREE创建复合索引index_cust
create index index_cust using btree on customers(cust_name,cust_id);
题目:用CREATE INDEX在db_test数据库的content表中,根据留言标题列的前三个字符采用默认的索引类型创建一个升序索引index_subject
create index index_subject on db_test.content(subject(3)asc);
-
使用CREATE TABLE创建索引
CREATE TABLE tbl_name(...
INDEX|KEY index_name (index_col_name,...),
PRIMARY KEY (index_col_name,...),
UNIQUE INDEX \| KEY index_name (index_col_name,...),
...)
注意:数据库管理系统对于主键自动生成唯一索引 ,所以主键也是一个特殊的索引。
主键和索引的区别:
一个表可以有多个唯一性索引 ,只有一个主键
主键一般要建,避免一张表中有相同记录,索引一般可以不建
例题:在mysql_test数据库上创建一个包含产品卖家id号、姓名、地址、联系方式、售卖产品类型、当月销量等内容的产品卖家信息表seller,在创建表同时添加由卖家id号和售卖产品类型组成的联合主键,并在当月销量上创建索引。
USE mysql_test;
CREATE TABLE seller(
seller_id int NOT NULL AUTO_INCREMENT,
seller_name char(50) NOT NULL,
seller_address char(50) NULL,
seller_contact char(50) NULL,
product_type int(5) NULL,
sales int NULL,
PRIMARY KEY(seller_id,product_type),(组合主键必须按这样子的写!!!)
INDEX index_seller(sales)
);
CREATE TABLE tbl_name ( i int NOT NULL PRIMARY KEY)
等价于
CREATE TABLE tbl_name (i int NOT NULL,PRIMARY KEY(i))
-
使用ALTER TABLE创建索引
ALTER TABLE tbl_name ADD PRIMARY KEY (index_col_name,...)
ALTER TABLE tbl_name ADD INDEX index_name (index_col_name,...)
ALTER TABLE tbl_name ADD UNIQUE INDEX\|KEY index_name (index_col_name,...)
例题:使用ALTER TABLE语句在表seller的姓名列上添加一个非唯一的索引,名为index_seller_name
alter table seller add index index_seller_name
题目:
下列哪种方法不能用于创建索引?
A. 使用CREATE INDEX语句
B. 使用CREATE TABLE语句
C. 使用ALTER TABLE语句
D. 使用CREATE DATABASE语句
答案:D
题目:
1.创建普通索引时,通常使用的关键字是INDEX或KEY
2.创建唯一性索引 时,通常使用的关键字是UNIQUE
-
-
索引的查看
SHOW { INDEX | INDEXES | KEYS } { FROM | IN } tbl_name
{**FROM \|IN**} db_name(数据库)\] \[WHERE expr
-
索引的删除
-
使用DROP INDEX删除索引
DROP INDEX index_name ON tbl_name
例题:删除表customers中的索引index_cust
drop index index_cust on customers;
-
使用ALTER TABLE删除索引
ALTER TABLE tbl_name DROP PRIMARY KEY
ALTER TABLE tbl_name DROP INDEX index_name
例题:使用ALTER TABLE删除customers的主键和索引index_customers
ALTER TABLE customers DROP PRIMARY KEY,
DROP INDEX index_customers;
注意:
所删除的列 是索引的组成部分,则该列也从索引中删除
组成索引的所有列都被删除,整个索引将被删除
-
-
对索引的进一步说明
弊端:
在提高查询速度 同时,降低更新表的速度(更新表时也会让索引进行重新排序)
索引以文件形式存储 ,占用磁盘空间
-
总结:
索引概念与作用
索引分类
-
(B-树、哈希,普通INDEX、唯一UNIQUE、主键PRIMARY KEY、空间、全文,单列、组合,聚集、覆盖)
创建索引
(CREATE INDEX...)
(CREATE TABLE ...INDEX... )
(ALTER TABLE... ADD INDEX...)
-
查看索引
(SHOW INDEX...)
删除索引
(DROP INDEX...)
(ALTER TABLE...DROP INDEX...)
-
第七章 视图!!!!!
考核目标
了解视图的概念与特点
掌握视图在MYSQL中的使用方法
-
视图概述
视图是由一个或多个表或者视图导出的虚拟表,包含数据列与行。
视图与表的区别:
(1)视图是一张虚拟表
(2)视图的数据来自定义视图查询引用的真实表,动态生成
(3)视图数据存储在引用表中
(4)视图是用来查看数据,并不存储数据
视图优点:
(1)集中分散数据
(2)简化查询语句
(3)重用SQL语句
(4)保护数据安全
(5)共享所需数据
(6)更改数据格式
-
创建视图
CREATE OR REPLACE VIEW view_name(column_list)
AS select_statement WITH CHECK OPTION
OR REPLACE:替换数据库中已有同名视图
view_name:视图名称,数据库中唯一,不能与其他表或视图同名
WITH CHECK OPTION:视图上所进行的修改都需要符合select_statement中所限定的条件
例题:在数据库mysql_test中创建视图customers_view,要求视图包含customer表中所有男客户的信息,并且要求保证今后对该视图数据的修改都必须符合客户性别为男性这个条件
CREATE OR REPLACE VIEW mysql_test.customers_view
AS
SELECT * FROM mysql_test.customers
WHERE cust_sex='M'
WITH CHECK OPTION(条件检查);
题目:在数据库db_test中创建视图content_view,要求该视图包含表content中所有留言人姓名为"MYSQL初学者"的信息,并且要求保证今后对该视图数据的修改都必须符合留言人姓名为"MYSQL初学者"这个条件。
create db_test.content_view as select * from content where subject='MySQL初学者' with check option;
-
删除视图
DROP VIEW IF EXISTS view_name,view_name...
EG.DROP VIEW IF EXIST content_view;
-
修改视图定义
ALTER VIEW view_name
AS select_statement
等同于
先使用DROP VIEW 再使用CREATE VIEW
CREATE OR REPLACE VIEW
例题:修改视图customers_view,要求视图包含customer表中所有女客户的信息,并且要求保证今后对该视图数据的修改都必须符合客户性别为女性这个条件
alter view customers_view as select * from customers where cust_sex='F' with check option;
-
查看视图定义
SHOW CREATE VIEW view_name;
-
更新视图数据
只有满足可更新条件的视图 才能进行更新,需要该视图中的行和基础表的行之间是一对一的关系。
下列情况视图不可更新:
聚合函数、DISTINCT关键字、GROUP BY子句、ORDER BY子句、HAVING子句、UNION运算符、选择列表中的子查询、FROM子句包含多个表、WHERE子句中的子查询、SELECT语句引用了不可更新的视图等。
-
使用INSERT语句 通过视图向基础表插入数据
例题:向视图customers_view插入下面一条记录:(909,'周明','M','武汉市','洪山区',NULL)
insert into customers_view values(909,'周明','M','武汉市','洪山区',null);
CREATE VIEW ygb_view AS SELECT * FROM 员工表 WHERE 员工表.性别='女';
插入新记录:INSERT INTO ygb_view(姓名,性别,工资)VALUES('李立三','男',2300)
插入操作成功,但不合理
CREATE VIEW ygb_view AS SELECT * FROM 员工表 WHERE 员工表.性别='女'WITH CHECK OPTION;
插入新记录:INSERT INTO ygb_view(姓名,性别,工资) VALUES('李立三','男',2300)插入操作将失败!
-
使用UPDATE 语句通过视图修改基础表的数据
例题:将视图customers_view中所有客户cust_address列更新为"上海市"
UPDATE customers_view SET cust_address='上海市';
-
使用DELETE 语句通过视图删除基础表的数据
例题:删除视图customers_view中姓名为"周明"的客户信息
delete from customers_view where cust_name='周明';
-
-
查询视图数据
例题:在customers_view中查找cust_id为905的客户姓名及其地址信息
select cust_name,cust_address from customers_view where cust_id =905;
题目:
不可对视图执行的操作是
A. SELECT
B. INSERT
C. DELETE
D. CREATE INDEX
答案:D
-
对视图的进一步说明
创建视图必有足够访问权限
创建视图的数目没有限制
视图可以嵌套
ORDER BY子句可用在视图中
视图不能索引,也不能有关联的触发器、默认值或规则
视图可以和表一起用
部署大量视图的应用 前,先进行性能测试
-
总结
视图的概念、特点
创建视图(CREATE VIEW...AS SELECT..)
删除视图(DROP VIEW...)
修改视图(ALTER VIEW...AS SELECT..)
查看视图定义(SHOW CREATE VIEW...)
更新视图数据(INSERT INTO...)(UPDATE...SET...)(DELETE FROM...)
查询视图数据(SELECT...FROM...WHERE)
第八章 数据完整性约束与表维护语句!!!
考核目标
掌握数据完整性的概念
掌握MYSQL中实现数据完整性约束的方法
掌握MYSQL中用于维护与管理数据库的表维护语句
-
数据完整性约束
定义了完整性约束,MYSQL服务器会随时检测处于更新状态的数据库内容是否符合相关的完整性约束,保证数据的一致性 与正确性
1.1定义完整性约束
(1)实体完整性
实体完整性规则是指关系的主属性,即主码的组成不能为空,关系的主属性不能为NULL。
-
主键约束
每个表只能定义一个主键
键值唯一 且不能为NULL
复合主键不能包含不必要 的多余列
一个列名 在复合主键的列表中只能出现一次
可能过CREATE TABLE 或ALTER TABLE 语句中使用PRIMARY KEY实现,方式有以下两种:
列的完整性约束 :在表中某个列 的属性定义后加上PRIMARY KEY
表的完整性约束 :在表中所有列 的属性定义后加PRIMARY KEY(index_col_name,....) ,主键 由表中多列构成只能用这种方法
例题:在一个已有数据库mysql_test中新建一个包含客户姓名、性别、地址、联系方式等内容的客户基本信息表,要求将客户的cust_id号指定为该表的主键,并使用InnoDB引擎存储表数据。在建表过程中以列的完整性约束方式定义主键。
use mysql_test;
create table customers(
cust_id int not null AUTO_INCREMENT PRIMARY KEY;
cust_name char(10) not null;
cust_sex char(1) no null default 0 ;
cust_address char(50);
cust_contact char(50);
engine=innode;)
-
候选键约束
候选键值必须唯一 ,且不能为NULL,通过在CREATE TABLE或ALTER TABLE中UNIQUE定义
候选键与主键之间的区别:
一个表只能有一个主键 ,可以若干候选键
定义主键 约束时自动产生PRIMARY KEY 索引,定义候选键 约束时自动产生UNIQUE索引
(2)参照完整性
教师(职工号 ,姓名,姓别,职称,++系编号++)
系(系编号,系名,办公地点,办公电话)
参照完整性规则是定义外码 和主码 之间的引用规则,是对关系间引用数据的一种限制,外码要么空 ,要么取参照关系中的主码值。
参照完整性通过在CREATE TABLE或ALTER TABLE时定义一个外键声明来实现:
在某个列属性定义后加上reference_definition;
在表中所有列的属性定义后添加
FOREIGN KEY(index_col_name,...)referenece_definition;
reference_definition:REFERENCES(reference) tbl_name(index_col_name,...)
ON DELETE reference_option
ON UPDATE reference_option
reference_option:参照完整性约束的实现策略如下:
!RESTRICT :限制 策略,默认使用,违反即拒绝(restrict)
!CASCADE :级联 策略,被参照表中删除或更新 记录行时,自动删除或更新参照表中的匹配记录行(cacade)
SET NULL :置空 策略,被参照表中删除或更新 记录行时,设置参照表中对应的外键列值为NULL
NO ACTION:不采取实施策略
教师(职工号,姓名,姓别,职称,系编号)
系(系编号,系名,办公地点,办公电话)
例题 :在数据库mysql_test中创建一个商品订单表orders,该表包含的订单信息有:订单号order_id、订购商品名order_product、订购商品类型order_product_type、订购客户id号cust_id、订购时间order_date、订购价格order_price、订购数量order_amount。要求商品订单表orders中的所有订购客户信息均已在表customers中记录在册。
use mysql_test;
create table orders(
order_id int not null auto_increment;
order_product char(50) not null;
order_product_type char(50) not null;
cust_id not null;
order_date datetime not null;
order_price double not null;
order_amount int not null;
primary KEY(order_id),
FOREIGH KEY (cust_id) REFERENCES customers(cust_id)
ON DELETE RESTRICT ON UPDATE RESTRICT);
)
注意:
被参照表必须存在且有主键
被参照表名指定的列或列组合必须是被参照表的主键或候选键
外键允许出现空值
外键列的数目、数据类型必须与被参照表的列的数据、数据类型相同
(3)用户定义的完整性
反映某一具体应用所涉及的数据应满足的要求。MYSQL中支持几种用户自定义完整性约束,分别是非空约束、CHECK约束和触发器。
a.非空约束 NOT NULL
b.CHECK约束 CHECK(expr)
例题:重新创建表orders,要求表orders中cust_id列的所有值均来源于表customers中的cust_id列
USE mysql_test;
CREATE TABLES orders(
order_id int NOT NULL AUTO_INCREMENT,
order_product CHAR(50) NOT NULL,
order_product_type CHAR(50) NOT NULL,
cust_id int NOT NULL
CHECK(cust_id IN (SELECT cust_id FROM customers)),
order_date DATETIME NOT NULL,
order_price DOUBLE NOT NULL,
order_price DOUBLE NOT NULL,
order_amount int NOT NULL,
PRIMARY KEY(order_id));
例题:重新创建表orders,要求表orders中order_price列的值不能低于2000且order_amount列的值不能高于5
USE mysql_test;
CREATE TABLES orders(
order_id int NOT NULL AUTO_INCREMENT,
order_product CHAR(50) NOT NULL,
order_product_type CHAR(50) NOT NULL,
cust_id int NOT NULL
CHECK(cust_id IN (SELECT cust_id FROM customers)),
order_date DATETIME NOT NULL,
order_price DOUBLE NOT NULL,
order_price DOUBLE NOT NULL,
order_amount int NOT NULL,
PRIMARY KEY(order_id));
CHECK(order_price>=2000 AND order_amount<=5));
1.2命名完整性约束
CONSTRAINT symbol
例题:重新创建表orders,在原要求基础上,将该表的主键约束命名为PRIMARY_KEY_ORDERS ,并将它的外键说明命名为FOREIGN_KEY_ORDERS
USE mysql_test;
CREATE TABLE orders(
order_id int NOT NULL AUTO_INCREMENT,
order_product CHAR(50) NOT NULL,
order_product_type CHAR(50) NOT NULL,
cust_id int NOT NULL,
order_date DATETIME NOT NULL,
order_price DOUBLE NOT NULL,
order_amount int NOT NULL,
CONSTRAINT PRIMARY_KEY_ORDERS PRIMARY KEY(order_id),(constraint)
CONSTRAINT FOREIGN_KEY_ORDERS FOREIGN KEY(cust_id)
REFERENCES customers(cust_id)
ON DELETE RESTRICT ON UPDATE RESTRICT);
1.3更新完整性约束
例题:删除表orders的参照完整性约束FOREIGH_KEY_ORDERS
ALTER TABLE orders
DROP CONSTRAINT FOREIGN_KEY_ORDERS;
添加约束:
ALTER TABLE...ADD CONSTRAINT...
注意:
完整性约束不能直接被修改
ALTER TABLE只删除完整性约束 ,DROP TABLE删除一个表
题目:
下列哪一项不属于MYSQL支持关系模型中的完整性约束
A.实体完整性
B.参照完整性
C.用户定义的完整性
D.命名完整性
答案:D
-
-
表维护语句
1.ANALYZE TABLE语句
通过此语句更新、修复索引散列程度
ANALYZE NO_WRITE_TO_BINLOG \| LOCAL TABLE
tbl_name,tbl_name....
例题:更新数据库mysql_test中表customers的索引散列程度,并查阅结果
ANALYZE TABLE mysql_test.customers;
2.CHECK TABLE语句
通过此语句检查一个多或多个表是否有错误
CHECK TABLE tbl_name,tbl_name...option
例题:使用CHECK TABLE 语句检查数据库mysql_test中的表customers
CHECK TABLE mysql_test.customers;
3.CHECKSUM TABLE语句
通过此语句保证数据一致
CHECKSUM TABLE tbl_name,tbl_name...
QUICK \| EXTENDED
例题:使用CHECKSUM TABLE 语句获取数据库mysql_test中的表customers的校验和
CHECKSUM TABLE mysql_test.customers;
4.OPTIMIZE TABLE语句
重新利用未使用 的空间,整理数据文件的碎片
OPTIMIZE NO_WRITE_TO_BINLOG \| LOCAL TABLE tbl_name,tbl_name...
例题:优化数据库mysql_test中的表customers
OPTIMIZE TABLE mysql_test.customers;
5.REPAIRE TABLE语句(repair)
修复 一个或多个可能被损坏的表
REPAIRE NO_WRITE_TO_BINLOG \| LOCAL TABLE tbl_name,tbl_name...
-
总结
数据完整性概念
(实体完整性)(参照完整性)(用户定义的完整性)
实体完整性(PRIMARY KEY)
参照完整性(REFERENCES...)
用户定义的完整性(NOT NULL、CHECK...)
命名完整性约束(CONSTRAINT...)
表维护(ANALYZE...,CHECK...,CHECKSUM...,OPTIMIZE...,REPAIR...)
第九章 触发器!!!!!
考核目标
了解触发器的概念
掌握MYSQL中触发器的使用方法
-
触发器
触发器用于保护表中的数据,当有操作影响到触发器所保护的数据时,触发器就会自动执行,保障数据库中数据的完整性 ,以及一致性。
MYSQL响应INSERT、UPDATE和DELETE 语句而自动执行的一条MYSQL语句,位于BEGIN和END语句之间
-
创建触发器
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_body
trigger_name:触发器名称唯一
trigger_time:触发器被触发的时刻 ,分为BEFORE和AFTER
trigger_event:触发事件 ,分为INSERT,UPDATE,DELETE
tbl_name:引用永久性表 ,同一个表不能 拥有两个 具有相同触发时刻和事件的触发器
FOR EACH ROW:每一行都激活触发器
trigger_body:动作主体,如执行多个语句,可使用BEGIN...END结构
例题:在数据库mysql_test的customers表中创建一个触发器customers_insert_trigger,用于每次向表customers中插入一行数据时,将用户变量str的值设置为"one customer added!"
create trigger mysql_test.customer_insert_trigger after insert on mysql_test.customers for each row set @str='one customers added';
执行完上述后,使用INSERT语句插入一行数据:
INSERT INTO mysql_test.customers VALUES
(NULL,'王华','F',DEFAULT,'长沙','芙蓉区');
验证触发器
SELECT @str;
-
删除触发器
DROP TRIGGER IF EXISTS schema_name, trigger_name
注意 :删除表的同时删除触发器,触发器不能更新或覆盖 ,只能先删除再重新创建
例题:删除数据库mysql_test中的触发器
customers_insert_trigger
DROP TRIGGER IF EXISTS mysql_test.customers_insert_trigger;
-
使用触发器
1.INSERT触发器
可引用一个名为NEW 的虚拟表,来访问被插入的行;在BEFORE INSERT触发器中,NEW中的值可更新
例题:在数据库mysql_test的表customers上重新创建触发器customers_insert_trigger,用于每次向表customers中插入一行数据,将用户变量str的值设置为新插入客户的cust_id号
USE mysql_test;
CREATE TRIGGER customers_insert_trigger AFTER INSERT
ON customers FOR EACH ROW SET @str=NEW.cust_id;
检测:
INSERT INTO customers VALUES(NULL,'曾伟','F',DEFAULT,'长沙市','芙蓉区');
SELECT @str;
题目:假设有两个表tb1和tb2,分别都只有一个字段tb1_id和tb2_id ,通过触发器实现增加tb1中的记录后自动将记录增加到tb2
题目:
CREATE TRIGGER t_afterinsert_on_tb1 AFTER INSERT ON
tb1 FOR EACH ROW
insert into tb2(tb2_id) values (NEW.tb1_id);
检测:
insert into tb1 values(1);
select * from tb1;
select * from tb2;
2.DELETE触发器
可引用一个名为OLD 的虚拟表来访问被删除的行,OLD中值全部只读不能被更新
例题:在数据库db_test的表content中创建一个触发器content_delete_trigger,用于每次当删除表content中一行数据时,将用户变量设置为"old content deleted!"
USE db_test;
CREATE TRIGGER content_delete_trigger AFTER DELETE
ON content FOR EACH ROW SET @str='old content deleted!';
题目:通过触发器实现删除tb1中的记录后自动将tb2中的记录删除
CREATE TRIGGER t_afterdelete_on_tb1 AFTER DELETE
ON tb1 FOR EACH ROW
delete from tb2 where tb2.id=old.tb1.id;
3.UPDATE 触发器 可以引用OLD 虚拟表访问以前 的数据,也可以引用NEW 虚拟表访问更新后的数据;在BEFORE UPDATE触发器中,NEW中值可更新;触发器涉及对触发表自身的更新操作时,只能使用BEFORE UPDATE触发器
例题:在mysql_test的表customers中创建一个触发器customers_update_trigger,用于每次更新表customers 时,将该表中cust_address列的值设置为cust_contact列的值
3.UPDATE触发器 USE mysql_test;
CREATE TRIGGER customers_update_trigger
BEFORE UPDATE ON customers FOR EACH ROW
SET NEW.cust_address=OLD.cust_contact;
UPDATE customers SET cust_address='武汉市'
WHERE cust_name='曾伟';
-
对触发器的进一步说明
MYSQL支持的触发器比较初级
执行是自动的
多用触发器保证数据的一致性、完整性和正确性
可使用触发器把表的更改状态及之前和之后的状态记录到另外一张数据表中
不支持CALL语句
-
总结
触发器概念
触发器种类(INSERT、DELETE、UPDATE)
创建触发器(CREATE TRIGGER...)
删除触发器(DROP TRIGGER...)
BEFORE触发器、AFTER触发器
第十章 事件!!!!!!
考核目标
了解事件的概念
掌握MYSQL中事件的使用方法
-
事件
MYSQL5.1版本起,事件开始被支持。
事件指在指定的时刻才被执行的某些特定任务,通常是一些确定的SQL 语句,通过事件调度器执行。
是临时触发器,但事件是基于特定时间周期 触发来执行任务,触发器是基于某个表所产生的事件触发。
通过以下语句查看事件调度器是否开启
SHOW VARIABLES LIKE 'EVENT_SCHEDULER';
SELECT @@EVENT_SCHEDULER;
SET GLOBAL EVENT_SCHEDULER=1;
-
创建事件
CREATE EVENT IF NOT EXISTS event_name
ON SCHEDULE schedule DO event_body
schedule:AT timestamp +INTERVAL interval...| EVERY interval **STARTS** timestamp \[+INTERVAL interval...] |
ENDS timestamp +INTERVAL interval...]
**interval:**YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE
| WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND
Schedule :时间调度,AT 子句指定时间在某个时刻发生,EVERY 子句用于表示事件在指定时间区间内每隔多长时间发生一次,其中STARTS 子句用于指定开始时间,ENDS子句用于指定结束时间
event_body :指定事件启动时执行的代码,多条语句时可使用BEGIN...END结构
例题:在数据库mysql_test中创建一个事件,用于每个月向表customers中插入一条数据,该事件开始于下个月并且在2013年12月31日结束
use mysql_test;
delimiter $$
create event event_name on schedule every 1 month starts curdate()+interval 1 month end '2013-12-31'
do begin if year(curdate())<2013 then insert into customers values(null,'戴俊','M','北京市','海淀区');end if; end $$;
题目:在数据库db_test中创建一个事件,用于每个月将表customers中姓名为"mysql初学者"的留言人所发的全部留言信息删除,该事件开始于下个月并且在2013年12月31日结束
use db_test;
delimiter $$
create event_delete_content on schedule every 1 month start curdate()+interval 1 month end '2013-12-31'
do begin if year(curdate())<2013 then delete from customers where username='MySQL初学者' ; end if; end $$;
-
修改事件
ALTER EVENT event_name ON SCHEDULE schedule
ON COMPLETION \[NOT\] PRESERVE
**RENAME TO** new_event_name
**ENABLE \| DISABLE** \| DISABLE ON SLAVE
COMMENT'comment
DO event_body
例题:临时关闭事件event_insert
alter event event_insert disable;
例题:开启临时关闭的事件event_insert
alter event event_insert enable;
例题:将event_insert的名字改为e_insert
alter event event_insert rename to e_insert;
-
删除事件
DROP EVENT IF EXISTS event_name
例题:删除名为e_insert的事件
drop event if exists e_insert;
-
总结
事件概念
事件创建(CREATE EVENT...ON SCHEDULE...DO...)
事件修改(ALTER EVENT...)
事件删除(DROP EVENT...)
第十一章 存储过程与存储函数!!!!!!
考核目标
了解MYSQL中存储函数的使用方法及其与存储过程的区别
掌握MYSQL中存储过程的使用方法
-
存储过程
存储过程是一组为了完成某特定功能的SQL语句集 ,由声明式的SQL语句(如CREATE、UPDATE等语句)和过程式SQL语句(如IF-THEN-ELSE控制结构语句)组成,经编译后存储在数据库中,用户通过存储过程名字和参数即可调用执行
优点:
增强SQL语言的功能和灵活性
良好的封装性
高性能
减少网络流量
作为安全机制来确保数据库的安全性和数据的完整性
-
创建存储过程
CREATE PROCEDURE sp_name(proc_parameter\[,...])
routine_body
sp_name:名称,避免 与MYSQL的内置函数相同
proc_parameter:参数列表,格式为
IN \| OUT(输出) \| INOUT** param_name type,多个参数间用逗号** 隔开,可以没有参数,但必须有括号 ,参数名 与列名 不能相同
routine_body:主体部分,包含过程调用时必须执行的SQL语句,以BEGIN开始,END结束,可嵌套使用BEGIN-END
DELIMITER:可将MYSQL语句的结束标志临时修改为其他符号,格式:DELIMITER $$ 需注意避免使用"\"字符
例题:将MYSQL结束符改为"!!"
delimiter !!
如想换回默认分号
delimiter ;
例题:在数据库mysql_test中创建一个存储过程,用于实现给定表customers中一个cust_id即可修改有customers中该客户性别为一个指定的性别
use mysql_test;
delimiter $$
create proedure sp_name(IN cid INT,IN csex CHAR(1))
begin
update customers SET cust_sex=csex where cust_id =cid;
end $$
-
查看存储过程
SHOW PROCEDURE STATUS
查看存储过程的具体信息
SHOW CREATE PROCEDURE sp_name
-
存储过程体
-
局部变量
DECLARE var_name,...typeDEFAULT value
例题:声明一个整型局部变量cid
DECLARE cid INT(10); 10显示的是几位数 000000000010
注意:只能在存储过程体的BEGIN...END语句块中,在存储过程体开头处声明,作用范围局限于BEGIN...END语句块,声明时前面没有使用@,不同于用户变量
-
SET语句
SET var_name=expr,var_name=expr...
例题:将之前声明的局部变量cid赋予值910
set cid=910;
-
SELECT ...INTO语句
SET col_name,... INTO var_name,... table_expr
返回的结果集只能有一行数据
-
流程控制语句
a.条件判断语句
IF search_condition THEN statement_list
**ELSEIF** search_condition **THEN** statement_list...
**ELSE** statement_list
END IF
CASE case_value
WHEN when_value THEN statement_list
**WHEN** when_value **THEN** statement_list...
**ELSE** statement_list
END CASE
CASE
WHEN search_condition THEN statement_list
**WHEN** search_condition **THEN** statement_list...
**ELSE** statement_list
END CASE
b.循环语句
begin_label:WHILE search_condition(条件为真循环) DO
statement_list
END WHILEend_label
begin_label:REPEAT statement_list
UNTIL search_condition(直到条件满足停止循环)
END REPEATend_label
begin_label:LOOP statement_list
END LOOPend_label
一直循环直到使用LEAVE 语句退出整个循环
ITERATE label 可使用在三个循环当中,退出当前循环
-
存储过程中的SELECT...INTO返回的是一行数据 ,而SELECT进行检索时返回的是一组结果集的数据行 ,通过游标来一行一行处理。
注:游标用于存储过程或存储函数 ,一个BEGIN...END 语句块中游标名字唯一,是SELECT检索出来的结果集
声明游标:
DECLARE cursor_name CURSOR FOR select_statement(检索的语句)
打开游标:
OPEN cursor_name
读取数据:
FETCH cursor_name INTO var_name,var_name...
关闭游标:
CLOSE cursor_name
例题:在数据库mysql_test中创建一个存储过程,用于计算表customers中数据行的行数
use mysql_test;
delimiter $$
create proedure sp_sumofrow(out rows IN)
begin
DECLARE cid int;
DECLARE F BOOLEAN DEFAULT TRUE;
DECLARE cur_cid CURSOR FOR SELECT cust_id FROM customers;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET F=FALSE;
SET ROWS=0;
OPEN cur_cid;
FETCH cur_cid INTO cid;
WHILE F DO
SET ROWS=ROWS+1;
FETCH cur_cid INTO cid;
END WHILE
CLOSE cur_cid;
END $$
DELIMITER ;
-
-
调用存储过程
CALL sp_sumofrow(@rows);
查看存储过程的结果
SELECT @rows;
注意:
CONTINUE HANDLER句柄用于控制循环语句,实现游标的下移
DECLARE定义顺序:局部变量,游标,句柄
-
调用存储过程
CALL sp_name(parameter (参数)\[,...])
CALL sp_name( )
例题:调用数据库mysql_test中的存储过程sp_update_sex,将cust_id为903的客户性别修改为女性'F'
CALL sp_upadte_sex(903,'F');
-
修改存储过程
ALTER PROCEDURE proc_namecharacteristic... procedure
只用于修改存储过程的某些特征 ,如需修改内容 ,需删除后重新创建
-
删除存储过程
DROP PROCEDURE IF EXISTS(是否存在)sp_name
例题:删除数据库mysql_test中的存储过程
drop procedure if exist mysql_test.sp_name;
题目:
在数据库db_test中创建一个存储过程,用于实现给定表content中一个留言人的姓名即可修改表content中该留言人的电子邮件地址为一个给定的值
USE db_test;
DELIMITER $$
CREATE PROCEDURE sp_update_email(IN user_name VARCHAR(50),IN e_mail VARCHAR(50))
begin
UPDATE content SET email=e_mail WHERE username=user_name;
END $$
检测
DELIMITER ;
CALL sp_update_email('mysql初学者','wanghua@hotmail.com);
SELECT * FROM content;
-
-
存储函数
存储过程与存储函数的区别:
存储函数不能有输出参数,存储过程可以有
直接调用存储函数不需要CALL
存储函数中必须包含RETURN语句,存储过程不允许有
-
创建存储函数
CREATE FUNCTION sp_name(func_parameter\[,...])
RETURNS type characteristic routine_body
sp_name:不能与存储过程具有相同名字
func_parameter:参数只有名称和类型 ,不能有IN、OUT、INOUT
RETURN:声明返回值的数据类型,通过type指定
routine_body:存储函数体
characteristic:COMMENT 'string'| NOT DETERMINISTIC(保证数据一致性)...
例题 :在数据库mysql_test中创建一个存储函数,要求函数能根据给定的cust_id返回客户的性别,如果数据库中没有cust_id,则返回"没有该客户"
use mysql_test;
delimiter $$
create funtion sp_name(cid int)
DECLARE SEX CHAR(5)
SELECT cust_sex INTO SEX FROM customers
WHERE cust_id=cid;
IF SEX IS NULL THEN
RETURN(SELECT '没有该客户');
ELSE IF SEX='F' THEN
RETURN(SELECT '女'); ELSE RETURN(SELECT '男');
END IF;
END IF;
end $$
delimiter;
注意:
RETURN返回包含SELECT语句时,SELECT返回结果只能是一行且只能有一列值。
查看数据库中存在哪些存储函数:
SHOW FUNCTION STATUS
查看数据库中某个具体的存储函数:
SHOW CREATE FUNCION sp_name
-
调用存储函数
SELECT sp_name(func_parameter\[,...])
例题:调用数据库mysql_test中的存储函数fn_search
select mysql_test.fn_search;
-
删除存储函数
DROP FUNCTION IF EXISTSsp_name
例题:删除数据库mysql_test中的存储函数fn_search
drop function if exists fn_search;
-
修改存储函数
ALTER FUNCTION func_namecharcteristic...
只修改存储函数的特征,如若要修改存储函数内容,则需要删除后重新创建
-
-
总结
存储过程(概念,优点)
存储过程创建
(局部变量声明DECLARE...,局部变量赋值SET...,SELECT...INTO...,
条件判断语句IF-THEN-ELSE和CASE,
循环语句WHILE、REPEAT、LOOP语句,
游标概念,声明游标DECLARE ...CURSOR FOR...,打开游标OPEN...,读取数据FETCH...INTO...,关闭游标CLOSE...)(DELIMITER...)(CREATE PROCEDURE...)
存储过程的调用和删除(CALL...)(DROP...)
第十二章 访问控制与安全管理
考核目标
掌握MYSQL数据库中数据访问的安全控制机制
-
用户账号管理
MYSQL中的用户账号及相关信息都存储在一个名为mysql的MYSQL数据库中,user表中user列存储用户名
SELECT user FROM mysql.user;
root对整个MYSQL服务器具有完全控制的权限
-
创建用户账号
CREATE USER user_specification,user_specification...
user_specification:user[
IDENTIFIED BY PASSWORD'password'|(identified by)
IDENTIFIED WITH auth_pluginAS'auth_string' (identified with)
user:格式为'user_name'@'host_name',如果没给出主机名默认主机"%"
IDENTIFIED BY子句:指定账号对应口令
PASSWORD:用于指定散列口令(对密码进行加密运算的数值)
password:指定账号口令,由字母和数字组成的明文
例题:在MYSQL服务器中添加两个新的用户,其用户名分别为zhangsan和lisi,它们的主机名均为localhost,用户zhangsan的口令设置为明文123,用户lisi的口令设置为对明文456使用PASSWORD( )函数返回的散列值
SELECT PASSWORD(456);
CREATE USER 'zhangsan'@'loclhost'IDETIFIED BY '123',
'lisi'@'localhost'IDENTIFIED BY PASSWORD '*531E182E2F72080AB0740FE2F2D689DBE0146E04';
说明:
使用CREATE USER 语句,必须具有mysql数据库的INSERT权限 或全局CREATE USER权限;
创建用户后,mysql中的user表添加一条新记录;
如果两用户同名不同主机 ,会视为不同用户;
如果没为用户指定口令,可以不使用口令登录系统,但是不安全;
新建用户的权限很少。
-
删除用户
DROP USER user,user...
例题:删除前面创建的用户lisi
drop user lisi@localhost;
说明:
使用DROP USER 语句,必须具有mysql数据库的DELETE权限或
全局CREATE USER权限;
使用DROP USER 语句时,没有明确给出账户主机名,会默认%;
删除用户不会影响他们建的表等其他数据库对象。
-
修改用户账号
RENAME USER old_ user TO new_user ,old_user TO new_user...
例题:将前例中的用户zhangsan的名字改为wangwu
rename user 'zhangsan'@'localhost' to 'wangwu'@'localhost';
-
修改用户口令
SET PASSWORDFOR user={PASSWORD('new_password')|'encrypted password'}
例题:将前例中wangwu的口令修改成明文'hello'对应的散列值
SELECT PASSWORD('hello');
看见图文的散列值后
set password for 'wangwu'@'localhost' ='*6BF89A54E2D27ECD7E8DA05B4AB8FD9D1D8119';
-
-
账户权限管理
SHOW GRANTS FOR 'wangwu'@'localhost';
!!!!!!!!!
-
权限的授予
GRANT priv_type(column_list) ,priv_type\[(column_list)]...
ON object_typepriv_level TO user_specification,user_specification...**WITH** with_option...
priv_type:指定权限的名称,如SELECT、UPDATE、DELETE等
object_type:包括TABLE、FUNCTION、PROCEDURE
priv_level:列权限、表权限、数据库权限、用户权限
、 .、db_name.、db_name.tbl_name、tbl_name、
db_name.routine_name
TO 子句:设定用户口令 及指定被授予权限的用户 、创建用户账号
WITH 子句:用于实现权限的转移或限制
例题:授予用户wangwu在数据库mysql_test的表customers上拥有对列cust_id和列cust_name的SELECT权限
grant select(cust_id,cust_name) on mysql_test.customers to 'wangwu'@'localhost';
例题:创建两个用户liming和huang,并设置对应登录口令,授予他们在数据库mysql_test的表customers上拥有SELECT和UPDATE权限
grant select,update on mysql_test.customers to 'liming'@'localhost' identified by '123','
huang'@'localhost' identified by'789';
例题:授予系统中已存在用户wangwu可以在数据库存mysql_test中执行所有数据库操作的权限
grant all on mysql_test.* to 'wangwu'@'localhost';
例题:授予系统上wangwu拥有创建用户的权限
GRANT CREATE USER ON * .* TO 'wangwu'@'localhost';
-
-
权限的转移与限制
-
转移权限
WITH GRANT OPTION
例题:授予当前不存在的用户zhou在数据库mysql_test的表customers上拥有SELECT和UPDATE的权限,口令为123,并允许其可以将自身的这个权限授予其他用户
grant select,update on mysql_test.customers to 'zhou'@'localhost' identified by '123' with grant opition;
-
限制权限
MAX_ QUERIES _PER_HOUR count:限制每小时可以查询数据库的次数 queries
MAX_ UPDATES _PER_HOUR count:限制每小时可以修改数据库的次数 updates
MAX_ CONNETCTIONS _PER_HOUR count:限制每小时可以连接数据库的次数 connetctions
MAX_USER_CONNECTIOS count:限制同时连接MYSQL的最大用户数 use_connectios
例题:授予系统中的用户huang在数据库mysql_test的表customers上每小时只能处理一条DELETE语句的权限
grant delete on mysql_test.customers to 'huang'@'localhost' with max_queries_per_hour count 1;
-
权限的撤销
REVOKE priv_type(column_list) ON object_typepriv_level
FROM user,user...
REVOKE ALL PRIVILEGES,GRANT OPTION FROM user,user... (撤销用户的所有权限)
例题:回收系统中用户zhou在数据库mysql_test的表customers上的SELECT权限
revoke select on mysql_testcustomers from 'zhou'@'localhost' ;
-
-
总结
创建用户账号(CREATE USER...IDENTIFIED BY ...)、删除用户(DROP USER...)、修改用户账号(RENAME USER...TO...)、修改用户口令(SET PASSWORD FOR....)
权限的授予与转移(GRANT... ON...TO...IDENTIFIED BY...WITH GRANT OPTION)
权限的限制(WITH MAX*...*PER_HOUR)
权限的撤销(REVOKE...ON...FROM...)
第十三章 备份与恢复
考核目标
掌握MYSQL数据库的备份与恢复方法
运用SQL语句实现MYSQL数据库中数据的导入和导出
-
数据库备份与恢复
造成数据库中数据丢失的因素:
计算机硬件故障
计算机软件故障
病毒
人为误操作
自然灾害
盗窃
面对以上可能的因素造成的数据丢失或被破坏的风险,数据库系统提供了备份和恢复策略 来保证数据库中数据的可靠性和完整性
备份 是指通过导出数据或者拷贝表文件 的方式来制作数据库的副本,恢复则是当数据库出现故障或遭到破坏时,将备份的数据库加载到系统。
-
MYSQL数据库备份与恢复的方法
-
使用SQL语句备份和恢复表数据
-
SELECT INTO...OUTFILE语句(select into outfile)(把数据导出到文件的语句)
SELECT *(select表语句) INTO OUTFILE 'file_name'export_options(常用) | INTO DUMPFILE 'file_name'
Export_options:(导出选项)
FIELDS \[TERMINATED BY 'string' fields twrminated by 'string'(字段用什么分隔开)
\[OPTIONALLY ENCLOSED BY 'char'] optionally enclosed by 'char'(导出的字符是放到什么符号包起来)
ESCAPED BY 'char'] escaped by 'char'(我的转义字符是什么,例如\n 表空值,把转义字符改成*,则 *n)
LINES TERMINATED BY 'string' lines terminated by 'string'(每一行以什么字符结束)
如不指定FIELDS(fields)和LINES子句,默认声明如下
FIELDS TERMINATED BY '\t' ENCLOSED BY ''
ESCAPED BY '\' LINES TERMINATED BY '\n'
-
LOAD DATA...INFILE语句(将文件读回来)
LOAD DATA INFILE 'file_name.txt' REPLACE(若主键有冲突,则导回来的数据替代原有数据) \| IGNORE(忽略) INTO TABLE tbl_name
**FIELDS** \[TERMINATED BY 'string'
\[OPTIONALLY\] ENCLOSED BY 'char'
ESCAPED BY 'char'\]
**LINES** \[STARTING BY 'string'
TERMINATED BY 'string'\]\] \[IGNORE number LINES
(col_name_or_user_var,...)\] \[SET col_name=expr,...
例题:备份数据库mysql_test中表customers的全部数据到C盘的BACKUP目录下一个名为backupfile.txt文件中,要求字段值如果是字符则用双引号标注,字段值之间用逗号隔开,每行以问号为结束标志。然后,将备份后的数据导入到一个和 customers表结构相同的空表customers_copy中
-
select * from mysql_test.customers
into outfile 'C:/BACKUP/backupfile.txt'
fields terminated by ','
optionally enclosed by '"'
line terminated by '?';
-
use mysql_test;
CREATE TABLE customers_copy
like(用这个只能复制他的表结构,内容没有复制到)(as(复制结构和内容)) customers;
load data infile 'C:/BACKUP/backupfile.txt'
into table mysql_test.customers_copy
fields terminated by ','
optionally enclosed by '"'
line terminated by '?';
注意:多用户 操作数据库时,为了得到一致备份,需在指定表上使用LOCK TABLES tbl_name READ读锁定 ,恢复数据时则需要使用LOCK TABLES tbl_name WRITE写锁定 ,在数据库备份与恢复完毕之后使用UNLOCK TABLES解锁
-
-
-
使用MYSQL客户端应用程序备份和恢复数据(备份是> 恢复是<)
-
开始程序-命令提示符
CD C:\Program Files\MySQL\MySQL Server 5.5\bin
通过客户端应用程序mysqldump实现MYSQL数据库的备份,除了导出表数据文件还包含数据库中表结构的SQL语句
-
备份表:
mysqldumpOPTIONS database tables > filename
database:若没有指定表名,则备份整个数据库
filename:默认路径是bin目录
-h(主机) ... -u(用户名) ... -p(密码)password (在备份表时,必须连接了数据库才能进行)
例题:使用mysqldump备份数据库mysql_test中的表customers
mysqldump --h localhost --u root --p123456 mysql_test customers > c:\BACKUP\file.sql;(要确保backup存在)
-
备份数据库
mysqldump --databases DB1 DB2 DB3... > filename(数据库空格隔开即可)
例题:备份数据库mysql_test和数据库mysql到C盘BACKUP目录下
mysqldump-u root-p123456 --databases mysql_test mysql> C:\BACKUP\file.sql
-
备份整个数据库
-
mysqldump --all-databases > filename
例题:备份MYSQL服务器上所有数据库
mysqldump-u root-p123456 --all-databases>C:\BACKUP\file.sql
-
在mysqldump中通过**--tab=分开数据和创建表的SQL语句** ,不能与**--databases或--all-databases**同时使用,且mysqldump必须运行在服务器主机上
例题:将数据库mysql_test中所有表的表结构和数据分别备份到C盘的BACKUP目录
mysqldump --u root --p123456 --tab=c:\BACKUP\ mysqltest;
生成customers.txt、customers.sql、customers_copy.txt和customers_copy.sql四个文件
-
-
-
使用MYSQL命令恢复数据
例题:用mysql_test的备份文件mysql_test.sql将其恢复
mysql --u root --p123456 mysql_test **<**c:\BACKUP\mysql_test.sql;
注意:数据库中必须存在mysql_test
例题:假设数据库mysql_test中表customers的表结构被损坏,试将存储表customers结构的备份文件customers.sql恢复到服务器
USE mysql_test;
source c:\BACKUP\customers.sql;
使用mysqlimport程序恢复数据
mysqlimport database textfile...
例题:将C盘BACKUP目录下的customers.txt文件恢复到数据库mysql_test的表customers中
mysqlimport --u root --p123456 --low-priority(优先级) --sreplace(有重复值会进行覆盖) mysql_test c:\BACKUP\customers.txt
-
直接复制
(1)暂时关闭MYSQL服务器
(2)复制对应的文件目录上所有的表文件
(3)重启服务器
把这些文件拷贝到另外一个MYSQL服务器的数据库目录下即可
注意:两个服务器的MYSQL版本必须相同或兼容
两个服务器必须硬件结构相同或相似(电脑型号)
-
-
二进制日志文件的使用
-
开启日志文件
(1)打开MYSQL安装目录下的my.ini文件
(2)找到mysqld标签,在下面添加
log-bin=filename
log-bin=c:/Program Files/MySQL Server 5.5/bin/bin_log
(3)保存修改,重启MYSQL服务器,可在MYSQL的DATA文件夹下看到两个文件:filename.数字编号,filename.index
-
使用mysqlbinlog实用工具处理日志
(1)查看二进制日志文件
mysqlbinlog log_files...
mysqlbinlog bin-log.000001
mysqlbinlog bing-log.000001 > c:\BACKUP\bin_log000001.txt
(2)使用二进制日志恢复数据
mysqlbinlog log_files... | mysql
例题:假设系统管理员在本周一下午五点公司下班前 ,使用mysqldump工具进行了数据库mysql_test的一个完全备份 ,备份文件为alldata.sql ,接着,从本周一下午五点 开始启用日志,bin_log.000001 文件保存了从本周一下午五点到本周三上午九点的所有更改信息,在本周三上午九点运行一条日志刷新语句 ,即FLUSH LOGS ,此时系统自动创建一个新的二进制日志文件bin_log.000002 ,直至本周五上午十点公司数据库服务器系统崩溃 ,现要求公司数据库恢复到本周五上午十点系统崩溃之前的状态
(1)恢复到本周一下午五点之前的状态
mysql-u root-p123456 mysql_test < C:\BACKUP\alldata.sql;
(2)使用mysqlbinlog将数据库恢复到周三上午九点之前的状态
mysqlbinlog bin_log.000001 | mysql-u root-p123456
(3)使用mysqlbinlog将数据库恢复到周五上午十点之前的状态
mysqlbinlog bin_log.0000002 | mysql-u root-p123456
-
清除所有日志文件:
RESET MASTER;
删除部分日志文件:
PURGE {MASTER | BINARY} LOGS TO 'log_name'
PRRGE {MASTER | BINARY} LOGS BEFORE 'date'
-
-
总结
数据库备份与恢复的概念、原因
数据库备份与恢复的方法(SQL语句SELECT INTO...OUTFILE、LOAD DATA...INFILE)、(MYSQL客户端应用程序mysqldump、mysql、mysqlimport)、(MYSQL图形界面工具)、(直接复制)
二进制日志文件包含所有数据库更新,在my.ini中log-bin中开启(mysqlbinlog)
第十四章PHP的MYSQL数据库编程
考核目标
熟悉使用PHP语言进行MYSQL数据库编程的相关知识
-
PHP概述
PHP是一种服务器端执行 的嵌入HTML文档的脚本/编程语言 ,是当前世界上最流行的构建B/S模式WEB应用程序的编程语言之一。可无缝运行在UNIX和WINDOWS平台,目前WEB应用开发的流行组合为PHP搭配MYSQL。
本章内容以WAMP作为应用平台环境
WINDOWS+APACHE+MYSQL+PHP
-
PHP编程基础
网页显示hello
<html> <head></head> <body> <?php $string(变量)=“hello”; echo $string; ?> </body> </html> -
使用PHP进行MYSQL数据库编程
PHP内置了许多函数,同时为了在PHP程序中实现对MYSQL数据库的各种操作,应在PHP的配置文件php.ini中将extension=php_mysql.dll前的分号去掉,并重启WEB服务器
1.编程步骤
(1)与MYSQL数据库服务器建立连接
(2)选择 对其进行操作的数据库
(3)执行 相应的数据库操作,如添加、删除、修改和查询等
(4)关闭 与MYSQL数据库服务器的连接
均通过PHP5内置函数库mysql中的相应函数完成
2.建立与MYSQL数据库服务器的连接
(1)使用函数mysql_connect()建立非持久连接
mysql_connect(servername(主机名)\[,username\[,password]])
servername:默认值localhost:3306
username:默认值root
password:默认值空串
执行成功返回一个连接标识号,否则FALSE
例题:编写connect.php,要求以超级用户root及其密码123456连接本地主机中的MYSQL数据库服务器,使用$con保存连接结果
<?php $con=mysql_connect("localhost:3306","root","p123456"); if(!$con) {echo “连接失败!<br>”; echo “错误编号:”.mysql_errno( ).”<br>”; //数据库出错的编号的一个函数 echo “错误信息:”.mysql_error( ).”<br>”; die(); //中止这个程序的运行 } echo “连接成功!<br>”; ?>(2)使用函数mysql_pconnect() 建立持久连接
mysql_pconnect(servername\[,username\[password]])
此函数与mysql_connect的区别:
mysql_connect()建立的连接在数据库操作结束后自动关闭 ,而mysql_pconnect()建立的连接会一直存在;
mysql_pconnect()每次连接前都会检查 是否使用同样的servername、username、password ,如果是则直接用上次的连接;
mysql_connect()建立的连接用mysql_close()关闭 ,而mysql_pconnect( )则不能。
例题:编写pconnect.php,通过mysql_pconnect()以root用户及其密码123456连接本地主机中的数据库服务器
<?php $server=“localhost:3306”; $user=“root”; $pwd=“123456”; $con=mysql_pconnect($server,$user,$pwd); If(!$con) {die(“连接失败!”.mysql_error( ));} echo “MYSQL服务器:$server<br>用户名:$user<br>”; echo “使用函数mysql_pconnect( )永久连接数据库<br>”; ?>3.选择数据库
mysql_select_db(database,connection)
例题:编写selectdb.php,要求选定数据库mysql_test作为当前工作数据库
<?php $con=mysql_connect("localhost:3306","root","123456") if(mysql_errno()){ echo "数据库连接失败<br>"; die(); } mysql_select_db("mysql_test",$con); if(mysql_errno()){ echo "数据库选择失败<br>"; die(); } echo"数据库选择成功<br>"; ?>4.执行数据库操作
mysql_query(query,connection)
(1)数据的添加
将insert 语句置于函数mysql_query中
例题:编写insert.php,要求可向数据库mysql_test的表customers添加一个名为"李中华"的客户的全部信息
<?php $con=mysql_connect(“localhost:3306”,“root”,“123456”) or die(“数据库服务器连接失败!<br>”); mysql_select_db(“mysql_test”,$con) or die(“数据库服务器连接失败!<br>”); mysql_query(“set names ‘gbk’”); $sql=“INSERT INTO customers(cust_id,cust_name,cust_sex,cust_address,cust_contact)”; $sql=$sql.”VALUES(NULL,‘李中华’,‘M’,‘深圳市’,‘南山区’)“; If(mysql_query($sql,$con)) echo “客户添加成功!<br>”; else echo “客户添加失败!<br>”; ?>(2)数据的修改
将update语句置于函数mysql_query()中实现对数据库表中修改数据
例题:编写update.php,可将数据库存mysql_test的表customers中一个名为"李中华"的客户的地址修改为"广州市"
<?php $con=mysql_connect("localhost:3306","root","123456") or die("数据库连接失败<br>"); mysql_select_db("mysql_test",$con) or die("数据库选择失败<br>"); mysql_query(“set names ‘gbk’”); $sql="update customers set cust_address='广州市'"; $sql=$sql."where cust_name='李中华'"; if(mysql_query($sql,$con)) echo "客户信息修改成功<br>"; else echo "客户信息修改失败<br>"; ?>(3)数据的删除
将DELETE 语句置于函数**mysql_query()**中实现将数据库表中的指定数据删除
例题:编写delete.php,将数据库mysql_test的表customers中一个名为"李中华"的客户信息删除
<?php $con=mysql_connect("localhost:3306","root","123456") or die("数据库连接失败<br>"); mysql_select_db("mysql_test",$con); mysql_query("set names 'gbk'"); $sql="delete from mysql_test"; $sql=$sql."where cust_name='李中华'"; if(mysql_query($sql,$con)) echo "客户信息删除成功<br>"; else echo "客户信息删除失败<br>"; ?>(4)数据的查询
将SELECT 语句置于函数**mysql_query()**中,实现在选定的数据库表中查询数据
a.读取结果集中的记录
mysql_fetch_array(data,array_type )
mysql_fetch_row(data)
mysql_fetch_assoc(data)
data:指向mysql_query()产生的结果集的数据指针
Array_type:整型,指定函数返回值的形式 ,有效值为MYSQL_NUM(数字数组)(通过数组来读的 等同于上面的第二种)、MYSQL_ASSOC(关联数组)(通过字段来读的 等同于上面的第三种)、MYSQL_BOTH()(两者都行)
例题:编写select.php,要求在数据库mysql_test的表customers中查询cust_id为903的客户的姓名
<?php $con=mysql_connect("localhost:3306","root","123456") or die("数据库连接失败<br>"); mysql_select_db("mysql_test",$con) or die("数据库选择失败<br>"); mysql_query("set name'gbk'"); $sql="select cust_name from customers"; $sql=$sql."where cust_id=903"; $result=mysql_query($sql,$con);//放了id903的数据 只是指向数据的指针 if($result) //判断是否有值 {echo "客户信息查询成功<br>"; $array=mysql_fetch_array($result,MYSQL_NUM); //通过$array显示读取id为903的数据 if($array) {echo “读取到客户信息!<br>”; echo “所要查询客户的姓名是:”.$array[0]; } else echo “没有读取到客户信息!<br>”; } else echo “客户查询失败!<br>”; ?>b.读取结果集中的记录数
mysql_num_rows(data)
例题:编写num.php,要求在数据库mysql_test的表customers中查询女客户的人数
<?php $con=mysql_connect("localhost:3306","root","123456") or die("数据库连接失败<br>"); mysql_select_bd("mysql_test",$con) or die("数据库选择失败"); mysql_puery("set name'gbk'"); //设置字符集gbk $sql="select * from customers"; $sql=$sql."where cust_sex='F'"; $result=mysql_query($sql,$con); if($result){ echo "查询成功!<br>"; $num=mysql_num_rows($result); echo "数据库mysql_test中女性客户人数为:".$num."位"; } else echo "查询失败!<br>"; ?>c.读取指定记录号的记录(移动指针 指向需要的内容)
mysql_data_seek(data,row)
例题:编写seek.php,要求在数据库mysql_test的表customers中查询第三位女性客户的姓名
<?php $con=mysql_connect("localhost:3306","root","123456") or die("数据库连接失败<br>"); mysql_select_db("mysql_test",$con) or die("数据库选择失败<br>"); mysql_query("set name 'gbk'"); $sql="select * from customers"; $sql=$sql."where cust_sex='F'"; $result=mysql_query($sql,$con); if($result){ echo "用户信息查询成功<br>" if(mysql_data_row($result,2)){ {$array=mysql_fetch_array($result,MYSQL_NUM); echo “数据库mysql_test中第3位女性客户 :”.$array[1];(array里面的数字是看列值顺序的) }else echo “记录定位失败!<br>”; } else echo "查询失败!<br>"; ?>5.关闭与数据库服务器的连接
使用**mysql_close()**来关闭由mysql_connect()建立的非持久连接
mysql_close(connection)
例题:编写close.php
<?php $con=mysql_connect("localhost:3306","root","123456") or die("数据库连接失败<br>"); echo "数据库连接成功<br>"; mysql_select_db("mysql_test",$con) or die("数据库选择失败!<br>"); echo"数据库选择成功<br>"; mysql_close($con) or die("关闭与MYSQL数据库服务器的连接失败!<br>"); echo "已成功闭关与MYSQL数据库服务器的连接!<br>"; ?> -
总结
php脚本语言与其编程基础<?php...?>
PHP编程步骤(建立连接、选择数据库、执行数据库操作、关闭数据库)
常用函数(mysql_connect(),mysql_pconnect(),mysql_select_db(),mysql_query(),
mysql_fetch_array(),mysql_num_rows(),
mysql_data_seek(),mysql_close()
第十五章
考核目标
初步具备使用PHP语言开发简单MYSQL应用系统的能力
-
需求描述
用户管理系统(或模块)主要负责管理与维护本系统内部所有用户的个人基本信息以及每个用户在系统中所具备的操作权限。
-
系统分析与设计
-
数据库设计与实现
1对多 1对1一般是一个实体一张表
而 多对多 上图所示,为防止数据冗余,用户组和权限需要3张表
具体实现见操作
-
系统实现
-
总结
PHP语言开发MYSQL应用系统的过程(需求描述、系统分析与设计、数据库设计与实现、系统功能实现等)
第十六章
考核目标
-
考试系统使用说明
考试环境:
PC兼容机,硬盘剩余空间10GB以上
操作系统:中文版WINDOWS 7
应用软件:WAMP5_1.7.4(MYSQL数据库密码为空)
考试时间:
120分钟
系统自动计时,提前5分钟自动报警提醒考生及时存盘
到时系统自动锁定
考试题型及分值:
选择题40分
基本操作题25分(select语句 怎么修改数据 怎么查询添加数据 怎么建表)
简单应用题20分(存储过程 触发器 事件 过程语句)
综合应用题15分(php的操作题目)
-
考试系统的使用
步骤如下:
开机,双击桌面上的"无纸化考试系统"图标,考试系统将显示登录界面。
输入准考证号后点击"登录",如正确则显示对应的身份证号和姓名,"开始考试 "和" 重输考号 "按钮
抽取题目后,屏幕上会显示考试须知,只有在勾选了"已阅读"前面的小方块后,才可开始答题计时。
注意:
答题确保在考生文件夹下进行,可自由选择答题顺序。
选择题作答时,须使用鼠标,只能进入一次。
考试进行中不得随意关机。
抽取题目后,考试系统将在屏幕中间显示考试窗口,并在屏幕顶部显示考生的准考证号、姓名、考试剩余时间 、交卷。
考试窗口中显示"选择题","基本操作题","简单应用题","综合应用题"。
当选择**"基本操作题"和"简单应用题"** 时,请考生在"答题"菜单上选择"MYSQL console"项进入MYSQL数据库管理窗口
当选择"综合应用题"时,请考生在"答题"菜单上选择**"Localhost"**项
注意:
考生登录成功后,自动产生一个考生考试文件夹,不能随意删除,操作也不能脱离这个文件夹。
假设考生的准考证号是6337999999010001,则考生文件夹为C:\Wexam\63010001
注意:MySQL语句可以不区分大小写,但是路径一定要区分大小写