MySQL B站(1-19集)

144 阅读6分钟

reference

www.bilibili.com/video/BV1NJ…

数据库

作用:存数据

数据库,是一个软件

数据库分类

  • 关系型数据库(SQL) MySQL, oracle, sql server 通过表和表之间,行和列之间的关系进行数据的存储,如学员信息表,考勤表...

  • 非关系型数据库(NoSQL) not only SQL Redis,MongoDB 对象存储,通过对象的自身的属性来决定

DBMS (数据库管理系统)

比如,我们写在Excel的数据,得用Excel打开。就算我们没有这个Excel这个软件,那些数据也是存在的。

作用:数据库的管理软件,管理和操作数据

DBMS和DB的关系:DSMS去DB里面操作数据,DB是存数据的

MySQL

5.7版本稳定 8.0也在用

关键4步:启动MySQL、用账户密码登录、退出登录、关闭MySQL

1. 启动MySQL服务
    1.1 方法一:mac 在系统偏好设置里面去启动
    1.2 方法二:sudo /usr/local/MySQL/support-files/mysql.server start

2. 终端输入:mysql -u root -p
3. 输入密码,回车后进入mysql命令行
4. 输入:exit; 退出登录
5. 关闭Mysql服务
    5.1 方法一: mac 在系统偏好设置里面去关闭
    5.2 方法二: sudo /usr/local/mysql/support-files/mysql.server stop

重启MySQL服务

sudo /usr/local/mysql/support-files/mysql.server restart

命令行连接数据库

终端变成这样: >mysql

所有的语句都使用分号结尾

单行注释: --

多行注释: 
/*
hello
bye
*/

退出: exit;

show databases;

use db_name;

show tables;

describe tabele_name;

exit;

操作数据库

操作数据库>操作数据库中的表>操作数据库中表的数据

mysql关键字不区分大小写

[] 可选 () 必选

如果你的表名或者字段名是一个特殊字符,就需要带 ``

SELECT `user` FROM student;

(注:user是特殊字符,已经被用了的;不然就会变成这样:SELECT USER FROM student;)

数据库的列类型

数值

- int 标准的整数 4个字节 ***常用***

- decimal 字符串形式的浮点数 金融计算的时候,一般使用decimal

字符串

- char 字符串固定大小的 0-255

- varchar 可变字符串 0-65535 ***常用***

- text 文本串 2的16次方-1 保存文本

时间日期

- date YYYY-MM-DD

- time HH:mm:ss

- datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式 ***常用***

- timestamp 时间戳 毫秒数 较为常用

- year

null

没有值,未知

不要使用null进行运算

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

default

comment

not null

auto_increment 自增

unsigned 声明该列不能为负数

写SQL注意点

使用英文的()

表的名称,字段,尽量用 `` 包括起来

AUTO_INCREMENT 自增

所有的语句后面加 , (英文的),最后一条语句不用加

PRIMARY KEY 主键 一般一个表只有唯一一个主键

sql 的大小写不敏感(建议写小写,不然自己不认识)

CREATE TABLE IF NOT EXISTS `student` (
	`id` INT 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 'birthday',
	`address` VARCHAR(100) DEFAULT NULL COMMENT 'address',
	`email` VARCHAR(50) DEFAULT NULL COMMENT 'emial',
	PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

格式

注:下文用[]括起来的,表示可选的

CREATE TABLE [IF NOT EXISTS] `表名` (
	`字段名` 列类型 [属性] [索引] [注释]
	PRIMARY KEY(`主键名`)
)[表类型][字符集设置]

常用命令

SHOW CREATE DATABASE school; -- 查看创建数据库school的语句

SHOW CREATE TABLE student; -- 查看student数据表的定义语句

DESC student; -- 显示表的结构

数据库引擎

INNODB 默认使用

MYISAM 早些年使用的

区别:略。。

INNODB引擎,所有数据库文件都存在data目录下,本质还是文件的存储。

设置数据库表的字符集编码

MySQL默认的编码,不支持中文

所以在创建数据库表的时候修改为如下:

CHARSET=utf8

修改表 的公式

修改表名

ALTER TABLE `teacher` RENAME AS teacher1;
-- 从 teacher 修改为 teacher1

增加表的字段

ALTER TABLE `teacher1` ADD `gender` VARCHAR(3);

修改表的字段

ALTER TABLE `teacher1` MODIFY `age` VARCHAR(11);  -- 修改约束

ALTER TABLE `teacher1` CHANGE `age` `age1` INT;  -- 字段重命名

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

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

删除表的字段

ALTER TABLE teacher1 DROP age1;

删除表 的公式

DROP TABLE if EXISTS teacher1;

所有创建和删除操作,尽量加上判断,以免报错

MySQL数据管理

外键 (了解即可)

key word: constraint 约束

引入外键的目的:比如有学生表和年级表2张表,要查学生的年级信息,得关联起来。

学生表字段:学生id age sex 等
年级表字段:年级id 年级名 年级负责人 等

敲命令行写,有2种方式:1. 建表的时候加外键;2. 创建表的时候没有外键,用alter修改表,constraint增加外键。 【略,但是得看懂】

这2种方式都是物理外键,数据库级别的外键,我们不建议使用!(避免数据库过多造成困扰,了解即可)

最佳实践

  • 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)

  • 我们想要使用多张表的数据,想使用外键(程序去实现)

