Bootstrap

黑马程序员MySQL学习笔记一(超详细版)-MySQL基础篇:MySQL概述、SQL、函数、约束、多表查询、事务

名称:黑马程序员MySQL数据库入门到精通,从MYSQL安装到MYSQL高级、MYSQL优化全囊括
来源:B站黑马程序员
链接:https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=37&share_source=copy_web&vd_source=7119328057c99519c58b56c21a145e82
内容:MySQL基础(初级工程师)、MySQL进阶(中级工程师)、MySQL运维(高级工程师)

本篇笔记为基础篇,仅供学习备用~~如发现笔记中有错误或遗漏,可评论留言,感谢!

1**数据库相关概念及主流的关系型数据库管理系统

  • 数据库:存储数据的仓库,数据是有组织的进行存储,简称DataBase(DB)
  • 数据库管理系统:操纵和管理数据库的大型软件,简称DataBase Management System(DBMS)
  • SQL:操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准,简称Structured Query Language(SQL)
  • 关系型数据库管理系统:
    • Oracle,收费的大型数据库,Oracle公司的产品,价格昂贵
    • MySQL,开源免费的中小型数据库,后来sun公司收购了MySQL,而sun公司又被Oracle公司收购。(目前Oracle推出了收费版本的MySQL,也提供了免费的社区版本)
    • SQL Server,Microsoft公司收费的中型的数据库,C#、net等语言常使用
    • PostgreSQL,开源免费中小型的数据库
    • DB2,IBM公司的大型收费数据库产品
    • SQLite,嵌入式的微型数据库,如,作为Android内置数据库
    • MariaDB,开源免费的中小型数据库。是MySQL数据库的另外一个分支、另外一个衍生产品,与MySQL数据库有很好的兼容性

2**MySQL安装及启动

社区版,MySQL Community Server,免费,MySQL不提供任何技术支持,课程采用社区版(MySQL Community Server 8.0.26)
商业版,MySQL Enterprise Edition,收费,可以使用30天,官方提供技术支持
下载地址 https://dev.mysql.com/downloads/windows/installer/8.0.html

启动或停止MySQL(两种方式)

  1. Win+R输入命令services.msc,里面的MySQL 80就是(安装时自动注册的名称,默认是MySQL 80)。这里还可以修改MySQL自启动还是手动开启。
    services.msc
    servises.msc_2
  2. 在命令行输入指令,搜索cmd,以管理员身份运行
    cmd
//启动服务,这里的MySQL80指的是安装注册Windows service name的名字
net start mysql80
//停止服务
net stop mysql80

s

MySQL客户端连接(两种方式)

  1. 使用MySQL提供的客户端命令行工具,MySQL command line client ,Enter password输入的密码就是下载安装时设置的密码(学习中跟随老师设置了123456,设了最好不要修改,免得忘记了)
    client
    password
  2. 系统自带的命令行工具执行指令
mysql [-h 127.0.0.1] [-P 3306] -u root -p
//参数:[]内为可选参数,如果需要连接远程的MySQL,需要加上这两个参数来指定远程主机IP、端口
//如果连接本地的MySQL,则无需指定这两个参数。
//-h : MySQL服务所在的主机IP,可以省略,默认本地
//-P : MySQL服务端口号,可以省略,默认3306
//-u : MySQL数据库用户名,如以root用户连接
//-p :MySQL数据库用户名对应的密码	

要想在任意目录下执行这个命令,需要配置环境变量

配置环境变量

此电脑——右键属性——高级系统设置——环境变量——系统变量找到Path——编辑——新建——找到安装MySQL的目录,bin文件夹点进去,直接复制整个路径,如D:\MySQL\MySQL Server 8.0\Install\bin,最好加个\,不加也行
点击确定保存配置,再去cmd里面输入指令,只要出现最后一张图的页面,能显示出来MySQL的版本号这些信息,就是MySQL连接成功了
配置
配置2


3**数据模型

  • 关系型数据库(RDBMS)
    • 概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库
    • 特点:使用表存储数据,格式统一,便于维护;使用SQL语言操作,标准统一,使用方便
  • 数据模型(如何存储数据):客户端——DBMS——数据库——二维表——数据

4**SQL语句之DDL

  • SQL概念:Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准
  • SQL通用语法:
    • SQL语句可以单行或多行书写,以分号结尾,一定要分号,不然相当于语句没写完无法执行
    • SQL语句可以使用空格、缩进来增强语句的可读性
    • MySQL数据库的SQL语句不区分大小写,关键字建议使用大写

注释:
单行注释,-- 注释内容或# 注释内容(MySQL特有)
多行注释,/注释内容/

SQL分类

