本篇整理学习数据库之前需要了解的背景知识:文件与内存两种数据存储方式存在的问题、数据库的概念与发展历程、常见关系型数据库产品,以及应用程序与数据库的协作方式。
1. 目前存在的问题
通过之前的学习,我们能够使用以下两种方式进行数据存储:
- 使用变量、对象、数组、集合存储数据,数据保存在内存(RAM)中;
- 使用文件(File)存储数据,保存在硬盘上。
1.1 方式一存在的问题
数据保存在内存中,不能持久化(即无法永久保存数据),程序关闭后数据就会消失。
本篇整理学习数据库之前需要了解的背景知识:文件与内存两种数据存储方式存在的问题、数据库的概念与发展历程、常见关系型数据库产品,以及应用程序与数据库的协作方式。
通过之前的学习,我们能够使用以下两种方式进行数据存储:
数据保存在内存中,不能持久化(即无法永久保存数据),程序关闭后数据就会消失。
本篇记录 MySQL 5.7 在 Windows 平台下的下载、安装、配置、卸载全过程,以及环境变量、目录结构与配置文件的相关说明。
多数时候直接使用 SQL 语句对数据库进行操作并不是很方便,特别是在查询操作时,显示的内容不够直观。此时需要借助图形化工具对数据库进行操作。
操作 MySQL 常用的图形化工具如下:
Navicat 是一套快速、可靠的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设计。它的设计符合数据库管理员、开发人员及中小企业的需要。Navicat 以直觉化的图形用户界面构建,让你可以以安全且简单的方式创建、组织、访问并共用信息。
本篇整理 SQL 的基本概念与分类,以及 DDL(数据定义语言)中对数据库和表的常用操作。
SQL:Structured Query Language(结构化查询语言)。客户端使用 SQL 来操作数据库,SQL 可以应用到所有关系型数据库中。
SQL 语言标准由 ISO(国际标准化组织)发布,ISO 定义了很多 SQL 标准(例如 SQL99)对 RDBMS 进行统一操作,相同的语句可以操作 Oracle、MySQL。但各个数据库厂商有自己的标准,类似于方言,例如 MySQL 中的 limit。
DML(Data Manipulation Language,数据操作语言):对表记录进行增、删、改。
重要
DML 是对表的内容进行操作,DDL 是对表的结构进行操作,两者有本质区别。
先建库建表:
# 创建数据库
CREATE DATABASE IF NOT EXISTS mydb;
# 切换数据库
USE mydb;
# 删除表
DROP TABLE IF EXISTS stu;
# 创建学生表
CREATE TABLE stu (
id int(11),
name varchar(20),
age int(11),
gender varchar(5),
addr varchar(30)
);
约束用于限制加入表的数据的类型和规范。约束是添加在列上的,用来约束列的。
约束按用途可分为三类:
主键用来标识表中的一行数据,是该行数据的唯一标识,具有以下特性:
当表的某一列被指定为主键后,该列就不能为空,也不能出现重复值。
DQL(Data Query Language,数据查询语言)用于查询表记录。查询操作是所有操作中使用最频繁的操作。
为了进行查询的学习,首先运行一段 SQL 脚本,创建并初始化部门表、雇员表、工资等级表与学生表:
DROP DATABASE if exists mytest;
CREATE DATABASE mytest;
USE mytest;
/*
部门表
deptno 部门编号
dname 部门名称
loc 部门位置
*/
CREATE TABLE dept(
deptno INT PRIMARY KEY,
dname VARCHAR(50),
loc VARCHAR(50)
);
/*
雇员表
empno 员工编号
ename 员工姓名
job 员工工种
mgr 上级编号
hiredate 入职日期
sal 薪资
comm 奖金
deptno 部门编号
*/
CREATE TABLE emp(
empno INT PRIMARY KEY,
ename VARCHAR(50),
job VARCHAR(50),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm DECIMAL(7,2),
deptno INT,
CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno)
);
/*
创建工资等级表
grade 工资等级编号
losal 最低工资
hisal 最高工资
*/
CREATE TABLE salgrade(
grade INT PRIMARY KEY,
losal INT,
hisal INT
);
/*
创建学生表
sid 学生编号
sname 学生姓名
age 学生年龄
gender 学生性别
province 省份
tuition 学费
*/
CREATE TABLE stu(
sid INT PRIMARY KEY,
sname VARCHAR(50),
age INT,
gender VARCHAR(10),
province VARCHAR(50),
tuition INT
);
/*插入dept表数据*/
INSERT INTO dept VALUES (10, '研发部', '北京');
INSERT INTO dept VALUES (20, '市场部', '上海');
INSERT INTO dept VALUES (30, '行政部', '北京');
INSERT INTO dept VALUES (40, '财务部', '北京');
/*插入salgrade表数据*/
INSERT INTO salgrade VALUES (1, 7000, 12000);
INSERT INTO salgrade VALUES (2, 12010, 14000);
INSERT INTO salgrade VALUES (3, 14010, 20000);
INSERT INTO salgrade VALUES (4, 20010, 30000);
INSERT INTO salgrade VALUES (5, 30010, 99990);
/*插入emp表数据*/
INSERT INTO emp VALUES (1009, 'Smith', '董事长', NULL, '2001-11-17', 50000, NULL, 10);
INSERT INTO emp VALUES (1004, 'Tom', '经理', 1009, '2001-04-02', 29750, NULL, 20);
INSERT INTO emp VALUES (1006, 'Lucy', '经理', 1009, '2001-05-01', 28500, NULL, 30);
INSERT INTO emp VALUES (1007, 'Lily', '架构师', 1009, '2001-09-01', 24500, NULL, 10);
INSERT INTO emp VALUES (1008, 'John', '工程师', 1004, '2007-04-19', 30000, NULL, 20);
INSERT INTO emp VALUES (1013, '周杰伦', '工程师', 1004, '2001-12-03', 30000, NULL, 20);
INSERT INTO emp VALUES (1002, '周星驰', '销售员', 1006, '2001-02-20', 16000, 3000, 30);
INSERT INTO emp VALUES (1003, '成龙', '销售员', 1006, '2001-02-22', 12500, 5000, 30);
INSERT INTO emp VALUES (1005, '约翰逊', '销售员', 1006, '2001-09-28', 12500, 14000, 30);
INSERT INTO emp VALUES (1010, '鲍威尔', '销售员', 1006, '2001-09-08', 15000, 0, 30);
INSERT INTO emp VALUES (1012, '史泰龙', '文员', 1006, '2001-12-03', 9500, NULL, 30);
INSERT INTO emp VALUES (1014, '马克思', '文员', 1007, '2002-01-23', 13000, NULL, 10);
INSERT INTO emp VALUES (1011, '恩格斯', '文员', 1008, '2007-05-23', 11000, NULL, 20);
INSERT INTO emp VALUES (1001, '辛格', '文员', 1013, '2000-12-17', 8000, NULL, 20);
INSERT INTO emp VALUES (1033, 'Rose', '经理', 1013, '2011-12-17', 18000, NULL, 20);
INSERT INTO emp VALUES (1034, 'Robin', '经理', 1009, '2011-12-17', 18000, NULL, 10);
INSERT INTO emp VALUES (1038, 'Bob', '司机', 1009, '2011-12-17', 18000, NULL, 50);
/*插入stu表数据*/
INSERT INTO stu VALUES ('1', 'zhangsan', '23', '男', '北京', '21500');
INSERT INTO stu VALUES ('2', 'lisi', '25', '男', '北京', '21500');
INSERT INTO stu VALUES ('3', 'wangwu', '22', '男', '北京', '23500');
INSERT INTO stu VALUES ('4', 'Herry', '25', '男', '北京', '21500');
INSERT INTO stu VALUES ('5', '史莱克', '23', '女', '北京', '21000');
INSERT INTO stu VALUES ('6', '汉克斯', '22', '女', '山东', '22500');
INSERT INTO stu VALUES ('7', '马克', '21', '女', '北京', '21600');
INSERT INTO stu VALUES ('8', '马克思', '23', '男', '北京', '23500');
INSERT INTO stu VALUES ('9', 'Hans', '23', '女', '加利福尼亚', '22500');
INSERT INTO stu VALUES ('10', '古惑仔', '18', '男', '香港', '21500');
INSERT INTO stu VALUES ('11', '琼瑶', '23', '男', '台湾', '21500');
INSERT INTO stu VALUES ('12', '杰克逊', '24', '男', '科罗拉多', '21500');
INSERT INTO stu VALUES ('13', '博尔特', '24', '男', '华盛顿', '22500');
INSERT INTO stu VALUES ('14', '巴斯德', '22', '男', '弗吉尼亚', '23500');
INSERT INTO stu VALUES ('15', '克里', '25', '男', '北京', '21500');
INSERT INTO stu VALUES ('16', '克林顿', '23', '女', '北京', '21000');
INSERT INTO stu VALUES ('17', '希拉里', '22', '女', '山东', '22500');
INSERT INTO stu VALUES ('18', '川普', '21', '女', '北京', '21600');
INSERT INTO stu VALUES ('19', '尤里', '23', '男', '北京', '23500');
INSERT INTO stu VALUES ('20', '加加林', '23', '女', '莫斯科', '22500');
INSERT INTO stu VALUES ('21', '特斯拉', '18', '男', '纽约', '23500');
INSERT INTO stu VALUES ('22', '拉姆斯菲尔德', '23', '男', '科罗拉多', '21500');
INSERT INTO stu VALUES ('23', '盖伊', '23', '男', '佛罗里达', '21500');
DCL(Data Control Language,数据控制语言):在 SQL 语言中,是一种可对数据访问权进行控制的指令。它可以控制特定用户账户对数据表、视图、存储程序、用户自定义函数等数据库对象的控制权。
# 语法
CREATE USER 用户名@地址 IDENTIFIED BY '密码';
# 创建用户user1,密码设置为1234
CREATE USER user1@localhost IDENTIFIED BY '1234';
TPL(Transaction Process Language,事务处理语言)用于对事务进行处理。本篇先通过模拟转账引出事务的必要性,再介绍事务的概念、原理、特性与隔离级别。
先建库建表:
DROP DATABASE if exists mydb2;
CREATE DATABASE mydb2;
USE mydb2;
DROP TABLE IF EXISTS account;
CREATE TABLE account (
id int(11) NOT NULL AUTO_INCREMENT,
cardnum varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
money decimal(10, 0) NULL DEFAULT NULL,
PRIMARY KEY (id) USING BTREE
);
INSERT INTO account VALUES (1, '10001', 5000);
INSERT INTO account VALUES (2, '10002', 5000);
视图是虚拟表,是从一个表或多个表中查询出来的表,作用和真实表一样,包含一系列带有行和列的数据。视图中,用户可以使用 SELECT 语句查询数据,也可以使用 INSERT、UPDATE、DELETE 修改记录。视图可以使用户操作方便,并保障数据库系统安全。
优点: