浅学MySQL
数据库(DataBase简称DB)
DataBase指长期保存在计算机存储设备上,按照一定规则组织起来,可被用户或应用共享的数据集合。从本质上来讲,DataBase是一种文件系统。
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
小菜鸡分享mysql入门学习日常
提示:以下是本篇文章正文内容,下面案例可供参考
一、MySQL环境变量配置
1、找到MySQL的bin文件所在路径
2、将该路径添加到系统的path中
请注意路径前后的分号 ;
3、在命令行中输入mysql -u root -p
4、在命令行中输入密码root
输入后回车后可见MySQL数据库相关信息。至此,我们完成了MySQL的安装及其配置。
二、sql简介
1.sql特点
- 简单易学,具有很强的操作性
- 绝大多数重要的数据库管理系统均支持SQL
- 高度非过程化;用SQL操作数据库时大部分的工作由DBMS自动完成
2.SQL的分类
- DDL(Data Definition Language)
数据定义语言,用来操作数据库、表、列等;
常用语句:CREATE、 ALTER、DROP - DML(Data Manipulation Language)
数据操作语言,用来操作数据库中表里的数据;
常用语句:INSERT、 UPDATE、 DELETE - DCL(Data Control Language)
数据控制语言,用来操作访问权限和安全级别;
常用语句:GRANT、DENY - DQL(Data Query Language)
数据查询语言,用来查询数据
常用语句:SELECT
在此,请注意区分DDL和DML:
它们两者的作用对象和级别不一样。DDL操作的对象是数据库,或者一张表,或者表中的某列;DML操作的是表里的数据。
三、三大范式
第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据线;也就是说:每列的值具有原子性,不可再分割。
第二范式(2NF)是在第一范式(1NF)的基础上建立起来得,满足第二范式(2NF)必须先满足第一范式(1NF)。假若,连第一范式(1NF)都不满足就更谈不上满足第二范式(2NF)了。在第二范式(2NF)中要求:
- 1、如果表是单主键,那么主键以外的列必须完全依赖于主键
- 2、如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分
第三范式(3NF)是在第二范式的基础上建立起来的,即满足第三范式必须要先满足第二范式。第三范式(3NF)要求:表中的非主键列必须和主键直接相关而不能间接相关;也就是说:非主键列之间不能相关依赖。
数据类型
1.整数类型
根据数值取值范围的不同MySQL 中的整数类型可分为5种,分别是TINYINT、SMALLUNT、MEDIUMINT、INT和 BIGINT。下图列举了 MySQL不同整数类型所对应的字节大小和取值范围:
其中,我们最常用的整数类型为INT;在某些教程中也将其称为INTEGER
2.浮点数类型和定点数类型
3.字符串类型
在MySQL中常用CHAR 和 VARCHAR 表示字符串。两者不同的是:VARCHAR存储可变长度的字符串。在MySQL中,定义CHAR和VARCHAR类型的方式如下:
CHAR(M)或 VARCHAR(M)
在上述定义方式中,M指的是字符串的最大长度。当数据为CHAR(M)类型时,不管插入值的长度是实际是多少它所占用的存储空间都是M个字节;而VARCHAR(M)所对应的数据所占用的字节数为实际长度加1
4.文本类型
文本类型用于表示大文本数据,例如,文章内容、评论、详情等,它的类型分为如下4种:
5.日期与时间类型
MySQL提供的表示日期和时间的数据类型分别是 :YEAR、DATE、TIME、DATETIME 和 TIMESTAMP。下图列举了日期和时间数据类型所对应的字节数、取值范围、日期格式以及零值:
YEAR类型
YEAR类型用于表示年份,在MySQL中,可以使用以下三种格式指定YEAR类型
的值。
- 使用4位字符串或数字表示,范围为'1901'—'2155'或1901—2155。例如,输人 '2019'或2019插人到数据库中的值均为2019。
- 使用两位字符串表示,范围为'00'—'99'。其中,'00'—'69'范围的值会被转换为 2000—2069范围的YEAR值,'70'—'99'范围的值会被转换为1970—1999范围的YEAR 值。例如,输人'19'插人到数据库中的值为2019。
- 使用两位数字表示,范围为1—99。其中,1—69范围的值会被转换为2001— 2069范围的YEAR值,70—99范围的值会被转换为1970—1999范围的YEAR值。例 如,输人19插入到数据库中的值为2019。
请注意:当使用YEAR类型时,一定要区分'0'和0。因为字符串格式的'0'表示的YEAR值是2000而数字格式的0表示的YEAR值是0000。
DATETIME类型
DATETIME类型用于表示日期和时间,它的显示形式为'YYYY-MM-DD HH: MM:SS',其中,YYYY表示年,MM表示月,DD表示日,HH表示小时,MM表示分,SS 表示秒。在MySQL中,可以使用以下4种格式指定DATETIME类型的值。
以'YYYY-MM-DD HH:MM:SS'或者'YYYYMMDDHHMMSS'字符串格式表示的日期和时间,取值范围为'1000-01-01 00:00:00'—'9999-12-3 23:59:59'。例如,输人'2019-01-22 09:01:23'或 '20140122_0_90123'插人数据库中的 DATETIME 值都为 2019-01-22 09:01:23。
以'YY-MM-DD HH:MM:SS'或者'YYMMDDHHMMSS'字符串格式表示的日期和时间,其中YY表示年,取值范围为'00'—'99'。与DATE类型中的YY相同,'00'— '69'范围的值会被转换为2000—2069范围的值,'70'—'99'范围的值会被转换为1970—1999范围的值。
以YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期
和时间。例如,插入20190122090123或者190122090123,插人数据库中的DATETIME值都 为 2019-01-22 09:01:23。使用NOW来输人当前系统的日期和时间。
6.二进制类型
在MySQL中常用BLOB存储二进制类型的数据,例如:图片、PDF文档等。BLOB类型分为如下四种:
四、数据库和数据表的基本操作
创建数据库
MySQL安装完成后,要想将数据存储到数据库的表中,首先要创建一个数据库。创 建数据库就是在数据库系统中划分一块空间存储数据,语法如下:
create database 数据库名称;
示例:
create database db01;
效果展示:
创建数据库后查看该数据库基本信息,语法如下:
show create database 数据库名;
示例:
show create database db01;
效果展示:
从这里可以看出,刚才创建的数据库采用的是utf8作为字符集。
当然,我们还可以在创建数据库时为其指定字符集。
删除数据库
语法如下:
drop database 数据库名;
示例:
drop database db01;
效果展示:
查询数据库
语法: show databases;
查询出MySQL中所有的数据库。
修改数据库
将数据库的字符集修改为gbk
alter database 数据库名 character set gbk;
效果展示:
表示现在开始使用某个数据库。例如:
查看当前使用的数据库
select database();
创建数据表
数据库创建成功后可在该数据库中创建数据表(简称为表)存储数据。请注意:在操作数据表之前应使用“USE 数据库名;”指定操作是在哪个数据库中进行先关操作,否则会抛出“No database selected”错误。
语法如下:
create table 表名(
字段1 字段类型,
字段2 字段类型,
…
字段n 字段类型
);
示例:创建员工表
```sql
use db1;
create table employee(
id int,
name varchar(10),
gender varchar(10),
birthday date,
entry_date date,
job varchar(200),
salary double,
resume varchar(300)
);
查看数据表
查看当前数据库中所有表
show tables;
查表的基本信息
show create table 表名;
示例如下:
查看表的字段信息
describe 表名
也可以简写为:
desc 表名;
示例如下:
describe employee;
修改数据表
修改表的字符集
alter table 表名 character set 字符集;
示例如下:
alter table employee character set gbk;
修改表名
alter table 旧表名 rename to 新表名;
示例如下:
alter table employee rename to emp;
修改字段名
alter table 表名 change 旧字段名 新字段名 新字段的数据类型;
示例如下:
alter table emp change salary money double;
修改字段数据类型
alter table 表名 modify 字段名 新的数据类型;
示例如下:
alter table emp modify money int(20);
增加字段
alter table 表名 add 新字段名 数据类型 [约束条件][first丨after 已存在字段名];
在该语法中,“新字段名”为新添加字段的名称,“first”为可选参数用于将新添加的字段设置为表的第一个字段;“after”也为可选参数用于将新添加的字段添加到指定的已存在字段名的后面。
示例如下:
alter table emp add address varchar(30);
删除字段
alter table 表名 drop 字段名;
示例如下:
alter table emp drop address;
删除数据表
drop table 表名;
示例如下:
drop table emp;
五、表的约束
为防止错误的数据被插入到数据表,MySQL中定义了一些维护数据库完整性的规则;这些规则常称为表的约束。常见约束如下:
以上五种约束条件针对表中字段进行限制从而保证数据表中数据的正确性和唯一性。换句话说,表的约束实际上就是表中数据的限制条件。
主键约束
主键约束即primary key用于唯一的标识表中的每一行。被标识为主键的数据在表中是唯一的且其值不能为空。这点类似于我们每个人都有一个身份证号,并且这个身份证号是唯一的。
主键约束基本语法:
字段名 数据类型 primary key;
设置主键约束(primary key)的第一种方式
CREATE TABLE student(
id int primary key,
name varchar(50)
);
在该方式中将id字段设置为主键,请参见第2行代码
设置主键约束(primary key)的第二种方式
CREATE TABLE student(
id int,
name varchar(50),
primary key(id)
);
在该方式中,先定义了字段id,然后设置该字段为主键,请参见第4行代码。
若采用该方式非常便于设置联合主键,请看如下示例:
CREATE TABLE student(
classid int,
studentid int,
name varchar(50),
primary key(classid,studentid)
);
在该示例中,将classid和studentid定义为联合主键,请参见第5行代码。
请注意:不要把联合主键理解成两个主键;它们是以两个字段联合的形式作为主键。也就是说:这两者共同决定了数据的唯一性。例如,在该实例student表中任意两条数据的classid可能相同或者studentid相同;但是,不允许两条数据的classid和studentid都相同。
设置主键约束(primary key)的第三种方式
CREATE TABLE student(
id int,
name varchar(50)
);
ALTER TABLE student ADD PRIMARY KEY (id);
在该示例中,先创建了表,然后利用ALTER语句设置id字段为主键.
非空约束
非空约束即 NOT NULL指的是字段的值不能为空,基本的语法格式如下所示:
字段名 数据类型 NOT NULL;
示例如下:
CREATE TABLE student(
id int PRIMARY KEY,
name varchar(50) NOT NULL,
gender varchar(10)
);
在该示例中设定name字段为NOT NULL,所以在插入数据时必须为该字段设值。
唯一性约束
唯一性约束即UNIQUE用于保证数据表中字段的唯一性,即表中字段的值不能重复出现,其基本的语法格式如下所示:
字段名 数据类型 UNIQUE;
示例如下:
CREATE TABLE student(
id int primary key,
name varchar(50) unique
);
在该示例中利用unique关键字为字段name添加唯一约束,请参见第3行代码。
AUTO_ INCREMENT约束
在实际开发过程中,常有这样的需求:希望某个字段的值自动生成并且是唯一的。也就是说:想为表中插人的新记录自动生成唯一的ID。此时,可采用AUTO_ INCREMENT约束来实现。AUTOJNCREMENT约束的字段可以是任何整数类型。 默认情况下,该字段的值是从1开始自增的。在执行插入语句时候不必为AUTO_ INCREMENT约束的字段赋值,它会自动增加;其基本的语法格式如下所示:
字段名 数据类型 AUTO_ INCREMENT;
示例如下:
CREATE TABLE student(
id int primary key auto_increment,
name varchar(50)
);
在该示例中将主键id设置为auto_increment,那么该字段的值会自动地增长。执行插入:
insert into student (name) values('lucy');
insert into student (name) values('tom');
图示如下:
默认值约束
默认值约束即DEFAULT用于给数据表中的字段指定默认值,即当在表中插入一条新记录时若未给该字段赋值,那么,数据库系统会自动为这个字段插人默认值;其基本的语法格式如下所示:
字段名 数据类型 DEFAULT 默认值;
示例如下:
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL UNIQUE,
gender VARCHAR(10) DEFAULT '女'
);
在该示例中为gender字段设值了默认值,所以可以用如下方式插入数据:
insert into student(id,name) values(1,'toc');
insert into student(id,name,gender) values(2,'jok','男');
insert into student(id,name,gender) values(3,'jerry',default);
外键约束
外键约束即FOREIGN KEY常用于多张表之间的约束。基本语法如下:
CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段)
ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段);
外键名常用命名方式:
fk_从表名_从表外键字段
外键
外键是指引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约 束。外键用于建立和加强两个表数据之间的连接。为了更好地理解外键的定义及其作用,我们来看如下两张表:
student表
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
gender VARCHAR(10) DEFAULT '男'
);
score表
CREATE TABLE score(
scoreid INT PRIMARY KEY,
studentid INT ,
scoreresult INT
);
score表中的studentid学生编号表示成绩是属于哪个学生,该值必须是student表中id列里的值。这种情况下:学生表student被称为主表,分数表score被称为从表。所以,我们可利用外键FOREIGN KEY将score中的studentid与student表中id建立起联系;代码如下:
student表
CREATE TABLE student(
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
gender VARCHAR(10) DEFAULT '男'
);
score表
CREATE TABLE score(
scoreid INT PRIMARY KEY,
studentid INT ,
scoreresult INT,
CONSTRAINT fk_score_studentid FOREIGN KEY (studentid) REFERENCES student(id)
);
当然,也可利用SQL语句设置外键,代码如下:
ALTER TABLE score ADD CONSTRAINT fk_score_studentid FOREIGN KEY(studentid) REFERENCES student(id);
现在,我们再来执行:
show create table score;
图示如下:
从这里可以看出:studentid为表score的外键;并且studentid依赖于student表的id
测试数据:
INSERT INTO student(id,name,gender) VALUES(1,'tome',DEFAULT);
INSERT INTO student(id,name,gender) VALUES(2,'lucy','女');
INSERT INTO student(id,name,gender) VALUES(3,'jocy','女');
INSERT INTO student(id,name,gender) VALUES(4,'mimu',DEFAULT);
INSERT INTO score(scoreid,studentid,scoreresult) VALUES(200,1,98);
INSERT INTO score(scoreid,studentid,scoreresult) VALUES(201,2,97);
INSERT INTO score(scoreid,studentid,scoreresult) VALUES(202,3,93);
INSERT INTO score(scoreid,studentid,scoreresult) VALUES(205,4,69);
数据一致性
大家知道:建立外键是为了保证数据的完整和统一性。但是,如果主表中的数据被删除或修改从表中对应的数据该怎么办呢?很明显,从表中对应的数据也应该被删除,否则数据库中会存在很多无意义的垃圾数据。
删除外键约束
语法如下:
alter table 从表名 drop foreign key 外键名;
示例如下:
alter table score drop foreign key fk_score_studentid;
然后执行:
show create table score;
由此可见,从表score的外键约束已被删除。
外键约束小结
- 从表里的外键通常为主表的主键
- 从表里外键的数据类型必须与主表中主键的数据类型一致
- 主表发生变化时应注意主表与从表的数据一致性问题