MySQL详细教程
Posted 魏晋南北
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL详细教程相关的知识,希望对你有一定的参考价值。
数据库和SQL
1、概述
1.1.数据库的4个基本概念
数据、数据库、数据库管理系统和数据库系统是与数据库技术密切相关的4个基本概念。
- 数据:
描述事物的符号记录称为数据。描述事物的符号可以是数字也可以是文字、图形、图像、音频、视频等,数据有多种形式。
- 数据库(DataBase DB):
数据库,顾名思义,是存放数据的仓库。数据库是长期存放在计算机内,有组织的、可共享的大量数据的集合。
- 数据库管理系统:
数据库管理系统是位于用户与操作系统之间的一层数据管理软件。数据库管理系统和操作系统一样是计算机的基础软件,也是一个大型复杂的软件系统。常见的数据库管理系统:mysql、Oracle、DB2、SqlServer等
- 数据库系统
数据库系统是由数据库、数据库管理系统、应用程序和数据库管理员组成的存储、管理、处理和维护数据的系统。
数据库管理系统图片
1.2、数据库的好处:
- 实现数据持久化
- 使用完整的管理系统统一管理、易于查询
数据库的特点:
1、将数据放到表中,表再放到库中
2、一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。
3、表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。
4、表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似java 中的”属性”
5、表中的数据是按行存储的,每一行类似于java中的“对象”。
SQL的特点
1、不是某个特定数据库供应商专有的语言,几乎所有DBMS都支持SQL
2、简单易学
3、虽然简单,但实际上是一种强有力的语言,灵活使
用其语言元素,可以进行非常复杂和高级的数据库操作。
1.3、RDBMS 术语
在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:
- 数据库: 数据库是一些关联表的集合。
- 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
- 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
- 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
- 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键:外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
- 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
- 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
- 表头(header): 每一列的名称;
- 列(col): 具有相同数据类型的数据的集合;
- 行(row): 每一行用来描述某条记录的具体信息;
- 值(value): 行的具体信息, 每个值必须与该列的数据类型相同;
- 键(key): 键的值在当前列中具有唯一性。
1.4、SQL语言的分类
1、DML(Data Manipulation Language):数据操纵语句,用于添加、删除、修改、查询数据库记录,并检查数据完整性
2、DDL(Data Definition Language):数据定义语句,用于库和表的创建、修改、删除。
3、DCL(Data Control Language):数据控制语句,用于定义用户的访问权限和安全级别。
1.6.1、DML
DML用于查询与修改数据记录,包括如下SQL语句:
INSERT:添加数据到数据库中
UPDATE:修改数据库中的数据
DELETE:删除数据库中的数据
SELECT:选择(查询)数据
SELECT是SQL语言的基础,最为重要。
1.6.2、DDL
DDL用于定义数据库的结构,比如创建、修改或删除
数据库对象,包括如下SQL语句:
CREATE TABLE:创建数据库表
ALTER TABLE:更改表结构、添加、删除、修改列长度
DROP TABLE:删除表
CREATE INDEX:在表上建立索引
DROP INDEX:删除索引
1.6.3、DCL
DCL用来控制数据库的访问,包括如下SQL语句:
GRANT:授予访问权限
REVOKE:撤销访问权限
COMMIT:提交事务处理
ROLLBACK:事务处理回退
SAVEPOINT:设置保存点
LOCK:对数据库的特定部分进行锁定
2、数据库的相关操作
2.1、查询已有的数据库列表
SHOW DATABASES
2.2、创建数据库
语法:CREATE DATABASE 数据库名字 [库选项];
例如:CREATE DATABASE test_table CHARSET utf8;
2.3、修改数据库
注意:数据库的名字不能修改
语法:alter database 数据库名字 [库选项];
例如:ALTER DATABASE test_table CHARSET GBk;
2.4、删除数据库
语法:drop database [if exists] 数据库名字;
例如:DROP DATABASE IF EXISTS test_table;
3、数据库表的相关操作
3.1、创建表
创建表的语句格式:
Create table [if not exists] 表名(
字段名字 数据类型 [列约束],
字段名字 数据类型 [列约束] ##最后一行不需要逗号
)[表选项];
例如:
CREATE TABLE IF NOT EXISTS `person` (
`id` INT UNSIGNED AUTO_INCREMENT,
`name` VARCHAR (10) NOT NULL,
`age` INT (3) NOT NULL,
`birthday` DATE,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
MySQL常见约束条件
约束条件:限制表中的数据,保证添加到数据表中的数据准确和可靠性!凡是不符合约束的数据,插入时就会失败!
约束条件在创建表时可以使用, 也可以修改表的时候添加约束条件
1、约束条件分类:
1)not null :非空约束,保证字段的值不能为空 s_name VARCHAR(10) NOT NULL, #非空
2)default:默认约束,保证字段总会有值,即使没有插入值,都会有默认值!age INT DEFAULT 18, #默认约束
3)unique:唯一,保证唯一性但是可以为空,比如座位号 s_seat INT UNIQUE,#唯一约束
4)check:检查性约束【MySQL不支持,语法不报错,但无效】 s_sex CHAR(1) CHECK(s_sex=‘男’ OR s_sex=‘女’),#检查约束(Mysql无效)
5)primary key :主建约束,同时保证唯一性和非空 d INT PRIMARY KEY,#主建约束(唯一性,非空)
6)foreign key:外键约束,用于限制两个表的关系,保证从表该字段的值来自于主表相关联的字段的值! teacher_id INT REFERENCES teacher(id) #这是外键,写在列级,Mysql无效
7)自增长列 auto_increment id int primary key auto_increment,
一个表中有且只能有一个自增长列,自增长列一般和主键搭配
字符集: charset/character set 具体字符集; ##保证表中数据存储的字符集
校对集: collate 具体校对集; ## utf8mb4_general_ci
存储引擎: engine 具体的存储引擎(InnoDB和MyISAM)
注意
-
列级约束
上面6种约束都可以写,语法都支持,不报错,但外键约束写了mysql无效不起作用 -
表级约束
-
非空约束、默认约束不支持,其他都可以!
语法:
其他: 【constraint 约束名】 约束类型(字段名称) ,
外键: 【constraint 约束名】 约束类型(字段名称) foreign key(字段名称) references 关联表名(其字段名),
DROP TABLE IF EXISTS students;
CREATE TABLE students(
id INT ,
s_name VARCHAR(10) not null,# 非空约束
s_sex CHAR(1) default '男', # 默认约束
s_seat INT,
age INT ,
teacher_id INT ,
#上面是列级约束,下面有表级约束
CONSTRAINT pk PRIMARY KEY(id), #主建约束,pk是起的名,后面一样
CONSTRAINT uq UNIQUE(s_seat), #唯一约束
CONSTRAINT ck CHECK(s_sex='男' OR s_sex='女'), #检查约束
CONSTRAINT fk_students_teacher FOREIGN KEY(teacher_id) REFERENCES teacher(id) #外键约束
);
数据类型(列类型)
SQL中将数据类型分成了三大类: 数值类型, 字符串类型和时间日期类型
1、数值型
数值型数据: 都是数值
系统将数值型分为整数型和小数型.
整数型
存放整型数据: 在SQL中因为更多要考虑如何节省磁盘空间, 所以系统将整型又细分成了5类:
tinyint: 迷你整型,使用一个字节存储, 表示的状态最多为256种(常用)
smallint: 小整型,使用2个字节存储,表示的状态最多为65536种
mediumint: 中整型, 使用3个字节存储
int: 标准整型, 使用4个字节存储(常用)
bigint: 大整型,使用8个字节存储
小数型
带有小数点或者范围超出整型的数值类型.
SQL中: 将小数型细分成两种: 浮点型和定点型
浮点型: 小数点浮动, 精度有限,而且会丢失精度
定点型: 小数点固定, 精度固定, 不会丢失精度
浮点型
浮点型数据是一种精度型数据: 因为超出指定范围之后, 会丢失精度(自动四舍五入)
浮点型: 理论分为两种精度
Float: 单精度, 占用4个字节存储数据, 精度范围大概为7位左右
Double: 双精度,占用8个字节存储数据, 精度方位大概为15位左右
定点型
定点型: 绝对的保证整数部分不会被四舍五入(不会丢失精度),小数部分有可能(理论小数部分也不会丢失精度)
2、时间日期类型
时间日期, 格式是YYYY-mm-dd HH:ii:ss,表示的范围是从1000到9999年,有0值: 0000-00-00 00:00:00
日期,就是datetime中的date部分
Time:时间(段), 指定的某个区间之间, -时间到+时间
Year:年份,两种形式, year(2)和year(4): 1901-2156
3、字符串类型
在SQL中,将字符串类型分成了6类: char、varchar、text、blob、enum和set
定长字符串
定长字符串: char, 磁盘(二维表)在定义结构的时候,就已经确定了最终数据的存储长度.
char(L): L代表length, 可以存储的长度, 单位为字符, 最大长度值可以为255.
char(4): 在UTF8 环境下,需要4 * 3 = 12个字节
变长字符串
变长字符串: varchar, 在分配空间的时候, 按照最大的空间分配: 但是实际上最终用了多少,是根据具体的数据来确定.
varchar(L): L表示字符长度 理论长度是65536个字符, 但是会多处1到2个字节来确定存储的实际长度: 但是实际上如果长度超过255,既不用定长也不用变长, 使用文本字符串text
varchar(10): 的确存了10个汉字, utf8环境, 10 * 3 + 1 = 31(bytes)
存储了3个汉字: 3 * 3 + 1 = 10(bytes)
定长与变长的存储实际空间(UTF8)
文本字符串
如果数据量非常大, 通常说超过255个字符就会使用文本字符串
文本字符串根据存储的数据的格式进行分类: text和blob
Text: 存储文字(二进制数据实际上都是存储路径)
Blob: 存储二进制数据(通常不用)
枚举字符串
枚举: enum, 事先将所有可能出现的结果都设计好, 实际上存储的数据必须是规定好的数据中的一个.
枚举的使用方式
定义: enum(可能出现的元素列表); //如enum(‘男’,’女’,’不男不女’,’妖’,’保密’);
使用: 存储数据,只能存储上面定义好的数据
集合字符串
集合跟枚举很类似: 实际存储的是数值,而不是字符串(集合是多选)
集合使用方式:
定义: Set(元素列表)
使用: 可以使用元素列表中的元素(多个), 使用逗号分隔
3.2、查看创建表时的语句
语法:show create table 表名
3.3、查看表结构
语法:desc 表名
或 describe 表名
或 show columns from 表名
例如:
DESC person;
DESCRIBE person;
SHOW COLUMNS FROM person;
3.4、修改数据表
注意:数据表 可以修改的部分:表结构和字段
1、修改表名
语法:rename table 老表名 to 新表名;
例如:RENAME TABLE person TO man;
2、修改表选项:字符集、校对集和存储引擎
语法:alter table 表名 表选项 [=] 值;
例如:ALTER TABLE man ENGINE=MYISAM;
3、修改表字段
新增字段:
语法:alter table 表名 add [column] 字段名 数据类型 [列属性] [位置];
例如: ALTER TABLE man ADD COLUMN new_id INT(4) FIRST;
ALTER TABLE man ADD COLUMN age2 INT(5) AFTER age;
重命名字段:
语法:alter table 表名 change 旧字段 新字段名 数据类型 [属性] [位置]
例如:ALTER TABLE man CHANGE age age1 INT;
删除字段:
语法:alter table 表名 drop 字段名;
例如: ALTER TABLE man DROP age2;
3.5、删除数据表
语法:drop table [if exists] 表名1,表名2...; ##可以一次性删除多张表
例如:DROP TABLE IF EXISTS man;
4、数据处理之查询
下图是,本人操作时经常用到的几个表,在这里给出来,在下面会用到
user表
jobs表
employees表
departments表
小伙伴可以将这几个表导入到自己的数据库
CREATE DATABASE /*!32312 IF NOT EXISTS*/`myemployees` /*!40100 DEFAULT CHARACTER SET gb2312 */;
USE `myemployees`;
/*Table structure for table `departments` */
DROP TABLE IF EXISTS `departments`;
CREATE TABLE `departments` (
`department_id` int(4) NOT NULL AUTO_INCREMENT,
`department_name` varchar(3) DEFAULT NULL,
`manager_id` int(6) DEFAULT NULL,
`location_id` int(4) DEFAULT NULL,
PRIMARY KEY (`department_id`),
KEY `loc_id_fk` (`location_id`),
CONSTRAINT `loc_id_fk` FOREIGN KEY (`location_id`) REFERENCES `locations` (`location_id`)
) ENGINE=InnoDB AUTO_INCREMENT=271 DEFAULT CHARSET=gb2312;
/*Data for the table `departments` */
insert into `departments`(`department_id`,`department_name`,`manager_id`,`location_id`) values (10,'Adm',200,1700),(20,'Mar',201,1800),(30,'Pur',114,1700),(40,'Hum',203,2400),(50,'Shi',121,1500),(60,'IT',103,1400),(70,'Pub',204,2700),(80,'Sal',145,2500),(90,'Exe',100,1700),(100,'Fin',108,1700),(110,'Acc',205,1700),(120,'Tre',NULL,1700),(130,'Cor',NULL,1700),(140,'Con',NULL,1700),(150,'Sha',NULL,1700),(160,'Ben',NULL,1700),(170,'Man',NULL,1700),(180,'Con',NULL,1700),(190,'Con',NULL,1700),(200,'Ope',NULL,1700),(210,'IT ',NULL,1700),(220,'NOC',NULL,1700),(230,'IT ',NULL,1700),(240,'Gov',NULL,1700),(250,'Ret',NULL,1700),(260,'Rec',NULL,1700),(270,'Pay',NULL,1700);
/*Table structure for table `employees` */
DROP TABLE IF EXISTS `employees`;
CREATE TABLE `employees` (
`employee_id` int(6) NOT NULL AUTO_INCREMENT,
`first_name` varchar(20) DEFAULT NULL,
`last_name` varchar(25) DEFAULT NULL,
`email` varchar(25) DEFAULT NULL,
`phone_number` varchar(20) DEFAULT NULL,
`job_id` varchar(10) DEFAULT NULL,
`salary` double(10,2) DEFAULT NULL,
`commission_pct` double(4,2) DEFAULT NULL,
`manager_id` int(6) DEFAULT NULL,
`department_id` int(4) DEFAULT NULL,
`hiredate` datetime DEFAULT NULL,
PRIMARY KEY (`employee_id`),
KEY `dept_id_fk` (`department_id`),
KEY `job_id_fk` (`job_id`),
CONSTRAINT `dept_id_fk` FOREIGN KEY (`department_id`) REFERENCES `departments` (`department_id`),
CONSTRAINT `job_id_fk` FOREIGN KEY (`job_id`) REFERENCES `jobs` (`job_id`)
) ENGINE=InnoDB AUTO_INCREMENT=209 DEFAULT CHARSET=gb2312;
/*Data for the table `employees` */
insert into `employees`(`employee_id`,`first_name`,`last_name`,`email`,`phone_number`,`job_id`,`salary`,`commission_pct`,`manager_id`,`department_id`,`hiredate`) values (100,'Steven','K_ing','SKING','515.123.4567','AD_PRES',24000.00,NULL,NULL,90,'1992-04-03 00:00:00'),(101,'Neena','Kochhar','NKOCHHAR','515.123.4568','AD_VP',17000.00,NULL,100,90,'1992-04-03 00:00:00'),(102,'Lex','De Haan','LDEHAAN','515.123.4569','AD_VP',17000.00,NULL,100,90,'1992-04-03 00:00:00'),(103,'Alexander','Hunold','AHUNOLD','590.423.4567','IT_PROG',9000.00,NULL,102,60,'1992-04-03 00:00:00'),(104,'Bruce','Ernst','BERNST','590.423.4568','IT_PROG',6000.00,NULL,103,60,'1992-04-03 00:00:00'),(105,'David','Austin','DAUSTIN','590.423.4569','IT_PROG',4800.00,NULL,103,60,'1998-03-03 00:00:00'),(106,'Valli','Pataballa','VPATABAL','590.423.4560','IT_PROG',4800.00,NULL,103,60,'1998-03-03 00:00:00'),(107,'Diana','Lorentz','DLORENTZ','590.423.5567','IT_PROG',4200.00,NULL,103,60,'1998-03-03 00:00:00'),(108,'Nancy','Greenberg','NGREENBE','515.124.4569','FI_MGR'免安装版MySQL(解压版)安装详细教程及注意事项
修改MySQL密码报错“ERROR 1819 (HY000): Your password does not satisfy the current policy requirements“(代码片段