MySQL从入门到删库

Posted 生命是有光的

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL从入门到删库相关的知识,希望对你有一定的参考价值。

0.概述

  1. mysql基础笔记,复习回顾使用
  2. 环境搭建:MySQL数据库详细安装步骤直达
名称解释命令
DDL(数据定义语言)定义和管理数据对象,如数据库,数据表等create、drop、alter
DML(数据操作语言)用于操作数据库对象中所包含的数据insert、update、delete
DQL(数据查询语言)用于查询数据库数据select
DCL(数据控制语言)用于管理数据库的语言,包括管理权限及数据更改grant、commit、rollback

1.操作数据库

  • 操作数据库 > 操作数据库中的表 > 操作数据库中表的数据
  • mysql 关键字不区分大小写

1.1操作数据库

  • 创建数据库create database [if not exists] 数据库名;

  • 删除数据库drop database [if exists] 数据库名;

  • 使用数据库use 数据库

-- 使用数据库 `school`
use `school`;
  • 查看数据库show databases

使用SQLyog创建数据库时,需要选择

  • 基字符集:utf8
  • 数据库排序规则:utf8_unicode_ci

在这里插入图片描述

1.2数据库的列类型

  • 列类型 : 规定数据库中该列存放的数据类型

数值类型

类型说明存储需求
tinyint非常小的数据1个字节
smallint较小的数据2个字节
mediumint中等大小的数据3 个字节
int标准整数4个字节
bigint较大的整数8个字节
float单精度浮点数4个字节
double双精度浮点数8个字节
decimal字符串形式的浮点数金融计算的时候,一般是使用decimal

字符串

类型说明最大长度
char[(M)]固定长字符串,检索快但费时间0~255个字节
varchar[(M)]可变字符串0~65535个字节
tinytext微型文本串2^8 -1个字节
text文本串2^16-1个字节

时间日期

java.util.Date

类型说明
dateYYYY-MM-DD,日期格式
timeHH:mm:ss,时间格式
datetimeYYYY-MM-DD hh: mm: ss,最常用的时间格式
timestampYYYYMMDDhhmmss格式表示的时间戳,1970.1.1到现在的毫秒数
yearYYYY格式的年份值

null

  • 没有值,未知
  • 注意,不要使用NULL进行运算,因为结果为NULL

1.3 数据库的字段属性(重点)

在这里插入图片描述

Unsigned

  • 无符号的整数
  • 声明了该数据列不允许声明为负数

zerofill

  • 0填充的
  • 不足的位数,使用0来填充 【如int(3), 5则为005】

Auto_InCrement

  • 自动增长的,每添加一条数据,自动在上一条记录的基础上 + 1 (默认)
  • 通常用来设计唯一的主键,且必须是整数类型
  • 可以自定义设计主键自增的起始值和步长(一般不用)

NULL和 NOT NULL

  • 默认为NULL,即没有插入该列的数值

  • 如果设置为 NOT NULL,则该列必须有值

default

  • 设置默认的值!
  • sex,默认值为男,如果不指定该列的值,则会有默认值为“男”的值

扩展

/* 每一个表,都必须存在以下五个字段,未来做项目用到,表示一个记录存在意义!

id  主键
`version`	乐观锁
is_delete   伪删除
gmt_create  创建时间
gmt_update  修改时间
*/

1.4 创建数据库表(重点)

  • 创建一个school数据库
  • 创建学生表
    • 学号int
    • 姓名varchar
    • 密码varchar
    • 性别varchar
    • 出生日期datetime
    • 家庭住址varchar
    • 邮箱varchar
-- 创建数据库 school
CREATE DATABASE IF NOT EXISTS `school`;
-- 删除数据库 student
DROP DATABASE IF  EXISTS `student`;
-- 注意点:表的名称和字段尽量使用 `` 括起来
-- 创建学生表
CREATE TABLE IF NOT EXISTS `student` (
  `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '主键',  		-- id 不为空,自增
  `name` VARCHAR(30) NOT NULL DEFAULT '林晓' COMMENT '姓名',	-- name 不为空,默认为林晓
  `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',	-- pwd 不为空,默认为123456
  `sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',	-- sex 不为空,默认为男
  `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',		-- birthdat 默认为空
  `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',	-- address 默认为空
  `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',		-- email默认为空
    
  PRIMARY KEY (`id`)  									 -- 主键,一般一个表只有一个唯一的主键
)ENGINE=INNODB DEFAULT CHARSET=utf8;

格式

