尚硅谷宋红康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 从-2^31到2^31-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
				);
相关推荐
XiaoH233几秒前
培训机构Day15
sql·mysql
车轮滚滚__18 分钟前
uniapp对接unipush 1.0 ios/android
笔记
ThisIsClark21 分钟前
【后端面试总结】MySQL主从复制逻辑的技术介绍
mysql·面试·职场和发展
Python之栈1 小时前
【无标题】
数据库·python·mysql
亦世凡华、2 小时前
MySQL--》如何在MySQL中打造高效优化索引
数据库·经验分享·mysql·索引·性能分析
云边有个稻草人3 小时前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法
冷眼看人间恩怨11 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
White_Mountain12 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
老王笔记12 小时前
GTID下复制问题和解决
mysql
Lojarro13 小时前
【Spring】Spring框架之-AOP
java·mysql·spring