MySQL Base

Posted by whaler404 on February 6, 2024

https://www.runoob.com/mysql/mysql-tutorial.html

https://www.bilibili.com/video/BV1Kr4y1i7ru?p=1&vd_source=6a19d4e55d55aa98ef7e6663956df114

workbench图形化界面工具使用

http://c.biancheng.net/view/2625.html

数据库启动和停止

net start mysql80
net stop mysql80

客户端连接

  • mysql客户端

  • 命令行

    返回修改前边的命令

    \p 可以复制前面的代码	\c退出输入
    鼠标右击选择标记,鼠标左键选中需要的代码然后按一下enter 键,这样就复制下来了,重新编辑
    
    mysql [-h 127.0.0.1] [-P 3306] -u root -p//指定密码
    

    配置path变量

    C:\Program Files\MySQL\MySQL Server 8.0\bin
    

基础

概述

数据模型

关系型数据库RDBMS:建立在关系型模型基础上,由多张相互连接的二维表组成的数据库

客户端->[DBMS->数据库->表

​ ->数据库->表]服务器

通用语法和分类

SQL通用语法

分号结尾,可用缩进,关键字建议大写

注释:

单行注释:–内容 或 #内容

多行注释:/*内容*/

DDL数据定义语言

定义数据库对象(数据库,表,字段,索引)

数据库操作&表操作-创建&查询

#数据库操作
#查询所有的数据库
SHOW DATABASES;
#查询当前的数据库
SELECT DATABASE();
#创建
CREATE DATABASE [IF NOT EXISTS]数据库名[DEFAULT CHARSET 字符集] [COLLATE 排序规则];
CREATE DATABASE IF NOT EXISTS itcast DEFAULT CHARSET utf8mb4 [COLLATE 排序规则];
#删除
DROP DATABASE [IF EXISTS]数据库名;
#使用
USE 数据库名;

#表操作-创建&查询
#查询当前数据库所有的表
SHOW TABLES;
#查询表结构
DESC 表名;
#查询指定表的建表语句
SHOW CREATE TABLE 表名;

CREATE TABLE 表名(	
	字段1 字段1类型 [COMMENT 字段1注释],
	字段2 字段2类型 [COMMENT 字段2注释],
	字段3 字段3类型 [COMMENT 字段3注释],
	...
	字段4 字段4类型 [COMMENT 字段4注释]
)[COMMENT 表注释];

CREATE TABLE TB_USER(
	ID INT COMMENT '编号',
	NAME VARCHAR(50) COMMENT '姓名',
	AGE INT COMMENT '年龄',
	GENDER VARCHAR(1) COMMENT '性别'
)COMMENT '用户表';		#注意小括号和逗号的使用

#表操作-数据类型

主要分为三类:数值类型,字符类型,日期时间类型

分类 类型 大小 描述
数值类型 TINYINT [UNSIGNED] 1 B 小整数值
  SMALLINT [UNSIGNED] 2B 大整数值
  MEDIUMINT [UNSIGNED] 3B 大整数值
  INT [UNSIGNED] 4B 大整数值
  BIGINT [UNSIGNED] 8B 极大整数
  FLOAT 4B 单精度浮点数
  DOUBLE 8B 双精度浮点数
  DECIMAL   小数值
字符串类型 CHAR 255B] 定长字符串
  VARCHAR 65535B] 变长字符串
  TINYBLOB 255B] 不超过255个字符的二进制数据
  TINYTEXT 255B] 短文本字符串
  BLOB 65535B] 二进制形式的长文本数据
  TEXT 65535B] 长文本数据
  MEDIUMBLOB 1677215B] 二进制形式的中等长度文本数据
  MEDIUMTEXT 1677215B] 中等长度文本数据
  LONGBLOB 4294967295B] 二进制形式的极大文本数据
  LONGTEXT 4294967295B] 极大文本数据
日期类型 DATE 3 YYYY-MM-DD日期值
  TIME 3 HH:MM:SS时间值或持续时间
  YEAR 1 YYYY年份值
  DATETIME 8 YYYY-MM-DD HH:MM:SS混合日期时间值
  TIMESTAMP 4 YYYY-MM-DD HH:MM:SS时间戳
AGE TINYINT UNSIGNED
SCORE DOUBLE(4,1)	#整体长度4,小数位1
CHAR(10)		#最多10个字符,空格补位
VARCHAR(10)		#变长,性能差
USERNAME VARCHAR(50)
GENDER CHAR(1)
BIRTHDAY DATE