CREATE TABLE [IF NOT EXISTS] `表名`(
	`字段名` 列类型 [属性] [索引] [注释],
    `字段名` 列类型 [属性] [索引] [注释],
    .......
    `字段名` 列类型 [属性] [索引] [注释]
)[表类型][表的字符集设置][注释]

常用命令

SHOW CREATE DATABASE school  -- 查看创建数据库的语句
SHOW CREATE TABLE student    -- 查看student数据表的定义语句
DESC student                 -- 显示表的结构

1.5 数据表的类型

常见的有两种类型:

  • INNODB 默认使用
  • MYISAM 早些年使用的
MYISAMINNODB
事务支持不支持支持
数据行锁定不支持支持
外键约束不支持支持
全文索引支持不支持
表空间的大小较小较大,约为2倍

常规的使用操作

  • MYISAM 节约空间,速度较快
  • INNODB 安全性高,事务的处理,多表多用户操作

数据表的存储位置

MySQL数据表以文件方式存放在磁盘中

  • 位置 : Mysql安装目录\\data 目录下

1.6 修改删除表

修改表(ALTER TABLE)

  • 修改表名alter table 旧表名 rename as 新表名
-- 修改表名 alter table 旧表名 rename as 新表名
ALTER TABLE teacher RENAME AS teacher1
  • 添加字段alter table 表名 add 字段名 列属性[属性]
-- 增加表的字段 alter table 表名 ADD 字段名 列属性
ALTER TABLE teacher1 ADD age INT(11)
  • 修改字段
    • alter table 表名 modify 字段名 列属性[属性]
    • alter table 表名 change 旧字段名 列属性[属性]
-- 修改表的字段 (1.重命名 2.修改约束)
-- ALTER TABLE 表名 MODIFY 字段名 列属性[]
ALTER TABLE teacher1 MODIFY age VARCAHAR(11)  --  修改约束
-- ALTER TABLE 表名 CHANGE 旧名字 新名字 列属性[]
ALTER TABLE teacher1 CHANGE age age1 INT(1)  -- 重命名字段
  • 删除字段alter table 表名 drop 字段名
-- 删除表的字段 ALTER TABLE 表名 drop 字段名
alter table teacher1 drop age1

最终结论

  • change 用来字段重命名,不能修改字段类型和约束
  • modify 不用来字段重命名,只能修改字段类型和约束

删除表

  • 删除表DROP TABLE [IF EXISTS] 表名
-- 删除表
DROP TABLE [IF EXISTS] teacher1

2.MySQL数据管理

2.1 外键(了解)

  • 创建外键

方式一: 创建子表同时创建外键

  • 学生表的gradeid字段,要去引用年级表的 gradeid
      1. 定义外键key
      1. 给这个外键添加约束(执行引用)
-- 年级表
create table `grade`(
    `gradeid` int(10) not null auto_increment comment '年纪id',
    `gradename` varchar(50) noy null comment '年级名称',
    primary key(`gradeid`)
    
)engine=innodb default charset = utf8;

-- 学生表
-- 学生表的gradeid字段,要去引用年级表的 gradeid
-- 1. 定义外键key
-- 2. 给这个外键添加约束(执行引用)
create table if not exists `student` (
    `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 '家庭住址',
    `gradeid` int(10) noy null comment '学生的年级',
    `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
     PRIMARY KEY(`id`), 

     -- 1. 定义外键 FK_gradeid
     KEY `FK_gradeid`(`gradeid`),
     -- 2. 给这个外键添加约束
     CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) references `grade`(`gradeid`)
)ENGINE = INNODB DEFAULT CHARSET = utf8;

方式二:创建表成功后,添加外键约束

-- 创建表的时候没有外键关系
alter table `studnet` add constraint `FK_gradeid` foreign key(`gradeid`) references `grade`(`gradeid`),

以上操作都是物理外键,数据库级别的外键,我们不建议使用!

最佳实践

  • 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
  • 我们想使用多张表的数据,想使用外键(程序去实现)

注意:删除具有主外键关系的表时,要先删子表,后删主表

2.2 DML语言(记住)

数据库意义:数据存储,数据管理

DML语言:数据操作语言

  • Insert
  • update
  • delete

2.3 添加

insert

语法

-- 插入数据(添加)
insert into 表名([字段名1,字段2,字段3]) values('值1'),('值2'),('值3');

注意

  • 字段或值之间用英文逗号隔开
  • 可同时插入多条数据,values 后用英文逗号隔开
  • 由于主键自增我们可以省略(如果不写表的字段,它就会一一匹配)
  • 一般写插入语句,我们一定要数据和字段一一对应!
  • 字段是可以省略的,但是后面的值必须要一一对应
