文章目录
1.基础知识
1.1一条数据的存储的过程
存储数据是处理数据的第一步
。只有正确地把数据存储起来,我们才能进行有效的处理和分析。否则,只能是一团乱麻,无从下手。
那么,怎样才能把用户各种经营相关的、纷繁复杂的数据,有序、高效地存储起来呢? 在 MySQL 中,一个完整的数据存储过程总共有 4 步,分别是创建数据库、确认字段、创建数据表、插入数据。
我们要先创建一个数据库,而不是直接创建数据表呢?
因为从系统架构的层次上看,MySQL 数据库系统从大到小依次是数据库服务器 、 数据库 、 数据表 、数据表的行与列
。
MySQL 数据库服务器之前已经安装。所以,我们就从创建数据库开始。
1.2 标识符命名规则
- 数据库名、表名不得超过30个字符,变量名限制为29个
- 必须只能包含 A–Z, a–z, 0–9, _共63个字符
- 数据库名、表名、字段名等对象名中间不要包含空格
- 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
- 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使用 `(着重号)引起来
保持字段名和类型的一致性:在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了
1.3 MySQL中的数据类型
数据类型 | 符号 |
---|---|
整数类型 | 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 |
2.创建和管理库
2.1创建数据库
- 方式1:创建数据库
CREATE DATABASE 数据库名;
- 方式2:创建数据库并指定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
- 方式3:判断数据库是否已经存在,不存在则创建数据库( 推荐 )
CREATE DATABASE IF NOT EXISTS 数据库名;
2.2使用数据库
查看当前连接中的数据库有哪些
SHOW DATABASES;
切换数据库
USE mytest2;
查看当前数据中保存的数据表
SHOW TABLES;
查看当前使用的数据库
SELECT DATABASE() FROM DUAL;
查看指定数据库下保存的数据表
SHOW TABLES FROM mysql;
查看创建数据库的结构
show create database mytest2
2.3修改数据库
更改数据库字符集
ALTER DATABASE 数据库名 CHARACTER SET 字符集; #比如:gbk、utf8等
方式1:删除指定的数据库
DROP DATABASE 数据库名;
方式2:删除指定的数据库( 推荐 )
DROP DATABASE IF EXISTS 数据库名;
3.创建表
3.1创建方式1:白手起家
- 1.必须具备:
- CREATE TABLE权限
- 存储空间
- 2.语法格式:
CREATE TABLE [IF NOT EXISTS] 表名(
字段1, 数据类型 [约束条件] [默认值],
字段2, 数据类型 [约束条件] [默认值],
字段3, 数据类型 [约束条件] [默认值],
……
[表约束条件]
);
加上了IF NOT EXISTS关键字,则表示:如果当前数据库中不存在要创建的数据表,则创建数据表;如果当前数据库中已经存在要创建的数据表,则忽略建表语句,不再创建数据表。
- 3.必须指定:
- 表名
- 列名(或字段名),数据类型,长度
- 4.可选指定:
- 约束条件
- 默认值
- 5.创建表举例:
-- 创建表
CREATE TABLE IF NOT EXISTS emp (
-- int类型
emp_id INT,
-- 最多保存20个中英文字符
emp_name VARCHAR(20),
-- 总位数不超过15位
salary DOUBLE,
-- 日期类型
birthday DATE
);
- 6.测试用
#查看表结构
DESC myemp1;
#查看创建的表的结构
show create table myemp1;
#查看表数据
select * from myemp1;
3.2创建方式2:基于现有的表创建,同时可以导入数据
使用 AS subquery 选项,将创建表和插入数据结合起来
- 指定的列和子查询中的列要一一对应 -
- 通过列名和默认值定义列
CREATE TABLE emp1 AS SELECT * FROM employees;
CREATE TABLE emp2 AS SELECT * FROM employees WHERE 1=2; -- 创建的emp2是空表
CREATE TABLE dept80
AS
SELECT employee_id, last_name, salary*12 ANNSAL, hire_date
FROM employees
WHERE department_id = 80;
DESCRIBE dept80;
#查询语句中的字段的别名可以作为新创建的表的字段的名称
CREATE TABLE myemp3
AS
SELECT e.employee_id emp_id,e.last_name lname,d.department_name
FROM employees e JOIN departments d
ON e.department_id = d.department_id;
SELECT *
FROM myemp3;
DESC myemp3;
#练习1:创建一个表employees_copy,实现对employees表的复制,包括表数据
CREATE TABLE employees_copy
AS
SELECT *
FROM employees;
SELECT * FROM employees_copy;
#练习2:创建一个表employees_blank,实现对employees表的复制,不包括表数据
CREATE TABLE employees_blank
AS
SELECT *
FROM employees
#where department_id > 10000;
WHERE 1 = 2;
4.修改表
使用 ALTER TABLE
语句
4.1追加一个列(字段)
ALTER TABLE 表名 ADD 【COLUMN】 字段名 字段类型 【FIRST|AFTER 字段名】;
ALTER TABLE myemp1
ADD salary DOUBLE(10,2); #默认添加到表中的最后一个字段的位置
ALTER TABLE myemp1
ADD phone_number VARCHAR(20) FIRST;
ALTER TABLE myemp1
ADD email VARCHAR(45) AFTER emp_name;
4.2修改一个列(字段)
- 数据类型
- 长度
- 默认值(略)
ALTER TABLE myemp1
MODIFY emp_name VARCHAR(25) ;
ALTER TABLE myemp1
MODIFY emp_name VARCHAR(35) DEFAULT 'aaa';
4.3重命名一个列(字段)
这里必须要指明该列的类型
ALTER TABLE myemp1
CHANGE salary monthly_salary DOUBLE(10,2);
ALTER TABLE myemp1
CHANGE email my_email VARCHAR(50);
#change在改变名称的时候也可以同时改变字符长度
4.4删除一个列(字段)
ALTER TABLE myemp1
DROP COLUMN my_email;
4.5移动一个列
在第一个的参数后面一定要加上他的数据类型
ALTER TABLE emp01
MODIFY emp_1 类型 after emp_2;
5.重命名表
- 方式一:使用
RENAME TABLE
RENAME TABLE emp
TO myemp;
RENAME TABLE myemp1
TO myemp11;
DESC myemp11;
- 方式二:使用
ALTER TABLE
ALTER table dept
RENAME [TO] detail_dept; -- [TO]可以省略
ALTER TABLE myemp2
RENAME TO myemp12;
DESC myemp12;
- 必须是对象的拥有者
6.删除表
不光将表结构删除掉,同时表中的数据也删除掉,释放表空间
DROP TABLE IF EXISTS myemp2;
DROP TABLE IF EXISTS myemp12;
无法撤销
7.清空表
意味着:清空表中的数据,但是表的结构保留
TRUNCATE TABLE employees_copy;
8.DCL 中的COMMIT 和 ROLLBACK(TCL,事务控制相关语言)
COMMIT:
提交数据,一旦执行,则数据永久地被保存在了数据库中,意味着数据不可以回滚
ROLLBACK:
回滚数据,一旦执行,则可以实现数据的回滚,回滚到最近的一次COMMIT之后.
对比 TRUNCATE TABLE 和 DELETE FROM
类型 | 相同点 | 不同点 |
---|---|---|
TRUNCATE TABLE:(清空) | 都可以实现对表中所有数据的删除,同时保留表结构。 | 一旦执行此操作,表数据全部清除。同时,数据是不可以回滚的。 |
DELETE FROM:(删除) | 都可以实现对表中所有数据的删除,同时保留表结构。 | 一旦执行此操作,表数据可以全部清除(不带WHERE)。同时,数据是可以实现回滚的。 |
9.DDL 和 DML 的说明
DDL | DML |
---|---|
DDL的操作一旦执行,就不可回滚。指令SET autocommit = FALSE 对DDL操作失效。(因为在执行完DDL操作之后,一定会执行一次COMMIT。而此COMMIT操作不受SET autocommit = FALSE影响的。) | DML的操作默认情况,一旦执行,也是不可回滚的。但是,如果在执行DML之前,执行了SET autocommit = FALSE ,则执行的DML操作就可以实现回滚。 |
演示:DELETE FROM
#1)
COMMIT;
#2)
SELECT *
FROM myemp3;
#3)
SET autocommit = FALSE;
#4)
DELETE FROM myemp3;
#5)
SELECT *
FROM myemp3;
#6)
ROLLBACK;
#7)
SELECT *
FROM myemp3;
演示:TRUNCATE TABLE
#1)
COMMIT;
#2)
SELECT *
FROM myemp3;
#3)
SET autocommit = FALSE;
#4)
TRUNCATE TABLE myemp3;
#5)
SELECT *
FROM myemp3;
#6)
ROLLBACK;
#7)
SELECT *
FROM myemp3;