根据需求创建表

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 '员工表';

表操作-修改&删除

#添加字段
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
ALTER TABLE EMP ADD NICKNAME VARCHAR(20) COMMENT '昵称';
#修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
#修改字段名和字段数据类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度);
ALTER TABLE EMP CHANGE NICKNAME USERNAME VARCHAR(30);
#删除字段
ALTER TABLE 表名 DROP 字段;
ALTER TABLE EMP DROP USERNAME;
#修改表名
ALTER TABLE 表名 RENAME TO 新表名;
ALTER TABLE EMP RENAME TO EMPLOYEE;
#删除表
DROP TABLE [IF EXISTS]表名;
#删除指定表,并重新创建该表
TRUNCATE TABLE 表名;  

DML数据操作语言

对数据库表中的数据增删改

INSERT#添加数据
#给指定字段添加数据
INSERT INTO 表名(字段名1,字段名2) VALUES(值1,值2...);
INSERT INTO EMPLOYEE(ID,WORKNO,NAME,GENDER,AGE,IDCARD,ENTRYDATE) VALUE (1,'1','MIKE','M',10,'123456','2000-01-01');
#给全部字段添加数据
INSERT INTO 表名 VALUES(值1,值2...);
INSERT INTO EMPLOYEE VALUE (1,'1','MIKE','M',10,'123456','2000-01-01');
#批量添加数据
#给指定字段添加数据
INSERT INTO 表名(字段名1,字段名2...) VALUES(值1,值2...),(值1,值2...);
INSERT INTO EMPLOYEE(ID,WORKNO,NAME,GENDER,AGE,IDCARD,ENTRYDATE) VALUE (1,'1','MIKE','M',10,'123456','2000-01-01'),(2,'1','MIKE','M',10,'123456','2000-01-01'),(3,'1','MIKE','M',10,'123456','2000-01-01');

#给全部字段添加数据
INSERT INTO 表名 VALUES (值1,值2...),(值1,值2...),(值1,值2...);
INSERT INTO EMPLOYEE VALUE (1,'1','MIKE','M',10,'123456','2000-01-01'),(2,'1','MIKE','M',10,'123456','2000-01-01'),(3,'1','MIKE','M',10,'123456','2000-01-01');

UPDATE#修改数据
UPDATA 表名 SET 字段名1=值1,字段名2=值2,...[WHILE 条件];
SET SQL_SAFE_UPDATES = 0;# MySql 会话取消设置了安全更新选项
UPDATE EMPLOYEE SET NAME='ITHEIMA' WHERE ID=2;
UPDATE EMPLOYEE SET ID=2,NAME='ITHEIMA' WHERE ID=1 AND GENDER='m';
UPDATE EMPLOYEE SET ENTRYDATE='2001-02-28';

DELETE#删除数据
DELETE FROM 表名 [WHERE 条件];
DELETE FROM EMPLOYEE WHERE NAME='ITHEIMA';

注意:

插入数据,指定的字段顺序和值的顺序一一对应

字符串类型和日期型包含在引号内

插入数据大小,在字段的规定范围内

DQL数据查询语言

查询数据库中表的记录

#基本查询
SELECT 字段1,字段2... FROM 表名列表;
SELECT NAME,WORKNO FROM EMPLOYEE;
SELECT * FROM 表名;
#设置别名
SELECT 字段1[AS 别名1],字段2[AS 别名2]...FROM 表名;
SELECT NAME AS '姓名',WORKNO AS '工作编号' FROM EMPLOYEE;
#去除重复记录
SELECT DISTINCT 字段1,字段2... FROM 表名;
SELECT DISTINCT NAME AS '姓名',WORKNO AS '工作编号' FROM EMPLOYEE;

#条件查询
WHERE  条件列表
SELECT  * FROM EMPLOYEE WHERE AGE BETWEEN 15 AND 20;
SELECT  * FROM EMPLOYEE WHERE IDCARD IS NULL;
SELECT  * FROM EMPLOYEE WHERE NAME LIKE '____';#名字是4个字符
SELECT  * FROM EMPLOYEE WHERE IDCARD LIKE '%7';#尾号是7的idcard

#聚合函数
SELECT 聚合函数(字段列表) FROM 表名;
SELECT COUNT(ID) AS 'COUNT' FROM EMPLOYEE;
SELECT COUNT(ID),AVG(AGE),MAX(AGE) FROM EMPLOYEE;
SELECT SUM(AGE) FROM EMPLOYEE WHERE GENDER='M';