分类 说明
DDL Data Definition Language,数据定义语言,用来定义数据库对象(数据库、表、字段)
DML Data Manipulation Language,数据操作语言,用来对数据库中的数据进行增删改
DQL Data Query Language,数据查询语言,用来查询数据库中表的记录
DCL Data Control Language,数据控制语言,用来创建数据库用户、控制数据的访问权限

DDL之数据库操作

-- 查询所有数据库
SHOW DATABASES;
-- 查询当前数据库
SELECT DATABASE();
-- 创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
-- 字符集:utf8(不建议,只能存储3个字节,有一些特殊字符占4个字节的)、utf8mb4(推荐)
create database if not exists itcast;
create database itheima default charset utf8mb4;	-- 举例
-- 删除数据库
DROP DATABASE [IF EXISTS] 数据库名;
drop database if exists test;	-- 举例
-- 使用数据库
USE 数据库名;
use itcast;	-- 举例

DDL之表操作

-- 查询当前数据库所有表
SHOW TABLES;
-- 查询表结构
DESC 表名;
-- 查询建表语句
SHOW CREATE TABLE 表名;
-- 创建表,注意最后一个字段没有逗号,[]中为可选参数
CREATE TABLE 表名(
	字段1 字段1类型 [COMMENT 表注释], 
	……
	字段n 字段n类型 [COMMENT 表注释]
) [COMMENT 表注释];
-- 添加字段
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
-- 修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
-- 修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
-- 删除字段
ALTER TABLE 表名 DROP 字段名;
-- 修改表名
ALTER TABLE 表名 RENAME TO 新表名;
-- 删除表
DROP TABLE [IF EXISTS] 表名;
-- 删除表并重新创建(清除数据,只留下表结构,可以理解成格式化)
TRUNCATE TABLE 表名;

数据类型及案例

数值类型

类型 大小 有符号(SIGNED)范围 无符号(UNSIGNED)范围 描述
TINYINT 1 byte (-128,127) (0,255) 小整数值
SMALLINT 2 bytes (-32768,32767) (0,65535) 大整数值
MEDIUMINT 3 bytes (-8388608,8388607) (0,16777215) 大整数值
INT或INTEGER 4 bytes (-2147483648,2147483647) (0,4294967295) 大整数值
BIGINT 8 bytes (-2^63,2的63次方-1) (0,2^64-1) 极大整数值
FLOAT 4 bytes (-3.402823466 E+38,3.402823466351 E+38) 0 和 (1.175494351 E-38,3.402823466 E+38) 单精度浮点数值
DOUBLE 8 bytes (-1.7976931348623157 E+308,1.7976931348623157 E+308) 0 和 (2.2250738585072014 E-308,1.7976931348623157 E+308) 双精度浮点数值
DECIMAL 依赖于M(精度)和D(标度)的值 依赖于M(精度)和D(标度)的值 小数(精确定点数)
  • 符号(SIGNED)范围,允许出现负数,无符号(UNSIGNED)范围,不允许出现负数
  • TINYINT,类似Java语言中的byte;SMALLINT,类似short;INT或INTEGER,类似int;BIGINT,类似long
  • DECIMAL,如123.45,精度是5(小数点前后总位数),标度是2(小数点后的位数),decimal(5,2)

字符串类型

类型 大小 描述
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过255个字符的二进制数据
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据
  • char(10),最长可以存储10个字符,不管实际存储几个字符,都会占用10个字符空间,未使用的用空格补位
  • varchar(10),存储几个字符就占用多少空间
  • char性能好,空间固定效率高,但是存储利用率较低;(用空间换时间)
  • varchar性能差,根据当前字符串内容确定分配的存储空间,效率低但存储利用率高。(用时间换空间)

日期类型

类型 大小 范围 格式 描述
DATE 3 1000-01-01 至 9999-12-31 YYYY-MM-DD 日期值
TIME 3 -838:59:59 至 838:59:59 HH:MM:SS 时间值或持续时间
YEAR 1 1901 至 2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00 至 9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:01 至 2038-01-19 03:14:07 YYYY-MM-DD HH:MM:SS 混合日期和时间值,时间戳

练习

根据需求创建表,要求设计合理的数据类型、长度。设计一张员工信息表,要求如下:

  1. 编号(纯数字)
  2. 员工工号 (字符串类型,长度不超过10位)
  3. 员工姓名(字符串类型,长度不超过10位)
  4. 性别(男/女,存储一个汉字)
  5. 年龄(正常人年龄,不可能存储负数)
  6. 身份证号(二代身份证号均为18位,身份证中有X这样的字符)
  7. 入职时间(取值年月日即可)
create table emp(
	id int comment '编号',
	workno varchar(10) comment '工号',
	name varchar(10) comment '姓名',
	gender char(1) comment '性别',
	age tinyint unsigned comment '年龄',
	idcard char(18) comment '身份证号',
	entrydate date comment '入职时间'
) comment '员工表';

