c++ 数据库基础 MySQL
数据库概述
数据管理技术的发展 人工管理阶段: 20世纪50年代中期 文件系统阶段: 20世纪50年代末~60年代中 缺点: 数据冗余 数据不一致 数据联系若
数据库阶段: 20世纪60年代末~至今 三大标志性事件: 1968年,IBM 推出基于层次模型的数据库系统 IMS 1969年,DBTG 发布了一系列报告 数据库和数据库的环境的标准的规范 1970年,IBM 研究院 E.F.Codd发表论文,首次提出关系模型的概念
特点: 采用复杂的结构化的数据模型 最低的冗余度 较高的数据完整性 多个方面的数据库控制功能: 并发控制 安全性 数据库的恢复 系统更加灵活
术语
数据(Data): 数据库存储的基本对象 数据库(Database): 是长期存储在计算机内、有组织、可共享的大量数据的集合 数据库管理系统(DBMS):介于用户和操作系统之间的一层数据库管理软件 科学的组织和存储数据、高效的获取和检索数据 数据库管理员(DBA)
主流的关系型数据库产品
层次、网状、关系型、非关系型 1.3.1 Oracle 1978年 Oracle 1版本 1.3.2. Microsoft SQL Server 1.3.3 DB2 IBM 1.3.4 MySQL 瑞典的MySQL AB 2008年被sun公司收购 2009年sun公司被Oracle收购
SQL语言
SQL(Structured Query Language):结构化查询语言 SQL分为: 数据查询语句(DQL): select 用来检索数据库中的数据。使用最广泛、语法最复杂灵活
数据操作语句(DML): insert update delete 用来改变数据库表中的数据
数据定义语句(DDL): create alter drop 用来创建、修改和删除数据库对象
事务控制语句(TCL): commit rollback savepoint 用来确保数据的一致性
数据控制语句(DCL): create user、grant、revoke 用来创建用户、权限的授予和回收等。
MySQL的特点
- 性能高效
- 跨平台支持
- 简单易用
- 开源
- 支持多用户
启动和停止服务
-
启动 service mysql start -
重启 service mysql restart -
停止 service mysql stop
连接MySQL
- 语法
mysql [ -h host ] [-u user] [-p[passwd]] [db] [-P port]
配置【1】:mysql.cnf character-set-server = utf8
或配置【2】 conf.d/mysql.cnf [mysql] default-character-set = utf8
验证:登录数据库 show variables like ‘%char%’ ;
客户端工具 其中: host: 要连接的服务器的主机名或ip地址 本机: 可以省略 或localhost 127.0.0.1 user: 登录名 passwd: 密码 db: 数据库名 port: 端口号 默认3306
- 示例
mysql -h 10.10.5.2 -u root -p -P 3307 mysql -u root -p
MySQL数据库管理
创建数据库
- 语法
create database 数据库名; - 示例
– 创建"选课系统"数据库 create database choose;
查看数据库
-
查看所有数据库的列表 show databases; -
显示指定数据库结构 – 语法 show create database 数据库名; – 示例 show create database choose;
选择当前数据库
– 语法 use 数据库名; – 示例 use choose;
删除数据库
– 语法 drop database 数据库名; – 示例 drop database choose;
MySQL表管理
创建表
– 语法 create table 表名( 字段名 数据类型, … 字段名 数据类型 );
示例 – 创建数据库 create database choose;
– 选择当前数据库 use choose;
– 创建表 create table stu_info( ID char(10), Name char(10), Score int );
查看表
-
查看当前数据库中表的列表 show tables; -
查看指定表的详细信息 – 语法 show create table 表名; – 示例 show create table stu_info\G – \G表示纵向显示结果 -
查看指定表的表结构 – 语法 desc[ribe] 表名; – 示例 desc stu_info;
删除表
– 语法 drop table 表名; – 示例 drop table stu_info;
单行注释: – (后面必须有一个空格) # 多行注释: /* */
MySQL表结构的管理
MySQL数据类型
数值类型
整数
tinyint 1字节 smallint 2字节 mediumint 3字节 int 4字节 bigint 8字节 如果使用无符号整数时,在数据类型后加unsigned 比如: age tinyint unsigned
小数
浮点数: float 4字节 double 8字节 精确小数: decimal(len,p) 比如: salary decimal(9,2)
字符串
char(n) 定长字符串 n最大为255 varchar(n) 变长字符串 n的取值和字符集有关
日期和时间类型
date 3字节 ‘YYYY-MM-DD’ ‘1000-01-01’~‘9999-12-31’ time 3字节 ‘HH:MM:SS’ ‘-838:59:59’~‘838:59:59’ datetime 8字节 ‘YYYY-MM-DD HH:MM:SS’ ‘1000-01-01 00:00:00’~‘9999-12-31 23:59:59’
创建表设置约束
语法 create table 表名( 字段名 数据类型[ 约束条件], … 字段名 数据类型[ 约束条件] [,其他约束条件] )[其他选项(引擎、字符集)];
约束类型 1) 主键约束 primary key 主键字段的值不允许为空,不允许重复 一个表中只能有一个主键
2) 唯一约束 unique 不允许重复,允许为空
3) 非空约束 not null
4) 默认约束 default
5) 检查约束 check – 目前MySQL不支持 例:age int check(age>=18 and age<=60)
6) 外键约束 foreign key references
约束的案例
主键约束 – 创建学生表,学号设置为主键 create table student( stu_no char(11) primary key, stu_name char(10) );
– 测试 – insert语句 insert into 表名[(字段列表)] values(值列表); insert into student values(‘1’,‘张三’);
#错误 主键字段的值不允许重复 insert into student values(‘1’,‘张三’);
#错误 主键字段的值不允许为空 insert into student values(null,‘张三’); select * from student;
#错误 一个表中只能有一个主键 create table exam( exam_time date primary key, exam_address char(10) primary key, course_name char(20) );
– 复合主键(组合主键) create table exam(exam_time date, exam_address char(10), course_name char(20), primary key(exam_time,exam_address) );
– 测试 insert into exam values(‘2019-12-16’,‘一教’,‘高数’); insert into exam values(‘2019-12-16’,‘二教’,‘概率’); insert into exam values(‘2019-12-17’,‘一教’,‘英语’); #错误 insert into exam values(‘2019-12-16’,‘一教’,‘高数’);
唯一约束 – 创建学生表,身份证号设置为唯一 drop table student; create table student( stu_no char(11) primary key, stu_name char(10), uid char(18) unique );
测试 insert into student values(‘1’,‘张三’,‘12345’); #错误 唯一约束字段的值不允许重复的 insert into student values(‘2’,‘李四’,‘12345’); – 唯一字段的值允许为空,且可以有多个 insert into student values(‘2’,‘李四’,null); insert into student values(‘3’,‘王五’,null);
非空约束 – 创建学生表,设置姓名为非空 drop table student; create table student( stu_no char(11) primary key, stu_name char(10) not null );
– 测试 insert into student values(‘1’,‘张三’); insert into student values(‘2’,null);
一个字段添加多个约束,顺序任意 stu_name char(10) not null unique 或 stu_name char(10) unique not null
默认约束 – 创建学生表,班级默认为’csd1909’ drop table student; create table student( stu_no char(11) primary key, stu_name char(10) not null, classname char(20) default ‘csd1909’ );
– 示例 – 使用默认值 insert into student values(‘1’,‘张三’,default); insert into student(stu_no,stuname) values(‘2’,‘李四’);
– 不使用默认值 insert into student values(‘3’,‘张三’,‘csd1908’); insert into student values(‘4’,‘赵六’,null);
外键约束 外键约束用于定义表与表之间的关系 主表(父表):提供数据的表 从表(子表):外键所在的表 外键字段的值要么来自于主表的对应字段,要么为null
– 语法 constraint 约束名 foreign key(外键字段) references 主表(字段);
– 创建表,添加外键约束 1)先创建主表,然后再创建从表 – 创建班级表 create table classes( class_no int primary key, class_name char(15) );
– 创建学生表 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(class_no) );
-
添加测试数据 insert into student values(‘1’,‘张三’,null); #错误 违反了外键约束 主表classes中不存在class_no=1的数据 insert into student values(‘2’,‘李四’,1); – 向班级表中插入测试数据 insert into classes values(1,‘2018自动化1班’); – 正确 insert into student values(‘2’,‘李四’,1); -
删除表 先删除从表,再删除主表 drop table student; drop table classes;
创建表设置自增型字段
-
语法 字段名 数据类型 auto_increment 自增长字段的数据类型必须是整型,必须设置为主键 auto_increment primary key 或 primary key auto_increment -
示例 – 创建班级表,班级编号设置为自增长 create table classes(class_no int auto_increment primary key, class_name char(15) unique not null );
-- **测试**
insert into classes(class_name) values('2018自动化1班');
insert into classes values(null,'2018计算机1班');
|