-- 向`grade`表中的`gradename`字段插入
insert into `grade`(`gradename`) values('大四');

-- 插入多个字段
insert into `grade`(`gradename`) 
values('大二'),('大一');

-- 数据和字段一一对应!
insert into `student`(`name`,`pwd`,`sex`) values('张三','aaaa','男');

2.4 修改

update

语法

update 表名 set colnum_name = value,[.....] where [条件]

注意事项

  1. colnum_name 是数据库的列,尽量带上``
  2. 条件,筛选的条件,如果没有指定,则会修改所有的列
  3. value ,是一个具体的值,也可以是一个变量
  4. 多个设置的属性之间,使用英文逗号隔开
update `student` set `name`='狂神' where id = 1;

-- 不指定条件的情况下,会改动所有表!
update `student` set `name`='长江7号'; 

-- 修改多个属性
update `student` set `name`='狂神',`email`='12123@qq.com' where id between 2 and 5;

-- 通过多个条件定位数据 
update `student` set `name`='长江7号' where `name`='狂神' and `sex`='男';
操作符含义范围结果
=等于5=6false
<>或 !=不等于5<>6true
>大于
<小于
<=小于等于
>=大于等于
between…and…在某个范围内[2,5]
and&&5>1 and 1>2false
or||5>1or 1>2true

2.5 删除

delete 命令

语法: delete from 表名 [where 条件]

-- 删除数据,如不指定条件则删除该表的所有列数据
delete from `student`;

-- 删除指定数据
delete from `student` where id = 1;

truncate 命令

作用: 完全清空一个数据库表,表的结构和索引约束不会变

-- 清空student 表
truncate `student`; 

delete 和 truncate 区别

  • 相同点: 都能删除数据,都不会删除表结构,但truncate速度更快
  • 不同点
    • truncate 重新设置 自增列,计数器会归零
    • truncate 不会影响事务

3. DQL 查询数据(最重点)

3.1DQL

(Date Query Language): 数据查询语言

  • 所有的查询操作都用它 ,select
  • 简单 和 复杂的查询都能做
  • 数据库中最核心的语言,最重要的语句

3.2Select语句

基本语法select 字段 from 表

-- 查询全部学生
select * from student;

-- 查询指定字段
select `StudentNo`,`StudentName` from student;

AS子句作为别名

作用:

  • 可给数据列取一个新别名
  • 可给表取一个新别名
  • 也可以给查询结果取一个新别名
-- 别名,给结果起一个名字  AS 可以给字段起别名,也可以给表起别名(AS关键词可以省略)
select `StudentNo` As 学号,`StudentName` AS 学生姓名 from student AS S

-- 函数 拼接字符串Concat(a,b)
select concat('姓名',StudentName) AS 新名字 from student

语法: SELECT 字段1,字段2,..... FROM 表

3.3去重distinct

作用:去掉 select 查询返回的记录结果中重复的记录(返回所有列的值都相同),只返回一条

-- 查询一下有哪些同学参加了考试,成绩
select * from  result;   -- 查询全部的考试成绩
select `StudentNo` from result;   -- 查询有哪些同学参加了考试
select distinct `StudentNo` from result;   -- 发现重复数据,去重

数据库的列(表达式)

  • select 表达式 from 表
  • 数据库中的表达式: 文本值 ,列 , Null ,函数 , 计算表达式 , 系统变量
select version() -- 查询系统版本(函数)
select 100*3-1 AS 计算结果   -- 用来计算(表达式)
select @@auto_increment_increment -- 查询自增的步长(变量)

-- 学员考试成绩 + 1  查看
select `StudentNo`,`StudentResult` + 1 AS '提分后' from result;

3.4where条件子句

作用: 检索数据中符合条件的值

搜索的条件由一个或者多个表达式组成,结果为布尔值!

逻辑运算符

运算符语法描述
and &&a and b a&&b逻辑与,两个都为真,结果为真
or ||a or b a || b逻辑或,其中一个为真,则结果为真
Not !not a !a逻辑非,真为假,假为真

尽量使用英文字母

-- 查询考试成绩在 95 ~ 100分之间的
select studentNo,`StudentResult` 
from result 
where StudentResult>=95 and StudentResult<=100

3.5模糊查询

模糊查询:比较运算符

运算符语法描述
is nulla is null如果操作符为null,结果为真
is not nulla is not null如果操作符不为null,结果为真
betweena between and c若a在b和c之间,则结果为真
likea like bSQL匹配,如果a匹配b,则结果为真
ina in(a1,a2,a3…)假设a在a1或者a2…,则结果为真
-- 除了1000号同学,要其他同学的成绩
SELECT studentno,studentresult
FROM result
WHERE studentno!=1000;

