mysql基础
mysql笔记v-1.0
1.0 初识数据库
1.1 为什么学习数据库
- 岗位技能需求
- 得数据者得天下
- 存储数据的方法
- 程序网站中,大量的数据需要长久保存
- 数据库几乎是软件体系中最核心的一个存在
1.2 什么是数据库
数据库(database,简称DB)
概念:长期存放在计算机内,有组织。可共享的大量数据的集合,是一个数据的“仓库”
作用:保存,并能安全管理数据(如:增删改查),减少冗余,,,
数据库总览:
- 关系型数据库(SQL)
- mysql,oracle,SQL server ,SQLlite,DB2.....
- 关系型数据
- 非关系型数据库(NOSQL)
- redis,MongoDB,.....
- 关系型数据库通常指数据一对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定
1.3 什么是DBMS
数据库管理系统(database manager system)
数据库管理软件,科学组织和存储数据,高效的获取和维护数据。
mysql就算是一个数据库管理系统
1.4 MySQL简介
概念:现在流行的开源的,免费的,关系型的数据
历史:有瑞典MySQ AB 公司开发,目前属于oracle旗下产品
特点:
- 免费,开源
- 小巧,,功能齐全
- 使用便捷
- 可运行Windows和Linux操作系统
- 官网:https://www.mysql.com
1.5 安装MySQL
这里使用压缩版安装,因为比较方便,安装快,不复杂
1,软件下载
MySQL5.5 64位: https://cdn.mysql.com//archives/mysql-5.7/mysql-5.7.19-winx64.zip
2,步骤
1,下载后得到zip压缩包
2,解压到自己要安装软件的目录
D:\app\mysql5.7
3,添加环境变量
我的是win11系统,和win10 有些不一样,具体步骤如图
在桌面点击 -->此电脑(右键)-->属性-->系统信息-->高级系统设置,
依次点击,添加完后要记住退出保存
至此,mysql的环境变量就配置完成了
3,编辑 my.ini 文件,注意替换路径位置
如果文件格式有问题,看不到后缀名,设置下显示文件后缀名就可以了
打开配置文件,添加以下内容,
-
basedir填自己的mysql的地址
-
database 也修改下,之后会自动生成这个目录
-
skip-grant-tables #意思是跳过密码验证,添加密码之后是要注释掉的,目前不改动
[mysqld]
basedir=D:\app\mysql5.7\
datadir=D:\app\mysql5.7\data\
port=3306
skip-grant-tables
5,启动管理员模式下的CMD,并将路径切换到mysql下的bin目录,然后输入 mysqld –install 安装mysql
D:\app\mysql5.7\mysql-5.7.19-winx64\bin> cd /d D:\app\mysql5.7\mysql-5.7.19-winx64/bin #Windows下进入目录也可以使用cd命令,和Linux很像,不过要加一个 /d
D:\app\mysql5.7\mysql-5.7.19-winx64\bin> mysqld -install
Service successfully installed. #安装成功了!
D:\app\mysql5.7\mysql-5.7.19-winx64\bin>
6、再输入 mysqld --initialize-insecure --user=mysql
初始化数据文件
7、再次启动mysql net start mysql
,然后用命令 mysql –u root –p
进入mysql管理界面(密码可为空),直接回车就可以进入mysql了。
- 出现无法启动的问题,输入
mysqld --initialize-insecure
之后就可以启动成功了。这步在mysql的根目录下自动创建了data文件夹以及相关的文件
8、进入界面后更改root密码
学习阶段修改为 123456 吧,和博主同步。
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
9,刷新下权限
flush privileges;
10、修改 my.ini文件删除最后一句skip-grant-tables
11、退出数据库exit
,重新启动mysql net stop mysql
net start mysql
即可正常使用
两种登录方式
12,注释掉 my.ini 文件的跳过密码验证
此时mysql就安装好了。
之后使用的的一个SQLyog的连接数据库的软件
1.6 SQLyog
1,安装和使用推荐这个博客:https://www.cnblogs.com/pengpengdeyuan/p/14364777.html
这个没什么好说的,如果之后有时间详细写写吧。
登录界面:
登录进去就是这个效果:
使用SQLyog管理工具自己完成以下操作 :
-
连接本地MySQL数据库
-
新建MySchool数据库
-
数据库名称MySchool
-
新建数据库表(grade)
-
字段
-
GradeID : int(11) , Primary Key (pk)
-
GradeName : varchar(50)
-
-
-
在历史记录中可以看到相对应的数据库操作的语句 .
添加完数据之后要点击下刷新,然后保存即可、
1.7 连接数据库
命令行连接
mysql -uroot -p -- -p后面添加密码,或者按照上面的方法连也可以的。都是一样的。
--sql 中‘--’代表一行的注释
常用命令
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost'; --修改密码
show database; --查看所有的数据库
use dbname; --使用某一个数据库‘dbname代表的是数据库名’
show tables; --显示数据mysql中所有的表
describe user; --显示数据库中所有的表的信息
create database name; -- 创建数据库
use databasename; 选择数据库
exit --退出mysql
-- 表示注释
2.0 操作数据库
操作数据库--->操作数据库中的表---->操作数据库中表的数据。
2.1 结构化查询语句分类
mysql数据库的命令不分大小写
名称 | 解释 | 命令 |
---|---|---|
DDL (数据定义语言) | 定义和管理数据对象,如数据库,数据表等 | create,drop,alter |
DML(数据操作语言) | 用户操作数据库对象中所包含的数据 | Iinsert,update,deletc |
DQL (数据查询语言) | 用于查询数据库数据 | select |
DCL(数据控制语言) | 用于管理数据库的语言,包括管理权限和数据更改 | grant,commit,rollback |
2.2 数据库操作
创建数据库:create databases [if not exists] 数据库名;
删除数据库:drop databases [if exists] 数据库名;
查看数据库:show databases;
使用数据库:use 数据库名
2.3 创建数据表
属于DDL一种,语法:
create table [if not exists] `表名`(
'字段名1' 列类型 [属性][索引][注释],
'字段名2' 列类型 [属性][索引][注释],
#...
'字段名n' 列类型 [属性][索引][注释]
)[表类型][表字符集][注释];
说明:反引导用于区别MySQL保留字与普通字符而引入的 ` 符号
2.4 数据值和列类型
列类型:规定数据中该列存饭的数据类型
数值类型
类型 | 说明 | 取值范围 | 存储需求 |
---|---|---|---|
tinyint | 非常小的数据 | 1个字节 | |
smallint | 较小的数据 | 2字节 | |
mediumint | 中等大小的数据 | 3字节 | |
int | 标准整数 | 4字节 | |
bigint | 较大的整数 | 8字节 | |
fioat | 单精度浮点数 | 4字节 | |
double | 双精度浮点数 | 8字节 | |
decimal | 字符串形式的浮点数,金融计算使用较多 | decimal(m,d) | m个字节 |
字符串类型
类型 | 说明 | 最大长度 |
---|---|---|
char | 固定长字符串,检索快但是废空间 | 0~255 |
varchar | 可变字符串 | 0~65535 |
tinytext | 微型文本串 | 2^8 -1 |
text | 文本串 | 2^16 -1 |
日期的时间型和数值类型
类型 | 说明 | 取值范围 |
---|---|---|
date | yyyy-mm-dd | 日期格式 |
time | Hh:mm:ss | 时间格式 |
datetine | yyyy-mm-dd Hh:mm:ss | 常用的时间格式 |
datestamp | yyyy格式的年份值 | 1970,1,1 毫秒级别 的数值类型 |
year | yyyy格式的年份值 | 1901~2155 |
null
- 理解为“没有值”,或者“未知值”
- 不要使用null进行运算,否则结果仍为null
2.5 数据字段属性
unsigned
- 无符号的整数
- 声明了该列不能声明为负数
zerofil
- 0填充的
- 不足的位数,使用0来填充, int (3) ,5---005
自增
通常理解为自动在上一条记录上的基础上 +1 (默认)
- 用来设计唯一的主键~index ,必须是整数类型
- 可以自定义设计主键的起始值和步长
非空null not null
- 设置为null not ,如果不赋值,就会报错
- null,如果不写值,默认就是null
默认
- 设置默认的值
- sex ,默认为 男 ,如果不指定该列的值,则会有默认的值。
-- 目标 : 创建一个school数据库
-- 创建学生表(列,字段)
-- 学号int 登录密码varchar(20) 姓名,性别varchar(2),出生日期(datatime),家庭住址,email
-- 创建表之前 , 一定要先选择数据库
-- auto incerememt 自增
-- PRIMARY KEY 主键
CREATE TABLE IF NOT EXISTS `student4` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭地址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
-- 查看数据库的定义
SHOW CREATE DATABASE school;
-- 查看数据表的定义
SHOW CREATE TABLE student;
-- 显示表结构
DESC student; -- 设置严格检查模式(不能容错了)SET
sql_mode='STRICT_TRANS_TABLES';
sqlyog的执行效果图片:
2.6 数据库的类型
设置数据库的类型
MySQL的数据表的类型,myisam,innodb,bob,cvs,等.....
常见的myisam 与inndb类型:
名称 | myisam | innoDB |
---|---|---|
事务处理 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大,约2倍 |
适应场景:
- MyiSAM L:节约空间及响应速度
- InnDB:安全性,事务处理以及多用户操作数据表
数据表的存储位置
- MySQL数据表以文件的方式村子磁盘中
- 包括表文件,数据文件,以及数据库中的选项文件
- 位置:MySQL安装目录\data\下存放数据表,目录对应数据库名,该目录下文件名对应数据表
- 注意:
- InnoDB 类型的数据表只有一个*.frm文件,以及上一级目录的ibdata文件
- MyISAM类型数据表对应三个文件:
- *frm --表结构对应文件
- *MYD --数据文件(data)
- *.MYI --索引文件(index)
设置数据表的字符集
- 可以命令来设置,
create table 表名(CHATSET)=utf8;
- 如无设定,可以在MySQL数据库配置文件
my.ini
中参数设定
2.7 修改数据库
修改
--修改表名:ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE `student4` RENAME AS `student4.1`;
--增加表的字段:alter TABLE 表名 ADD 字段名 列属性
ALTER TABLE `student4.1` ADD age INT(11);
--修改表的字段(重命名,修改约束)
-- alter table 表名 modify 字段名 列属性
ALTER TABLE `student4.1` MODIFY age VARCHAR(11) --修改约束
-- alter table 表名 change 旧名字 新名字 列属性
ALTER TABLE `student4.1` CHANGE age age1 INT(1); --字段重命名
--删除表的字段:alter TABLE 表名 DROP 在、字段名
ALTER TABLE `student4.1` DROP age1;
3.0 MySQL数据管理
3.1 外键
概念
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被另一个关键字称之为另一个关键字的外键,由此可见,外键表示了两个关系之间的相关联系,以另一个关系的外键作用作为主关键字的表称为主表,具有此外键的表称之为主表的从表
在实际操作中,将一个表放入到第二个表表示关联,所使用的值是第一个表的主键值(在必要的时打包包括复合主键值),此时第二个表中保存这些值称之为外键(foreign key)
外键作用
保持数据的一致性,完整性,主要的目的是控制存储在外键表中的数据,约束,是两张表形成关联,外键只能引用表中列的值或者使用空值。
创建外键
-- 创建外键的方式一 : 创建子表同时创建外键
-- 年级表 (id\年级名称)
CREATE TABLE `grade4` (
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `student4` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭地址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
`idcard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
`gradeid` INT(10) NOT NULL COMMENT '年级id',
PRIMARY KEY (`id`),
KEY `FK_gardeid` (`gradeid`),
CONSTRAINT `FK_gardeid` FOREIGN KEY (`gradeid`) REFERENCES `grade4` (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
ALTER DATABASE 数据库名
ENGINE=INNODB
DEFAULT CHARSET=utf8;建表后修改
3.2 DML 语言(全部记住)
数据库的意义:数据存储,数据管理
管理数据库的数据方法:
- 通过可视化工具(sqlyog)等一些其他类似的工具管理
- 通过DML语句管理数据库数据
DML语言:数据库操作语言
- 用于操作数据库中对象锁包含的数据
- 包括:
- insert(添加数据语句)
- update(更新数据语句)
- delete(删除数据语句)
3.3 添加语句
数据库语句:
insert 命令
语法:
3.3 删除
delete命令
语法:
delect from 表名 [where condition];
condition为筛选条件,如不指定则删除该表的所有数据
truncate 命令
作用:用于完全清空表数据,但是表结构,索引,约束等不变。
语法:
truncate [table] table_name;
-- 清空年级表
truncate grade;
注意;区别delete命令
- 相同:都能删除数据,不删除表结构,但truncate速度更快
- 不通:
- 使用truncate table 重新设置auto_increment计数器
- 使用truncate table不会对事务有影响
测试:
-- 创建一个school数据库
CREATE DATABASE IF NOT EXISTS `school`;
USE `school`;-- 创建学生表
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`(
`studentno` INT(4) NOT NULL COMMENT '学号',
`loginpwd` VARCHAR(20) DEFAULT NULL,
`studentname` VARCHAR(20) DEFAULT NULL COMMENT '学生姓名',
`sex` TINYINT(1) DEFAULT NULL COMMENT '性别,0或1',
`gradeid` INT(11) DEFAULT NULL COMMENT '年级编号',
`phone` VARCHAR(50) NOT NULL COMMENT '联系电话,允许为空',
`address` VARCHAR(255) NOT NULL COMMENT '地址,允许为空',
`borndate` DATETIME DEFAULT NULL COMMENT '出生时间',
`email` VARCHAR (50) NOT NULL COMMENT '邮箱账号允许为空',
`identitycard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
PRIMARY KEY (`studentno`),
UNIQUE KEY `identitycard`(`identitycard`),
KEY `email` (`email`)
)ENGINE=MYISAM DEFAULT CHARSET=utf8;
-- 创建年级表
DROP TABLE IF EXISTS `grade`;
CREATE TABLE `grade`(
`gradeid` INT(11) NOT NULL AUTO_INCREMENT COMMENT '年级编号',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY (`gradeid`)
) ENGINE=INNODB AUTO_INCREMENT = 6 DEFAULT CHARSET = utf8;
-- 创建科目表
DROP TABLE IF EXISTS `subject`;
CREATE TABLE `subject`(
`subjectno`INT(11) NOT NULL AUTO_INCREMENT COMMENT '课程编号',
`subjectname` VARCHAR(50) DEFAULT NULL COMMENT '课程名称',
`classhour` INT(4) DEFAULT NULL COMMENT '学时',
`gradeid` INT(4) DEFAULT NULL COMMENT '年级编号',
PRIMARY KEY (`subjectno`)
)ENGINE = INNODB AUTO_INCREMENT = 19 DEFAULT CHARSET = utf8;
-- 创建成绩表
DROP TABLE IF EXISTS `result`;
CREATE TABLE `result`(
`studentno` INT(4) NOT NULL COMMENT '学号',
`subjectno` INT(4) NOT NULL COMMENT '课程编号',
`examdate` DATETIME NOT NULL COMMENT '考试日期',
`studentresult` INT (4) NOT NULL COMMENT '考试成绩',
KEY `subjectno` (`subjectno`)
)ENGINE = INNODB DEFAULT CHARSET = utf8