MySQL
- 数据库概述
1.1 数据管理技术的发展
人工管理阶段:20世纪50年代中期之前
文件系统阶段:20世纪50年代末~60年代中
缺点:数据冗余(重复)
数据不一致
数据联系弱
数据库阶段:
数据库技术诞生的标志性事件:
1968年,IBM 推出了 层次型数据库产品 IMS
1969年,DBTG 发布了一系列报告(数据库及其操作环境的标准的规范)
1970年,IBM 研究人员 E.F.Codd(科德) 发表了大量论文,首次提出关系型数据库的概念。
特点:采用复杂的结构化的数据模型
控制功能:并发控制、数据库的恢复、
数据的完整性(实体完整性、域完整性、引用完整性、自定义完整性)
安全性
系统更为灵活
信息处理方式不再以程序为中心,而是以数据为中心
1.2 几个术语
数据(data):数据库中存储的基本对象,包括文字、图形、图像、声音等
数据库(Database):长期存储在计算机内,有组织、可共享的大量数据的集合。
数据库管理系统(DBMS):是位于操作系统和用户之间的一层数据库管理软件。科学的组织和存储数据、高效的获取和维护数据。
数据库系统(DBS)
数据库管理员(DBA)
1.3 主流的关系型数据库产品
层次型、网状、关系型、非关系型
关系型:使用二维表保存数据
商业型:
Oracle 甲骨文
DB2 IBM
SQL Server 微软
开源:
MySQL 甲骨文 (2009 甲骨文收购sun公司)
sun (2008 sun 收购 瑞典 MySQL AB)
1.4 SQL语言
SQL(Structured Query Language):结构化查询语言
SQL是在关系型数据库上执行数据操作、检索及其维护所使用的一种标准语言,可以用来查询数据、操作数据、定义数据、控制数据等。
SQL分为:
数据查询语句(DQL): select
用来查询所需要的数据 使用最广泛、语法最复杂
数据操作语句(DML): insert update delete
用于改变数据库表中的数据
数据定义语句(DDL): create alter drop
用于创建、修改、删除数据库对象
事务控制语句(TCL): commit、roolback、savepoint
用来维护数据库中数据的一致性
数据控制语句(DCL): create user、grant、revoke
用于执行用户的创建、权限的授予和回收等
- MySQL基础知识
2.1 MySQL的特点
- 性能高效
- 跨平台支持
- 简单易用
- 开源
- 支持多用户
2.2 启动和停止服务 - 启动
service mysql start - 重启
service mysql restart - 停止服务
service mysql stop
2.3 连接MySQL服务器 - 语法
mysql [-h host] [-u username] [-p[pwd]] [dbname] [-P port]
其中:
host: 要连接的服务器的IP地址或主机名
如果连接本机,可以省略 或 localhost 或 127.0.0.1
username: 登录名
pwd: 密码 注意:密码和-p之间没有空格
dbname: 数据库名
port: 端口号 默认为3306 - 示例
本地连接:
mysql -u root -p
mysql -h localhost -u root -p
mysql -u root -ptarena – 不建议密码写到命令行
~~~~ ~~~~~~
登录名 密码
mysql -u root -p -P 3306
mysql -u root -p sys
~~~
数据库名
远程连接:
mysql -h 172.40.91.124 -u root -p
2.4 MySQL数据库管理
2.4.1 创建数据库
- 语法
create database 数据库名; - 示例
创建"选课系统"数据库
create database choose;
单行注释:
– 注意–后面必须有一个空格
#
多行注释: /* 注释内容 */
2.4.2 查看数据库
- 查看所有数据库的名字
– 语法
show databases; - 显示数据库结构
– 语法
show create database 数据库名;
– 示例
show create database choose;
2.4.3 选择当前数据库
– 语法
use 数据库名;
– 示例
use choose;
2.4.4 删除数据库
– 语法
drop database 数据库名;
– 示例
drop database choose;
2.5 MySQL表管理
2.5.1 创建数据库表
- 语法
create table 表名(
字段名1 数据类型,
…
字段名n 数据类型
); - 示例
– 创建数据库 choose
create database choose;
– 选择当前数据库
use choose;
– 创建表
create table my_table(
id int,
name char(10)
);
2.5.2 查看表 - 显示当前数据库中的所有表
show tables; - 查看指定表的详细信息
show create table 表名;
– 示例
show create table my_table; - 查看指定表的表结构
desc[ribe] 表名;
– 示例
desc my_table;
2.5.3 删除表 - 语法
drop table 表名; - 示例
drop table my_table;
- MySQL表结构的管理
3.1 MySQL的数据类型
3.1.1 数值类型- 整数
tinyint 1字节
smallint 2字节
mediumint 3字节
int 4字节
bigint 8字节
如果需要使用无符号整数,在数据类型后加 unsigned
如: age tinyint unsigned - 小数
精确小数:
decimal(len,p)
如:salary decimal(7,2) -99999.99~99999.99
浮点数:
float: 4字节
double: 8字节
3.1.2 字符串
char(n) 定长字符串 n值最大255
varchar(n) 变长字符串 n的取值范围和字符集有关
3.1.3 日期和时间
date: 3字节 ‘1000-01-01’~‘9999-12-31’ YYYY-MM-DD
time: 3字节 ‘-838:59:59’~‘838:59:59’ HH:II:SS
datetime: 8字节 ‘1000-01-01 00:00:00’
~‘9999-12-31 23:59:29’
- 整数
3.2 创建表
3.2.1 语法
create table 表名(
字段名1 数据类型 [约束条件],
…
字段名n 数据类型 [约束条件]
[,其他约束]
)[其他选项(引擎 默认的字符集等)];
3.2.2 约束的类型
- 主键约束 primary key
非空、唯一
一个表中只能有一个主键 - 唯一约束 unique
唯一(不允许重复) - 非空约束 not null
- 默认约束 default
- 检查约束 check – 目前MySQL不支持
age int check(age>=15 and age<=50) - 外键约束 foreign keyinsert into student values(‘2017001’,‘张三’,‘123456789’);
references
3.3 约束的实施
3.3.1 主键约束
– 以学生表为例,设置学号为主键
create table student(
stu_no char(11) primary key,
stu_name char(10)
);
– 测试
insert into student values(‘2017001’,‘张三’);
#错误 主键字段的值不允许重复
insert into student values(‘2017001’,‘李四’);
#错误 主键字段的值不允许为null
insert into student values(null,‘张三’);
#错误 一个表中只能有一个主键
create table exam(
exam_date date primary key,
exam_address char(10) primary key,
course_name char(20)
);
– 复合键(组合键)
create table exam(
exam_date date,
exam_address char(10),
course_name char(20),
primary key(exam_date,exam_address)
);
insert into exam values(‘2019-01-04’,‘一教室’,‘高数’);
insert into exam values(‘2019-01-04’,‘阶教一’,‘马克思’);
insert into exam values(‘2019-01-05’,‘阶教一’,‘英语’);
#错误
insert into exam values(‘2019-01-05’,‘阶教一’,‘线代’);
3.3.2 唯一约束
– 学生表中增加身份证号字段,并设置为唯一
drop table student;
create table student(
stu_no char(11) primary key,
name char(10),
uid char(20) unique
);
– 测试
insert into student values(‘2017001’,‘张三’,‘123456789’);
#错误 唯一字段的值不允许重复
insert into student values(‘2017002’,‘李四’,‘123456789’);
– 正确 唯一字段的值允许为null,并且null可以有多个
insert into student values(‘2017003’,‘王五’,null);
insert into student values(‘2017004’,‘赵六’,null);
3.3.3 非空约束
– 学生表 姓名字段设置为非空
drop table student;
create table student(
stu_no char(11) primary key,
stu_name char(10) not null
);
– 测试
#错误 非空字段不允许为null
insert into student values(‘2017001’,null);
3.3.4 默认约束
– 学生表 增加班级字段,并且设置默认约束
drop table student;
create table student(
stu_no char(11) primary key,
stu_name char(10) not null,
class_name char(20) default ‘csd1902’
);
– 测试
– 使用默认值
insert into student values(‘2017001’,‘张三’,default);
insert into student(stu_no,stu_name)
values(‘2017002’,‘李四’);
– 不使用默认值
insert into student values(‘2017003’,‘王五’,‘csd1812’);
insert into student values(‘2017004’,‘赵六’,null);
一个字段设置多种约束,顺序任意
如: 字段名 数据类型 not null unique
或
字段名 数据类型 unique not null
3.3.5 外键约束
-
概念
外键约束用于定义表之间的关系
主表(父表) :提供数据的表
从表(子表) : 外键所在的表
外键字段的值必须来自于主表中的对应字段 或者为空 -
语法
constraint 约束名 foreign key(外键字段)
references 主表(字段)
外键引用的主表中的字段必须是唯一性字段,一般使用主键 -
示例
学生表:学号、姓名、班级编号
班级表:班级编号 班级名称
drop table student;
– 创建表 (先创建主表,然后再创建从表)
create table classes(
c_no int primary key,
c_name char(20)
);
create table student(
stu_no char(11) primary key,
stu_name char(10) not null,
c_no int,
constraint classes_student_fk foreign key(c_no)
references classes(c_no)
);
– 测试
– 向主表中插入测试数据
insert into classes values(1,‘csd1902’);
insert into classes values(2,‘csd1903’);
– 向从表中写入数据
insert into student values(‘2017001’,‘张三’,1);
insert into student values(‘2017002’,‘李四’,2);
insert into student values(‘2017003’,‘王五’,null);
#错误 违反了外键约束,主表中不存在班号为3的数据
insert into student values(‘2017004’,‘赵六’,3);
-- 删除表 先删除从表 再删除主表
drop table student;
drop table classes;
3.4 设置自增长字段
- 语法
字段名 数据类型 auto_increment
自增长字段的数据类型必须是整型,并且设置为主键 - 示例
– 创建班级表,设置班号为自增长
create table classes(
c_no int auto_increment primary key,
c_name char(20) not null
);
– 向表中写入数据
insert into classes values(null,‘csd1902’);
insert into classes(c_name) values(‘csd1903’);
3.5 创建"选课系统"数据库