【强制】 不得使用外键与级联,一切外键概念必须在在应用层解决

(不然每次做delete或者update的时候都必须考虑外键约束)

DML语言 (全部记住)

数据操作语言

  • insert

  • update

  • delete

添加

以下是grade表,字段为:gradeid, gradename, pwd

INSERT INTO `grade`(`gradename`) VALUES('大四');  -- 插入单个字段

INSERT INTO `grade` VALUES(2,'大三'); -- 如果不写表的字段,它就会一一匹配,其它为空null

INSERT INTO `grade`(`gradename`) VALUES('大二'),('大一'); -- 插入多行

INSERT INTO `grade`(`gradename`,`pwd`) 
VALUES ('高三','123456'); -- 插入多列  (sql语句可以换行写)
-- 另一个student表的例子
INSERT `student` (`name`,`pwd`,`sex`,`gradeid`) 
VALUES('lake','123456','1','6'),('lake2','123456','2','8');
语法

INSERT INTO 表名([字段名1,字段2,字段3]) VALUES('值1','值2','值3');

注意事项:

写插入语句,一定要数据和字段一一对应

字段是可以省略的,但是后面的值必须一一对应

可以同时插入多条数据

修改

UPDATE `student` SET `name`='lake' WHERE id=1; -- 修改一个属性

UPDATE `student` SET `name`='lake',`email`='qq.com' WHERE id=1; -- 修改多个属性
语法

UPDATE 表名 SET 列名1='值1'[,列名2='值2'] WHERE [条件];

符号:

  • 不等于:!= 或者 <>

    UPDATE student SET name='lake' WHERE id!=1;

    UPDATE student SET name='lake' WHERE id<>1;

  • 闭合区间: between ... and ...

    UPDATE student SET name='lake' WHERE id BETWEEN 1 AND 2; -- 包括id为1,id为2

  • AND 多个条件

  • OR

  • 其它简单的:< = > >= <=(小于 等于 大于...)


注意点:

筛选的条件,如果没有指定,则会修改所有的列

value,是一个具体的值,也可以是一个变量(一般只有时间会用)

删除

DELETE FROM `student` WHERE id = 1;

专业的删数据命令:TRUNCATE student (好处:清空自增)

避免使用:DELETE FROM student (不会清空自增)

语法

DELETE FROM student WHERE id = 1;

DQL查询数据 (重点)

以下所有的代码,都是操作 school.sql 的。

所有的查询操作都用它 Select

数据库中最核心的语言,最重要的语句

简单查询

SELECT * FROM student;

-- 查询指定字段
SELECT `StudentNo`,`StudentName` FROM student; 

-- 别名,给结果起名 (可以给字段、表起别名)
SELECT `StudentNo` AS 学号,`StudentName` AS 学生姓名 FROM student AS S; 

-- 函数 contact(a,b)
SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student; -- 输出:姓名:学生名

去重

-- 查询有哪些同学参加了考试
SELECT `StudentNo` FROM `result`;

SELECT DISTINCT `StudentNo` FROM `result`; -- 去重

表达式

SELECT `StudentNo`,`StudentResult`+1 AS 提分 FROM `result`;

where


-- 以下2种:区间

SELECT `StudentNo`,`StudentResult` FROM `result`
WHERE StudentResult>=95 AND StudentResult<=100;

SELECT `StudentNo`,`StudentResult` FROM `result`
WHERE StudentResult BETWEEN 95 AND 100;

-- 以下2种:不等于

SELECT `StudentNo`,`StudentResult` FROM `result`
WHERE StudentResult !=70;

SELECT `StudentNo`,`StudentResult` FROM `result`
WHERE NOT StudentResult=70;

模糊查询

包括:

  • like

  • in

  • null

  • not null

  • between ... and

Like

-- 查询刘姓, %(代表0到任意个字符) _(代表一个字符)

-- 查所有刘姓
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE '刘%';

-- 查所有刘姓中,名字后面有1个字
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE '刘_';

-- 查所有刘姓中,名字后面有2个字
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE '刘__';

-- 查名字中有 强 的
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE '%强%';
in

in(具体的一个,或者多个值)

SELECT `StudentNo`,`StudentName` FROM `student`
WHERE address IN('安徽');

SELECT `StudentNo`,`StudentName` FROM `student`
WHERE studentno IN(1001,1003);
null , not null
-- 查询为空的
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE borndate IS NULL;

-- 查询不为空的
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE borndate IS NOT NULL;

todo: 看到19集