5**图形化界面工具DataGrip

  • 直接用MySQL Workbench(Mysql自带的)也可以,或者IDEA专业版(但是要收费,免费的社区版没有这个功能)
  • 其他工具还有navicat(要收费)、sqlyog、dbeaver等

6**SQL语句之DML(增INSERT、删DELETE、改UPDATE)

-- 给指定字段添加数据
INSERT INTO 表名(字段1,字段2,) VALUES (1,2,);
-- 给全部字段添加数据
INSERT INTO 表名 VALUES(1,2,);
-- 批量添加数据
INSERT INTO 表名(字段1,字段2,) VALUES (1,2,),(1,2,),(1,2,);
INSERT INTO 表名 VALUES (1,2,),(1,2,),(1,2,);
-- 注意:插入数据时,指定的字段顺序需要与值的顺序是一一对应的
-- 字符串和日期类型数据应该包含在引号中
-- 插入数据的大小,应该在字段的规定范围内
-- 修改数据
UPDATE 表名 SET 字段名1=1,字段名2=2,[WHERE 条件];
-- 删除数据(DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据)
DELETE FROM 表名 [WHERE 条件];
-- 注意:DELETE语句不能删除某一个字段的值,可以用UPDATE语句把某个字段的值设置成NULL

7**SQL语句之DQL(查SELECT)

基本语法:
SELECT 字段列表
FROM 表名列表
WHERE 条件列表
GROUP BY 分组字段列表
HAVING 分组后条件列表
ORDER BY 排序字段列表
LIMIT 分页参数

基本查询

-- 查询多个字段
SELECT 字段1,字段2,字段3 ... FROM 表名;
SELECT * FROM 表名;
-- 注意:* 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)
-- 字段设置别名(as可以省略)
SELECT 字段1 [AS 别名1],字段2 [AS 别名2] ... FROM 表名;
SELECT 字段1 [别名1],字段2 [别名2] ... FROM 表名;
-- 去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;	

条件查询

-- 语法:
SELECT 字段列表 FROM 表名 WHERE 条件列表;

常用比较运算符

运算符 含义
> 大于
>= 大于等于
< 小于
<= 小于等于
等于
<>或!= 不等于
BETWEEN…AND 在某个范围之内(含最小、最大值)
IN(…) 在in之后的列表中的值,多选一
LIKE占位符 模糊匹配(_匹配单个字符, %匹配任意个字符)
IS NULL 是NULL

常用逻辑运算符

运算符 含义
AND 或 && 并且(多个条件同时成立)
OR 或 ¦¦ 或者(多个条件任意一个成立)
NOT 或 ! 非 , 不是

聚合函数

-- 语法:
SELECT 聚合函数(字段列表) FROM 表名;
  • 常见聚合函数:count统计数量、max最大值、min最小值、avg平均值、sum求和
  • 注意:NULL值是不参与所有聚合函数运算的

分组查询

-- 语法:
SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
  • where和having区别:
    • 执行时机不同:where分组前过滤,不满足where条件,不参与分组;having是分组之后对结果进行过滤
    • 判断条件不同:where不能对聚合函数进行判断,而having可以
  • 注意:
    • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
    • 执行顺序: where > 聚合函数 > having
    • 支持多字段分组,具体语法为:group by columnA,columnB

排序查询

-- 语法:
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2;
-- 排序方式:ASC:升序(默认值),DESC:降序

分页查询

-- 语法:
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;
  • 注意:
    • 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数
    • 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT
    • 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10

执行顺序

from … where … group by … having … select … order by … limit …


8**练习

数据准备

drop table if exists employee;
create table emp(
    id int comment '编号',
    workno varchar(10) comment '工号',
    name varchar(10) comment '姓名',
    gender char(1) comment '性别',
    age tinyint unsigned comment '年龄',
    idcard char(18) comment '身份证号',
    workaddress varchar(50) comment '工作地址',
    entrydate date comment '入职时间'
)comment '员工表';
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (1, '00001', '柳岩666', '女', 20, '123456789012345678', '北京', '2000-01-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (2, '00002', '张无忌', '男', 18, '123456789012345670', '北京', '2005-09-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (3, '00003', '韦一笑', '男', 38, '123456789712345670', '上海', '2005-08-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (4, '00004', '赵敏', '女', 18, '123456757123845670', '北京', '2009-12-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (5, '00005', '小昭', '女', 16, '123456769012345678', '上海', '2007-07-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (6, '00006', '杨逍', '男', 28, '12345678931234567X', '北京', '2006-01-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (7, '00007', '范瑶', '男', 40, '123456789212345670', '北京', '2005-05-01');
INSERT INTO emp (id, workno, name, gender, age, idcard, workaddress, entrydate) VALUES (8, '00008', '黛绮丝', '女', 38, '123456157123645670', 
;