数据库基础
知识预览
数据库的简介
MySQL
第一章数据库的简介
数据库
数据库(dataBase,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合。
数据库中的数据按一定的数学模型组织、描述和存储,具有较小的冗余,较高的数据独立性和易扩展性,并可为各种用户共享。
数据库管理系统软件
数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。
它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。
用户通过DBMS访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。
它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。
大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。
数据库管理系统是数据库系统的核心,是管理数据库的软件。
数据库管理系统就是实现把用户意义下抽象的逻辑数据处理,转换成为计算机中具体的物理数据处理的软件。
有了数据库管理系统,用户就可以在抽象意义下处理数据,而不必顾及这些数据在计算机中的布局和物理位置。
常见的数据库管理软件:甲骨文的oracle,IBM的db2,sql server, Access,MySQL(开源,免费,跨平台).
数据库系统
数据库系统DBS(Data Base System,简称DBS)通常由软件、数据库和数据管理员组成。
软件主要包括操作系统、各种宿主语言、实用程序以及数据库管理系统。
数据库由数据库管理系统统一管理,数据的插入、修改和检索均要通过数据库管理系统进行。
数据管理员负责创建、监控和维护整个数据库,使数据能被任何有权使用的人有效使用。
MySQL
MySQL的管理
--安装
--linux:
yum -y install mariadb mariadb-server
OR
yum -y install mysql mysql-server
--windows:
http://dev.mysql.com/downloads/mysql/
--启动
service mysqld start --开启
chkconfig mysqld on --设置开机自启
OR
systemctl start mariadb
systemctl enable mariadb
--查看
ps aux |grep mysqld --查看进程
netstat -an |grep 3306 --查看端口
--设置密码
mysqladmin -uroot password '123' --设置初始密码,初始密码为空因此-p选项没有用
mysqladmin -u root -p123 password '1234' --修改root用户密码
--登录
mysql --本地登录,默认用户root,空密码,用户为root@127.0.0.1
mysql -u root -p 1234 --本地登录,指定用户名和密码,用户为root@127.0.0.1
mysql -u root -p 1234 -h 192.168.31.95 --远程登录,用户为root@192.168.31.95
--MYSQL的常用命令
--启动mysql服务与停止mysql服务命令:
net start mysql
net stop mysql
--登陆与退出命令:
mysql -h 服务器IP -P 端口号 -u 用户名 -p 密码
--mysql -h 127.0.0.1 -P 3306 -u root -p 123
--配置文件
/* my.ini文件:[mysql] default-character-set=gbk
[mysqld] character-set-server=gbk */
MySQL相关命令
? |
(\?) |
显示帮助信息 |
clear |
(\c) |
明确当前输入语句 |
connect |
(\r) |
连接到服务器,可选参数为数据库和主机 |
delimiter |
(\d) |
设置语句分隔符 |
ego |
(\G) |
发送命令到MySQL服务器,并显示结果 |
exit |
(\q) |
退出MySQL等同于quit |
go |
(\g) |
发送命令到MySQL服务器 |
help |
(\h) |
显示帮助信息 |
notee |
(\t) |
不写输出文件 |
|
(\p) |
打印当前命令 |
prompt |
(\R) |
改变MySQL提示信息 |
quit |
(\q) |
退出MySQL |
rehash |
(\#) |
重新完成散列 |
source |
(\.) |
执行一个SQL脚本文件,以一个文件名作为参数。 |
status |
(\s) |
以服务器获取MySQL的状态 |
tee |
(\T) |
设置输出文件,并将信息添加到所有给定的输出文件 |
use |
(\u) |
用另一个数据库,数据库名称作为参数 |
charset |
(\C) |
切换到另一个字符集 |
warnings |
(\W) |
每一个语句之后显示警告 |
nowarning |
(\w) |
每一个语句之后不显示警告 |
SQL及其规范
SQL(Structured Query Language结构化查询语言)是一种数据库查询语言和程序设计语言,主要用于管理数据库中的数据,如存取数据、查询数据、更新数据等。
SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。
在使用它时,只需要发出"做什么"的命令,"怎么做"是不用使用者考虑的。
SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持SQL。
<1> 在数据库系统中,SQL语句不区分大小写。但字符串常量区分大小写。建议命令大写,表名库名小写;
<2> SQL语句可单行或多行书写,以";"结尾。关键词不能跨多行或简写。
<3> 用空格和缩进来提高语句的可读性。子句通常位于独立行,便于编辑,提高可读性。
SELECT * FROM tb_table
WHERE NAME="YUAN";
<4> 注释:单行注释:--
多行注释:/*......*/
<5>SQL语句可以折行操作
<6>SQL语言由DDL,DML,DQL和DCL组成
(1)数据库定义语言(Data Definition Language,DDL)
数据库定义语言主要用于定义数据库、表等,其中包括CREATE语句、ALTER语句和DROP语句。
CREATE语句用于创建数据库、数据表等,ALTER语句用于修改表的定义等,DROP语句用于删除数据库、删除表等。
(2)数据库操作语言(Data Mabipulation Language,DML)
数据库操作语言主要用于数据库进行添加、修改、删除操作,其中包括INSERT语句、UPDATE语言和DELETE语句。
INSERT语句用于插入数据,UPDATE语句用于修改数据,DELETE语句用于删除数据。
(3)数据库查询语言(Data Query Language,DQL)
数据库查询语言主要用于查询语言,也就是指SELECT语句。
SELECT语句查询数据库中的一条或多条数据。
(4)数据库控制语言(Data Control Language,DCL)
数据库控制语言主要用于控制用户的访问权限,其中包括GRANT语句、REVOKE语句、COMMIT语句和ROLLBACK语句。
GRANT语句用于给用户增加权限,REVOKE语句用于收回用户的权限,COMMIT语句用于提交事务,ROLLBACK语句用于回滚事务。
第二章 数据库和表基本操作
数据库操作
-- 1.创建数据库(在磁盘上创建一个对应的文件夹)
CREATE DATABASE [IF NOT EXISTS] 库名 [CHARACTER SET xxx] --xxx为utf8 或者gbk
--[IF NOT EXISTS]此可选项的意思是如果不存在表就创建,如果存在表则不创建。
-- 2.查看数据库
SHOW DATABASES;--查看所有数据库
SHOW CREATE DATABASE 库名; --查看数据库的创建方式
-- 3.修改数据库
ALTER DATABASE 库名 [CHARACTER SET xxx]; --(一般不需要)
-- 4.删除数据库
DROP DATABASE [IF EXISTS] 库名;
-- 5.使用数据库
USE 库名; --切换数据库
--注意:进入到某个数据库后没办法再退回之前状态,但可以通过USE进行切换
SELECT DATABASE();--查看当前使用的数据库
MySQL数据类型
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
数值类型
下面的表显示了需要的每个整数类型的存储和范围。
--整数类型
数值类型 字节数 无符号数取值类型 有符号数取值类型
TINYINT 1 (0,255) (-128,127)
SMALLINT 2 (0,65535) (-32768,32767)
MEDIUMINT 3 (0,16777215) (-8388608,8388607)
INT或INTEGER 4 (0,4294967295) (-2147483648,2147483647)
BIGINT 8 (0,18446744073709551615) (-9223372036854775808,9223372036854775807)
--浮点型类型和定点数类型
数值类型 字节数 无符号数取值类型 有符号数取值类型
FLOAT 4
DOUBLE 8
DECIMAL(M,D) M+2
--注意DECIMAL类型的取值范围与DOUBLE类型相同。
--注意的是DECIMAL类型的有效取值范围是由M和D决定的。
--其中,M表示的是数据的长度,表示的是小数点后的长度。
--日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
类型 字节数(大小) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 -838:59:59/838:59:59 HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/ YYYY-MM-DD 混合日期和时间值
9999-12-31 23:59:59 HH:MM:SS
TIMESTAMP 4 1970-01-01 00:00:01/ YYYY-MM-DDH 混合日期和时间值
2038-01-19 03:14:07 HH:MM:SS 时间数
--字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
该节描述了这些类型如何工作以及如何在查询中使用这些类型。
类型 字节数(大小) 用途
CHAR 0-255字节 定长字节符
VARCHAR 0-65535字节 变长字节符
BLOB 0-65535字节 二进制形式的长文本数据
TINYBLOB 0-255字节 不超过255个字符的二进制字符串
MEDIUMBLOB 0-16777215字节 二进制形式的中等长度文本数据
LONGBLOB 0-4294967295字节 二进制形式的极大文本数据
TEXT 0-65535字节 长文本数据
TINYTEXT 0-255字节 短文本字符串
MEDIUMTEXT 0-16777215字节 中等长度文本数据
LONGTEXT 0-4294967295字节 极大文本数据
/* CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。
BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。
有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。
*/
数据表操作
--1.创建表(类似于一个excel表)
--基本语法
CREATE TABLE 表名(
field1 type[完整性约束条件],
field2 type,
...
fieldn type
)[CHARACTER SET XXX];
--创建一个员工表employee
mysql>CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
gender BIT DEFAULT 1, -- gender CHAR(1) DEFAULT 1 --或者 TINYINT(1)
birthday DATE,
entry_date DATE,
job VARCHAR(20),
salary DOUBLE(4,2) unsigned,
resume TEXT -- 注意,这里作为最后一个字段不加逗号
);
/* 约束:
PRIMARY KEY (非空且唯一):能够唯一区分出当前记录的字段称为主键!
UNIQUE 唯一
NOT NULL 非空
AUTO_INCREMENT 主键字段必须是数字类型。使用AUTO_INCREMENT设置字段值自动增加。
外键约束 FOREIGN KEY */
--2.查看表信息
DESC 表名; --查看表结构,即查看表的字段信息,其中包括字段名、字段类型等信息
SHOW COLUMNS FROM 表名; --查看表结构
SHOW TABLES; --查看当前数据库中的所有的表
SHOW CREATE TABLE 表名; --查看当前数据库表建表语句
--3.修改表结构
--(1)增加列(字段) --默认在表已有字段的后面添加
ALTER TABLE 表名 ADD [COLUMN] 列名 类型[完整性约束条件][FIRST|AFTER 字段名];
--ALTER TABLE user ADD addr VARCHAR(20) NOT NULL UNIQUE FIRST/AFTER username;
--FIRST用于将新添加的字段设置为表的第一个字段
--AFTER用于将新添加的字段添加到指定的"已存在字段名"的后面
--添加多个字段
ALTER TABLE employee
ADD addr VARCHAR(20),
ADD age INT FIRST,
ADD depart VARCHAR(20) AFTER name;
--(2)修改一列类型
ALTER TABLE 表名 MODIFY 列名 类型 [完整性约束条件][FIRST|AFTER 字段名];
--ALTER TABLE employee MODIFY age TINYINT DEFAULT 20;
--ALTER TABLE employee MODIFY age TINYINT AFTER id;
--(3)修改列名
ALTER TABLE 表名 CHANGE [COLUMN] 列名 新列名 类型 [完整性约束条件][FIRST|AFTER 字段名];
--ALTER TABLE employee CHANGE age Age INT DEFAULT 28 FIRST;
--(4)删除一列
ALTER TABLE 表名 DROP [COLUMN] 列名;
--思考:删除多列呢?
ALTER TABLE 表名 DROP [COLUMN] 列名1,
DROP [COLUMN] 列名2;
--删一个填一个呢?
ALTER TABLE employee
ADD salary FLOAT(6,2) UNSIGNED NOT NULL AFTER name,
DROP addr;
--(5)修改表名
RENAME TABLE 表名 to 新表名;
--(6)修该表所用的字符集
ALTER TABLE student CHARACTER SET utf8;
ALTER TABLE student CHARACTER SET gbk;
--4.删除表
DROP TABLE 表名;
表的约束
PRIMARY KEY --主键约束,用于唯一标识对应的记录
FOREIGN KEY --外键约束
NOT NULL --非空约束
UNIQUE --唯一性约束
DEFAULT --默认值约束,用于设置字段的默认值
主键约束 --唯一标识表中的记录
--语法:
字段名 数据类型 PRIMARY KEY
单字段主键
mysql>CREATE TABLE users(
id INT PRIMARY KEY,
name VARCHAR(20),
city VARCHAR(20)
);
主键字段特点:非空且唯一
多字段联合主键
mysql>CREATE TABLE users2(
id INT,
name VARCHAR(20),
city VARCHAR(20),
PRIMARY KEY(name,id)
);
<1> 一张表只能有一个主键
<2> 主键类型不一定非是整型
--添加主键,
ALTER TABLE 表名 ADD PRIMARY KEY(字段名称,...);
--删除主键
ALTER TABLE users DROP PRIMARY KEY;
--每张表必须有主键
mysql> CREATE TABLE test5(num INT AUTO_INCREMENT);
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
--修改如下
mysql>CREATE TABLE test(num INT PRIMARY KEY AUTO_INCREMENT);
--思考,如何删除主键?
ALTER TABLE test MODIFY id INT; -- auto_increment没了,但这样写主键依然存在,所以还要加上下面这句
ALTER TABLE test DROP PRIMARY KEY;-- 仅仅用这句也无法直接删除主键
非空约束 --字段的值不能为NULL
字段名 数据类型 NOT NULL
mysql>CREATE TABLE users3(
id INT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
grade FLOAT
);
唯一约束 --用于保证数据表中字段的唯一性,即表中字段的值不能重复出现。
mysql>CREATE TABLE users4(
id INT PRIMARY KEY,
stu_id INT UNIQUE,
name VARCHAR(20) NOT NULL
);
默认约束 --用于给数据表中的字段制定默认值,即当在表中插入一条新纪录时,如果没有给这个字段赋值,那么,数据库系统会自动为这个字段插入默认值。
mysql>CREATE TABLE users5(
id INT PRIMARY KEY AUTO_INCREMENT,
stu_id INT UNIQUE,
grade FLOAT DEFAULT 0
);
索引
--一、索引简介
--索引在MySQL中也叫做"键",是存储引擎用于快速找到记录的一种数据结构。
--索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。
--索引优化应该是对查询性能优化最有效的手段了。
--索引能够轻易将查询性能提高好几个数量级。
--索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。
--索引特点:创建与维护索引会消耗很多时间与磁盘空间,但查询速度大大提高!
--二、索引语法
--1.创建表时创建索引:可以直接创建索引,这种方法最简单、方便
--基本语法
CREATE TABLE 表名 (
字段名1 数据类型 [完整性约束条件…],
字段名2 数据类型 [完整性约束条件…],
[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
[索引名] (字段名[(长度)] [ASC |DESC])
);
--注释:
(1)UNIQUE:可选参数,表示唯一索引;
(2)FULLTEXT:可选参数,表示全文索引;
(3)SPATIAL:可选参数,表示空间检索;
(4)INDEX 和 KEY:用来表示字段的索引,二者选一;
(5)索引名:可选参数,表示创建的索引的名称;
(6)字段名:指定索引对应字段的名称;
(7)长度:用于表示索引的长度;
(8)ASC 和 DESC:可选参数,ASC表示升序,DESC表示降序。
--①创建普通索引
--是由INDEX或KEY定义的索引,它是MySQL中的基本索引类型,可以创建在任何数据类型上,其值是否唯一和非空由字段本身的约束条件所决定。
--示例:
mysql>CREATE TABLE employee1(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
resume VARCHAR(20),
INDEX index_emp_name(name) --INDEX可以替换成KEY
);
--②唯一性索引
--是由UNIQUE定义的索引,该索引所在字段的值必须是唯一的。
--示例:
CREATE TABLE employee2(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
bank_num CHAR(18) UNIQUE,
resume VARCHAR(30),
UNIQUE INDEX index_emp_name(name)
);
--③全文索引
--是由FULLTEXT定义的索引,它只能创建CHAR、VARCHAR或TEXT类型的字段上,而且只有MyISAM存储引擎支持全文索引。InnoDB存储引擎还不支持全文索引。
--示例:
CREATE TABLE employee3(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
resume VARCHAR(30),
FULLTEXT INDEX index_resume(resume)
)ENGINE=MyISAM;
--④单列索引
指的是在表中单个字段上创建索引,它可以是普通索引,唯一性索引或者全文索引,只要保证该索引只对应表中一个字段即可。
--⑤多列索引
指的是在表中多个字段上创建索引,只有在查询条件中使用了这些字段中的第一个字段时该索引才会被使用。
例如,在employ4表的id、name和resume字段上创建一个多列索引,那么只有查询条件中使用了id字段时,该索引才会被使用。
--示例:
CREATE TABLE employee4(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
resume VARCHAR(30),
INDEX index_emp(id,name,resume)
);
--2.使用CREATE INDEX语句在已经存在的表上创建索引
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
ON 表名(字段名[(长度)] [ASC |DESC]);
示例:CREATE INDEX index_emp_name on emp1(name);
--3.使用ALTER TABLE语句在已经存在的表上创建索引
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
索引名 (字段名[(长度)] [ASC |DESC]) ;
示例:ALTER TABLE emp2 ADD UNIQUE INDEX index_bank_num(band_num);
--三、删除索引
--1.使用ALTER TABLE删除索引
--语法:
ALTER TABLE 表名 DROP {INDEX|KEY} 索引名;
--示例:
ALTER TABLE employ1 DROP {INDEX|KEY} index_emp_name;
--2.使用DROP INDEX 删除索引
--语法:
DROP INDEX 索引名 on 表名;
--示例:
DROP INDEX index_emp_name on employ1;
DROP INDEX bank_num on employ2;
--四、索引测试实验
--创建表
mysql>CREATE TABLE Indexdb.t1(id INT,name VARCHAR(20));
--存储过程
mysql>DELIMITER $$ --将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql>CREATE PROCEDURE autoinsert()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE(i<500000) DO
INSERT INTO Indexdb.t1 VALUES (i,'yuan');
SET i=i+1;
END WHILE;
END$$
mysql>DELIMITER ; --将语句的结束符号恢复为分号
--调用函数
mysql>CALL autoinsert();
-- 花费时间比较:
-- 创建索引前
SELECT * FROM Indexdb.t1 WHERE id=300000;--0.32s
-- 添加索引
CREATE INDEX index_id ON Indexdb.t1(id);
-- 创建索引后
SELECT * FROM Indexdb.t1 WHERE id=300000;--0.00s