尚硅谷宋红康MySQL笔记 10-18

是记录,我不会记录的特别详细

第10章 创建和管理表

标识符命名规则

  1. 数据库名、表名不得超过30个字符,变量名限制为29
  2. 只能包含 A--Z, a--z, 0--9, _共63个字符
  3. 数据库名、表名、字段名等对象名中间不要包含空格
  4. 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
    必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使
    用`(着重号)引起来
  5. 保持字段名和类型的一致性:在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据
    类型在一个表里是整数,那在另一个表里可就别变成字符型了

数据类型

类型 类型举例
整数类型 TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT
浮点类型 FLOAT,DOUBLE
定点数类型 DECIMAL
位类型 BIT
日期时间类型 YEAR、TIME、DATE、DATETIME、TIMESTAMP
文本字符串类型 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT
枚举类型 ENUM
集合类型 SET
二进制字符串类型 BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB
JSON类型 JSON对象、JSON数组
空间数据类型 单值:GEOMETRY、POINT、LINESTRING、POLYGON;
空间数据类型 集合:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION

常用的

数据类型 描述
INT 从-231到231-1的整型数据。存储大小为 4个字节
CHAR(size) 定长字符数据。若未指定,默认为1个字符,最大长度255
VARCHAR(size) 可变长字符数据,根据字符串实际长度保存,必须指定长度
FLOAT(M,D) 单精度,占用4个字节,M=整数位+小数位,D=小数位。 D<=M<=255,0<=D<=30,默认M+D<=6
DOUBLE(M,D) 双精度,占用8个字节,D<=M<=255,0<=D<=30,默认M+D<=15
DECIMAL(M,D) 高精度小数,占用M+2个字节,D<=M<=65,0<=D<=30,最大取值范围与DOUBLE相同。
DATE 日期型数据,格式'YYYY-MM-DD'
BLOB 二进制形式的长文本数据,最大可达4G
TEXT 长文本数据,最大可达4G

创建和管理数据库

创建数据库

sql 复制代码
//方式1:创建数据库
CREATE DATABASE 数据库名;
//方式2:创建数据库并指定字符集合
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
//方式3:判断数据库是否已经存在,不存在则创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名;

tips:数据库不能改名,一些工具可以改名,它是先建库,再复制所有表到新库,删除旧库.

使用数据库

  • 查看当前所有数据库
sql 复制代码
SHOW DATABASES;
  • 查看当前正在使用的数据库
sql 复制代码
SELECT DATABASE();
  • 查看指定库下所有的表
sql 复制代码
SHOW TABLES FROM 数据库名;
  • 查看数据库的创建信息
sql 复制代码
SHOW CREATE DATABASE 数据库名;
SHOW CREATE DATABASE 数据库名\G;//这种在不使用可视化工具的前提下能好看点
  • 使用/切换数据库
sql 复制代码
USE 数据库名;

修改数据库

  • 更改数据库字符集
    乱码的时候需要用到这条命令
sql 复制代码
ALTER DATABASE 数据库名 CHARACTER SET 字符集; //字符集就比如utf8,gbk等等

删除数据库

sql 复制代码
DROP DATABASE 数据库名;
DROP DATABASE IF EXISTS 数据库名;//存在就删,不存在就不执行操作

创建表

  • 方式1
sql 复制代码
CREATE TABLE [IF NOT EXISTS] 表名(
字段1, 数据类型 [约束条件] [默认值],
字段2, 数据类型 [约束条件] [默认值],
字段3, 数据类型 [约束条件] [默认值],
......
[表约束条件]
);
//IF NOT EXISTS:若存在该表那么就不创建,反之就创建

CREATE TABLE emp (
-- int类型
emp_id INT(8) AUTO_INCREMENT primary key,
-- 最多保存20个中英文字符
emp_name VARCHAR(20),
-- 总位数不超过15位
salary DOUBLE,
-- 日期类型
birthday DATE
);
  • 方式2
    使用AS subquery选项,将创建表和插入数据结合起来
sql 复制代码
CREATE TABLE table [(column1,column2,...)] AS subquery;

CREATE TABLE e1 AS SELECT * FROM employees;
CREATE TABLE e2 AS SELECT * FROM employeees WHERE 1=2;//创建的emp2是空表
CREATE TABLE dept1
AS
SELECT employee_id, last_name, salary*12 ANNSAL, hire_date
FROM employees
WHERE department_id = 80;

查看数据表结构

sql 复制代码
SHOW CREATE TABLE 表名\G

修改表

这里是指修改表的结构,比如添加/删除/重命名列

添加列

sql 复制代码
ALTER TABLE 表名 ADD [COLUMN] 字段名 字段类型 [FIRST | AFTER 字段名];

修改列

修改数据类型,长度,默认值和位置

sql 复制代码
ALTER TABLE 表名 MODIFY [COLUMN] 字段名1 字段类型 [DEFAULT 默认值] [FIRST | AFTER 字段名2]

ALTER TABLE dept MODIFY last_name VARCHAR(30);//把last_name列的数据类型改为varchar(30)
ALTER TABLE dept MODIFY salary double(6,2) default 1000;//把salary的默认值改为1000
--重命名列
ALTER TABLE 表名 CHANGE [COLUMN] 列名 新列名 新数据类型;

ALTER TABLE dept CHANGE department_name dept_name varchar(15);//把department_name列改为 dept_name varchar(15)

ALTER TABLE 表名 DROP [COLUMN] 字段名;
ALTER TABLE dept DROP COLUMN job_id;

重命名表

  • RENAME
sql 复制代码
RENAME TABLE emp TO emp1;
  • ALTER TABLE
sql 复制代码
ALTER TABLE dept RENAME [TO] dept1;

删除表

sql 复制代码
DROP TABLE [IF EXISTS] 数据表1 [,数据表2,..,数据表n];

这玩意不能回滚

清空表

删除表中的所有数据,释放表的存储空间

sql 复制代码
TRUNCATE TABLE test;

不能回滚

扩展

  • 阿里巴巴 《Java开发手册》之MySQL字段命名
  • 表名,字段名必须使用小写字母或数字。
    如:xiyi_user,xiyi_config,xiyi3_username
  • 表必备字段:id,gmt_create,gmt_modified
    id自增,bigint unsigned,gmt_create表示主动式创建,或者过去分词表示被动更新
  • 表的命名最好遵循"业务名称_表的作用"
    如admin_config
  • 库名尽量与应用名称保持一致

合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。

正例:无符号值可以避免误存负数,且扩大了表示范围。

  • 如何理解清空表、删除表等操作需要谨慎?

因为MySQL在执行清空表、删除表操作时候不会有任何的确认提示,万一是误删除怎么办?所以在删除之前需要做一个备份

ALTER TABLE同理,表结构是无法撤销的,如果你添加了一个无关紧要的字段那删除了也不碍事,但是如果删除了一个需要的列,那该列的数据全部丢失,数据无价啊!!!

  • MySQL8新特性---DDL的原子化
    就是DDL操作要么成功要么回滚,并且回滚日志写入到data dictionary数据字典表mysql.innodb_ddl_log(这玩意还是隐藏的,可以通过设置参数,将DDL操作日志打印输出到MySQL错误日志中)
sql 复制代码
DROP TABLE a,b;//b不存在

然后a,b两个表都没有删除.

第11章 表数据操作之增删改

这个我不会记录的详细

插入数据

  • VALUES的方式添加
sql 复制代码
INSERT INTO 表名 [(COLUMN1,COLUMN2,...,COLUMNN)]
	VALUES (VALUE1,VALUE2,...,VALUEN)
	[,(VALUE1,VALUE2,...,VALUEN)];
INSERT INTO 表名
SET 列名 = 值,列名 = 值 ....

插入多条记录的时候最好选择使用单条INSERT语句的方式插入,如我有一张用户表,username,password,若是大量用户注册会产生如下语句

sql 复制代码
INSERT INTO `User` VALUES('ABC','ABC'),('ABCD','ABCD'),('ABCDE','ABCED');//这样效率高
INSERT INTO `User` VALUES('ABC','ABC');INSERT INSERT INTO `User` VALUES ('ABCD','ABCD');
INSERT INTO `User` VALUES ('ABCDE','ABCED');
  • 将查询结果插入到表中
    把表A的查询结果插入到表B中,前提是结果集的列与表B的列保持一致(列名,数据类型相同)
    结果集的意思是:

source表有a,b,c,d,e,f,g列,target表有a,b,c列,现在把source表的a,b,c列插入到target表的a,b,c列

从source表中查出来a,b,c三列就是结果集

sql 复制代码
INSERT INTO target 
SELECT a,b,c
FROM source;

语法格式

sql 复制代码
INSERT INTO TargetTableName
(tar_column1 [,tar_column2,...,tar_columnn])
SELECT 
(src_column1 [,src_column2,...,src_columnn])
FROM SourceTableName
[WHERE condition];
sql 复制代码
INSERT INTO emp3
SELECT *
FROM employees
WHERE department_id = 100;

INSERT INTO emp4(id,name,salary,commission_pct)
SELECT employee_id,last_name,salary,commission_pct
FROM employees
WHERE job_id LIKE '%REP%';

更新数据

语法

sql 复制代码
UPDATE table_name
SET column1 = value1 [,column2 = value2,...,columnn = valuen ] [WHERE condition];

这里记录一下更新多表数据

sql 复制代码
//下面的是SQL92语法
UPDATE table1 alias1,table2 alias2 SET COLUMN1 = VALUE1 [,COLUMN2=VALUE2,...,COLUMNN=VALUEN]
WHERE JoinCondition; 
//下面的是SQL99语法
UPDATE table1 alias1 [INNER | LEFT |RIGHT] JOIN table2 alias2 ON JoinCondition SET COLUMN1 = VALUE1 [,COLUMN2=VALUE2,...,COLUMNN=VALUEN];

删除数据

语法

sql 复制代码
DELETE FROM TableName [WHERE condition];

删除多表记录

sql 复制代码
//SQL92语法
DELETE Table1_alias,Table2_alias FROM Table1 alias1,Table2 alias2 WHERE JoinCondition;

//SQL99
DELETE Table1_alias,Table2_alias FROM Table1 alias1 [INNER | LEFT | RIGHT] JOIN Table2 alias2 ON JoinCondition;

MySQL8新特性:计算列

某一列是通过别的列计算得出的

如创建a表,d,e列,f列是由d列+e列得出的

sql 复制代码
CREATE TABLE a(
				id int,
				d,int,
				e,int,
				f int GENERATED ALWAYS AS (d+e) VIRTUAL
				);
相关推荐
__zRainy__几秒前
Node系列 · ORM:mysql 驱动程序
数据库·后端·mysql·node.js·orm
痕迹运维2 分钟前
MySQL8 Docker容器化部署之C86架构(海光CPU)
mysql
程序员夏洛3 分钟前
MySQL 中如果发生死锁应该如何解决?
数据库·mysql
蒲锘26 分钟前
DevOps 实验项目笔记三 —— Kubernetes 集群部署阶段
笔记·kubernetes·devops·rbac
米饭不加菜35 分钟前
C51 语言参考手册
经验分享·笔记·单片机·嵌入式硬件
sunshine22 girl1 小时前
Angular7,9,学习笔记一 创建项目,基本语法
笔记·学习
破土士V1 小时前
【MySQL基础知识】数据库约束&联合查询&索引
数据库·mysql·索引·联合查询·数据库约束
像风一样自由20201 小时前
11.PostgreSQ、-MySQL与MongoDB-AI应用如何选择数据库
数据库·人工智能·mysql·mongodb·大模型·rag·智能体
夏之小星星1 小时前
【找回mysql被删除数据】
数据库·sql·mysql
Awna1 小时前
MySQL 存储空间与索引运维实战:从空间排查到在线扩容
android·运维·mysql