MySQL-数据库管理

创建数据库

  • DATABASE 不能改名。一些可视化工具可以改名,它是建新库,把所有表复制到新库,再删
    旧库完成的
# 创建数据库
CREATE DATABASE 数据库名;

# 创建数据库并指定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;

# 判断数据库是否已经存在,不存在则创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名;

数据库使用

  • 要操作表格和数据之前必须先说明是对哪个数据库进行操作,否则就要对所有对象加上“
    据库名.表名
# 查看当前所有的数据库
SHOW DATABASES; # 有一个S,代表多个数据库

# 查看当前正在使用的数据库
SELECT DATABASE(); #使用的一个 mysql 中的全局函数

# 查看指定库下所有的表
SHOW TABLES FROM 数据库名;

# 查看数据库的创建信息
SHOW CREATE DATABASE 数据库名;
SHOW CREATE DATABASE 数据库名\G

# 使用/切换数据库
USE 数据库名;

修改数据库

ALTER DATABASE 数据库名 CHARACTER SET 字符集; #比如:gbk、utf8等

删除数据库

DROP DATABASE 数据库名;
DROP DATABASE IF EXISTS 数据库名;

创建表

1. 基本语法

  • IF NOT EXISTS
    • 如果当前数据库中不存在要创建的数据表,则创建数据表
    • 如果当前数据库中已经存在要创建的数据表,则忽略建表语句,不再创建数据表
  • 必须指定:表名,列名(或字段名),数据类型,长度
  • 可省略指定:约束条件,默认值
CREATE TABLE [IF NOT EXISTS] 表名(
    字段1, 数据类型 [约束条件] [默认值],
    字段2, 数据类型 [约束条件] [默认值],
    字段3, 数据类型 [约束条件] [默认值],
    ……
    [表约束条件]
);

2. 创建表并插入数据

  • 使用 AS subquery 选项,将创建表和插入数据结合起来
  • 指定的列和子查询中的列要一一对应
  • 通过列名和默认值定义列
CREATE TABLE dept80
AS
SELECT employee_id, last_name, salary*12 ANNSAL, hire_date
FROM employees
WHERE department_id = 80;

3. 查看数据表结构

SHOW CREATE TABLE 表名\G
DESC 表名;

修改表

1. 增加字段

# 语法
ALTER TABLE 表名 ADD 【COLUMN】 字段名 字段类型 【FIRST|AFTER 字段名】;

# 示例
ALTER TABLE dept80 ADD job_id varchar(15);

2. 修改字段

  • 可以修改列的数据类型,长度、默认值和位置
# 语法
ALTER TABLE 表名 
    MODIFY 【COLUMN】 字段名1 字段类型 【DEFAULT 默认值】【FIRST|AFTER 字段名2】;

# 示例
ALTER TABLE dept80 MODIFY last_name VARCHAR(30);
ALTER TABLE dept80 MODIFY salary double(9,2) default 1000;

3. 重命名字段

# 语法
ALTER TABLE 表名 CHANGE 【column】 列名 新列名 新数据类型;

# 示例
ALTER TABLE dept80 CHANGE department_name dept_name varchar(15);

4. 删除字段

# 语法
ALTER TABLE 表名 DROP 【COLUMN】字段名

# 示例
ALTER TABLE dept80 DROP COLUMN job_id;

重名表

# 语法一:使用RENAME 
RENAME TABLE emp TO myemp;

# 语法二:使用ALTER 
ALTER table dept RENAME [TO] detail_dept; -- [TO]可以省略

删除表

  • 在MySQL中,当一张数据表没有与其他任何数据表形成关联关系时,可以将当前数据表直接删除
  • 数据和结构、相关索引都被删除
  • 所有正在运行的相关事务被提交
  • DROP TABLE 语句不能回滚
# 语法
DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n];

# 示例
DROP TABLE dept80;

清空表

  • 删除表中所有的数据
  • 释放表的存储空间
  • TRUNCATE语句不能回滚,而使用 DELETE 语句删除数据,可以回滚
  • TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE 无事务且不触发 TRIGGER,有可能造成事故,故不建议在开发代码中使用此语句
# 语法
TRUNCATE TABLE 表名
DELETE FROM 表名;

# 示例
TRUNCATE TABLE detail_dept;
DELETE FROM emp2;

MySQL8新特性—DDL的原子化

  • MySQL 8.0版本中,InnoDB表的DDL支持事务完整性,即 DDL操作要么成功要么回滚
  • DDL操作回滚日志写入到data dictionary数据字典表mysql.innodb_ddl_log(该表是隐藏的表,通过show tables无法看到)中,用于回滚操作
  • 通过设置参数,可将DDL操作日志打印输出到MySQL错误日志中
# 在MySQL 5.7版本中,执行删除表1和表2,表2不存在报错,表1依旧被删除
# 在MySQL 8.0版本中,删除表2报错,操作回滚,表1依旧存在
DROP TABLE book1,book2;

数据增删改

1. 插入数据

  • 为表的所有字段按默认顺序插入数据,值的顺序必须和数据表中字段定义时的顺序相同
# 语法
INSERT INTO 表名 VALUES (value1,value2,....);

# 示例
INSERT INTO departments VALUES (70, 'Pub', 100, 1700);
  • 为表的指定字段插入数据,值与字段的顺序、类型必须保持一致
# 语法
INSERT INTO 表名(column1 [, column2, …, columnn])
VALUES (value1 [,value2, …, valuen]);

# 示例
INSERT INTO departments(department_id, department_name) VALUES (80, 'IT');
  • 同时插入多条
    • 一个同时插入多行记录的INSERT语句等同于多个单行插入的INSERT语句
    • 但是多行的INSERT语句在处理过程中效率更高
# 语法一
INSERT INTO table_name
VALUES
(value1 [,value2, …, valuen]),
(value1 [,value2, …, valuen]),
……
(value1 [,value2, …, valuen]);

# 语法二
INSERT INTO table_name(column1 [, column2, …, columnn])
VALUES
(value1 [,value2, …, valuen]),
(value1 [,value2, …, valuen]),
……
(value1 [,value2, …, valuen]);
  • 将查询结果插入到表中,插入列与查询列的顺序保持一致
# 语法
INSERT INTO 目标表名
(tar_column1 [, tar_column2, …, tar_columnn])
SELECT
(src_column1 [, src_column2, …, src_columnn])
FROM 源表名
[WHERE condition]

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

2. 更新数据

  • 如果需要回滚数据,需要保证在DML前,进行设置:SET AUTOCOMMIT = FALSE;
# 语法
UPDATE table_name
SET column1=value1, column2=value2, … , column=valuen
[WHERE condition]

# 示例
UPDATE employees SET department_id = 70 WHERE employee_id = 113;

3. 删除数据

# 语法
DELETE FROM table_name [WHERE <condition>];

# 示例
DELETE FROM departments WHERE department_name = 'Finance';

4. MySQL8新特性:计算列

  • 插入a、b数据,c自动得到a+b的值
CREATE TABLE tb1(
    id INT,
    a INT,
    b INT,
    c INT GENERATED ALWAYS AS (a + b) VIRTUAL
);

INSERT INTO tb1(a,b) VALUES (100,200);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值