#分组查询
GROUP BY 分组字段列表
HAVING 分组后条件列表
SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段列表 [HAVING 分组后过滤条件];
SELECT GENDER,COUNT(*) FROM EMPLOYEE GROUP BY GENDER;#根据性别分组,统计人数
SELECT GENDER,AVG(AGE) FROM EMPLOYEE GROUP BY GENDER;#根据性别分组,统计平均年龄
SELECT GENDER,COUNT(*) FROM EMPLOYEE WHERE AGE<12 GROUP BY GENDER HAVING GENDER='M';
#只能选择分组字段和聚集函数

#排序查询
ORDER BY 排序字段列表
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式,字段2 排序方式;
SELECT * FROM EMPLOYEE ORDER BY ID DESC,WORKNO;

#分页查询
LIMIT 分页参数
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
SELECT * FROM EMPLOYEE LIMIT 0,10;#查询第1页员工数据,每页展示10条记录

条件查询条件

>,<,>=,<=,=,<>或!=(不等于),BETWEEN…AND…(在某个范围之内,闭区间),IN(…)(在in之后的列表中的值,多选一),LIKE 占位符(模糊匹配(_匹配单个字符,%匹配任意字符)),IS NULL(是null),AND或&&,OR或   ,NOT或!

聚合函数

将一列数据作为一个整体,进行纵向计算

count,max,min,avg,sum

注意,所有的null值不参与聚合函数的运算

分组条件

where 和 having的区别

执行时机:where分组前过滤,having分组后过滤

判断条件:where不能对聚合函数判断,having可以

排序方式

ASC升序(默认),DESC降序

注意,多字段排序,按照字段优先级排序

分页查询

注意

起始索引从0开始,起始索引=(查询页码-1)*每页记录数

不同数据库有不同的分页实现

查询的是第一页数据,起始索引可以省略,简写位LIMIT 10

SELECT * FROM EMP WHERE GENDER='F' AND AGE IN(20,21,22,23);
SELECT * FROM EMP WHERE GNEDER='M' AND AGE IN(20,40) AND NAME LIKE '___';
SELECT GENDER,COUNT(*) FROM EMP WHERE AGE<60 GROUP BY GENDER;
SELECT NAME,AGE FROM EMP WHERE AGE<=35 ORDER BY AGE ASC,ENTRYDATE DESC;
SELECT * FROM EMP WHERE GENDER='M' AND AGE BETWEEN 20 AND 40 ORDER BY AGE ASC,ENTRYDATE DESC LIMIT 0,5;
#查询前几名员工,使用分页查询,ORDER的优先级高于LIMIT优先级

DQL编写顺序

SELECT FROM WHERE GROUP BY HAVING ORDER BY LIMIT

DQL执行顺序

FROM WHERE GROUP BY HAVING SELECT ORDER BY LIMIT

DCL数据控制语言

创建数据库用户,控制数据库的访问权限

#查询用户
USE MYSQL;#存储用户的数据库
SELECT * FROM USER;
#创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
CREATE USER 'itcast'@'localhost' IDENTIFIED BY 'root';
CREATE USER 'itcast'@'%' IDENTIFIED BY 'root';#任意主机可以登录
#修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY '新密码';
ALTER USER 'itcast'@'localhost' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'root';
#删除用户
DROP USER '用户名'@'主机名';

主要是DBA数据库管理员DBA使用

权限控制

权限 说明
ALL,ALL PRIVILEGES 所有权限
SELECT 查询数据
INSERT 插入数据
UPDATE 修改数据
DELETE 删除数据
ALTER 修改表
DROP 删除数据库/表/视图
CREATE 创建数据库/表
#查询权限
SHOW GRANTS FOR '用户名'@'主机名';
#授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
GRANT ALL ON ITHEIMA.* TO  'itcast'@'localhost';
#撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
REVOKE ALL ON ITHEIMA.* FROM  'itcast'@'localhost';

函数

字符串函数

函数 功能
CONCAT(S1,S2,…) 字符串拼接
LOWER(STR) 转小写
UPPER(STR) 转大写
LPAD(STR,N,PAD) 左填充
RPAD(STR,N,PAD) 右填充
TRIM(STR) 去掉字符串头尾空格
SUBSTRING(STR,START,LEN) 返回start起len个字符

数值函数

日期函数

流程函数