-- 使用NOT
SELECT studentno,studentresult
FROM result
WHERE NOT studentno=1000;

-- 查询 1001,1002,1003号学员
select `Sno`,`Sname` 
from `student`
where `Sno` in (1001,1002,1003);


-- 查询在北京的学生
select `Sno`,`Sname` 
from `student`
where `Address` in ('安徽','河南洛阳');



-- 查询姓刘的同学的学号及姓名
-- like结合使用的通配符 : % (代表0到任意个字符) _ (一个字符)
SELECT studentno,studentname FROM student
WHERE studentname LIKE '刘%';

-- 查询姓刘的同学,后面只有两个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '刘__';

-- 查询姓名中含有 嘉 字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '%嘉%';

-- 查询出生日期没有填写的同学
-- 不能直接写=NULL , 这是代表错误的 , 用 is null
SELECT studentname FROM student
WHERE BornDate IS NULL;

-- 查询出生日期填写的同学
SELECT studentname FROM student
WHERE BornDate IS NOT NULL;

-- 查询没有写家庭住址的同学(空字符串不等于null)
SELECT studentname FROM student
WHERE Address='' OR Address IS NULL;
  • 注意: % _只能在like里面使用
  • in 里面是确切的集合

3.6连接查询

  • 内连接inner join :查询两个表中的结果集中的交集
  • 左外连接left join:以左表为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充
  • 右外连接right join:以右表为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充

数据库的搭建如下:

  • 创建一个school数据库
  • 创建学生表student
  • 创建年级表grade
  • 创建科目表subject
  • 创建成绩表result
-- 创建一个school数据库
CREATE DATABASE IF NOT EXISTS `school`;

-- 创建学生表
CREATE TABLE IF NOT EXISTS `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;

-- 创建年级表
CREATE TABLE IF NOT EXISTS `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;

-- 创建科目表
CREATE TABLE IF NOT EXISTS `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;


-- 创建成绩表
CREATE TABLE IF NOT EXISTS `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;

JOIN 对比

在这里插入图片描述

inner join

  • 分析查询的字段来自哪些表 (来自两个表就用连接查询)
  • 确定交叉点(这两个表中哪个数据是相同的)
  • 判断条件: 学生表中的 studentNo = 成绩表中的 studentNo

在这里插入图片描述

查询参加了考试的同学的学号,姓名,科目编号,分数

  1. 学号,姓名 studentNo,studentName 在student表中
  2. 科目编号,分数 SubjectNo,StudentResult 在result表中
  3. 两个表中 studentNo 是相同的
select t1.studentNo,studentName,SubjectNo,StudentResult
from student as t1
inner join result as t2
-- 既在student表里查,student表连接result,
-- 两个表连起来,都有studentNo,所以要指向一个表的studentNo查
on t1.studentNo = t2.studentNo;

right join

select t1.studentNo,studentName,SubjectNo,StudentResult
from student  t1
right join result t2
on t1.studentNo = t2.studentNo;

left join

select t1.studentNo,studentName,SubjectNo,StudentResult
from student  t1
left join result t2
on t1.studentNo = t2.studentNo;
  • 左表是 student,先从 student里面查学生学号,学生姓名
  • 即使右表result表中没有和学生学号,学生姓名匹配的科目编号,分数
  • 也会返回所有的值,只是科目编号、分数为null
studentNostudentNameSubjectNoStudentResult
1001孙大圣nullnull

3.7总结与区别

操作描述
inner join如果表中至少有一个匹配,就返回行
left join会从左表中返回所有的值,即使右表中没有匹配
right join会从右表中返回所有的值,即使左表中没有匹配
-- 查询缺考的同学
select t1.studentNo,studentName,SubjectNo,StudentResult
from student  t1
left join result t2
on t1.studentNo = t2.studentNo
where StudentResult = null;


-- 查询了参加考试的同学信息: 学号,学生姓名,科目名,考试成绩
-- 1.学号,学生姓名  student表
-- 2.科目名        subject表
-- 3.分数			 result表




-- 具体实现
select t1.studentNo,studentName,SubjectName,StudentResult
from student t1
right join result t2
on t1.studentNo = t2.studentNo
-- 查询考试的信息,要以考试那张表去连,左连就是以左边的表为基准
-- 再在上面所查询的结果中连接第三张表
inner join subject t3
on t2.SubjectNo = t3.SubjectNo;

语法

  • join(连接的表) on(判断条件) 连接查询
  • where 等值查询

3.8自连接(了解)

数据库建立: