数据库(database)就是存储数据的仓库。为了方便数据的存储和管理,将数据按照特定的规律存储在磁盘上。通过数据库管理系统,有效地组织和管理存储在数据库中的数据。
数据库系统和数据库不是一个概念,数据库系统(DBS),比数据库大很多,由数据库、数据库管理系统、应用开发工具构成。
数据库管理系统(DataBase Management System,简称DBMS),用来定义数据库、管理和维护的软件。他是数据库系统的一种重要的组成部分。
Structured Query Language简称SQL,结构化查询语言,数据库管理系统通过SQL语言来管理数据库中的数据。
客户端字符集:
[mysql]
default-character-set=utf-8
服务器端字符集
[mysqld]
character-set-server=utf-8
登录mysql后,通过SELECT VERSION();显示当前MySQL版本,或者通过select version()\g;
SELECT NOW();显示当前日期时间
SELECT USER();显示当前用户
关键字与函数名称全部大写
数据库名称、表名称、字段名称等全部小写
SQL语句必须以分隔符结尾
SQL语句支持折行操作,只要不把单词、标记或引号字符串各分为两部分,可以在下一行继续写
数据库名称、表名称、字段名称等尽量不要使用MySQL的保留字,如果需要使用的时候需要使用反引号(``)将名称括起来
引号不要分开写!
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [[DEFAULT] CHARACTER SET [=] charset_name]
SHOW WARNINGS
CREATE TABLE [IF NOT EXISTS] tbl_name(字段名称 字段类型 [完整性约束条件]) ENGINE = 引擎名称 CHARSET = ‘编码方式’;
-- 创建数据库
CREATE DATABASE IF NOT EXISTS `spike` DEFAULT CHARACTER SET 'UTF8';
USE `spike`;
-- 创建学员表(user)
-- 编号 id
-- 用户名 username
-- 年龄 age
-- 性别 sex
-- 邮箱 email
-- 地址 addr
-- 生日 birth
-- 薪水 salary
-- 电话 tel
-- 是否结婚 married
-- 注意:当需要输入中文的时候,需要临时转换客户端的编码方式
-- SET NAMES GBK 仅针对当年链接有效且从设置位置开始到之后有效
-- 字段注释 通过comment注释内容,给字段添加注释
CREATE TABLE IF NOT EXISTS `user`
(
id SMALLINT,
username VARCHAR(20),
age TINYINT,
sex ENUM ('男','女','保密'),
email VARCHAR(50),
addr VARCHAR(200),
birth Year,
salary FLOAT(8, 2),
tel INT,
married TINYINT(1) COMMENT 'O代表结婚,非0代表未结婚'
) ENGINE = INNODB
CHARACTER SET = UTF8;
-- 创建新闻分类表cms_cate
-- 编号、分类名称、分类描述
CREATE TABLE IF NOT EXISTS cms_cate
(
id TINYINT,
cateName VARCHAR(50),
cateDesc VARCHAR(200)
) ENGINE = MyISAM
CHARSET = UTF8;
-- 创建新闻表cms_news
-- 编号、新闻标题、新闻内容、新闻发布时间、点击量、是否置顶、新闻所属分类、发布人
CREATE TABLE IF NOT EXISTS cms_news
(
id INT,
title VARCHAR(50),
content TEXT,
pubTime INT,
clickNum INT,
top TINYINT(0) COMMENT 'O代表不置顶,非0代表置顶'
);
-- 查看cms_news表的表机构
DESC cms_news;
DESCRIBE cms_news;
SHOW COLUMNS FROM cms_news;
完整性约束条件
PRIMARY KEY主键:被标记为主键的值要具有唯一性(相当于ID)且不能为空,一个表中只可以有一个主键,也可以是符合主键;
-- 测试主键
CREATE TABLE IF NOT EXISTS user1
(
id INT PRIMARY KEY,
username VARCHAR(20)
);
-- 查看创建表的定义
SHOW CREATE TABLE user1;
-- 符合主键
CREATE TABLE IF NOT EXISTS user2
(
id INT,
username VARCHAR(20),
card CHAR(18),
PRIMARY KEY (id, card)
);
INSERT user2
VALUES (1, 'king', '111');
INSERT user2
VALUES (1, 'queen', '112'); -- 因为是符合主键,所有仅有序号重复不会报错
AUTO_INCREMENT自增长
FOREIGN KEY外键
NOT NULL非空
UNIQUE KEY唯一
DEFAULT默认值
查看数据库下的数据表:
查看指定表的表结构:
数据类型 | 存储范围 | 字节 |
---|---|---|
TINYINT | 有符号值:-128到127(-27到27-1) | 1 |
无符号值:0到255(0到28-1) | ||
SMALLINT | 有符号值:-32768到32767(-215到215-1) | 2 |
无符号值:0到65535(0到216-1) | ||
DEDIUMINT | 有符号值:-8388608到8388607(-223到223-1) | 3 |
无符号值:0到4294967295(0到224-1) | ||
INT | 有符号值:-2147683648到2147683647(-251到251-1) | 4 |
无符号值:0到4294967295(0到252-1) | ||
BIGINT | 有符号值:-9223372036854775808到9223372036854775807(-263到263-1) | 8 |
无符号值:0到18446744073709551615(0到264-1) | ||
BOOL,BOOLEAN | 等价于TINYINT{1},0为false,其余为true | 1 |
-- 测试整型
CREATE TABLE test1
(
num1 TINYINT,
num2 SMALLINT,
num3 MEDIUMINT,
num4 INT,
num5 BIGINT
);
数据类型 | 存储范围 | 字节 |
---|---|---|
FLOAT[(M,D)] | 负数取值范围为-3.40E+38到-1.17E-38、0和1.175E-38到3.40E+38; | 4 |
M是数字总位数,D是小数点后面的位数。如果M和D被省略,根据硬件允许的限制来保存值。单精度浮点数精确到大约7位小数。 | ||
DOUBLE[(M,D)] | -1.79E+308到-2.22E-308、0和2.22E-308到1.79E+308 | 8 |
DECIMAL[(M,D)] | 和DOUBLE一样,内部以字符串形式存储数值 | M+2 |
列类型 | 存储需求 |
---|---|
CHAR(M) | M个字节,0<= M <= 255 |
VARCHAR(M) | L+1个字节,其中L<=M且0<= M <= 65535 |
TINYTEXT | l+1个字节,其中L<28 |
TEXT | l+1个字节,其中L<216 |
MEDIUMTEXT | l+1个字节,其中L<224 |
LONGTEXT | l+1个字节,其中L<232 |
ENUM(‘value1’,‘value2’,…) | 1或2个字节,取决与枚举值的个数(最多65535个值) |
SET(‘value1’,‘value2’,…) | 1、2、3、4或者8个字节,取决于set成员的数目(最多64个成员) |
CHAR定长字符串,占用空间大,速度快;
VARCHAR变长字符串,占用空间小,速度慢;
TEXT类型是一种特殊的字符串类型,只能保存字符数据,而且不能有默认值
上述三类的存储和检索数据的方式都不一样,数据检索的效率:CHAR > VARCHAR > TEXT
CREATE TABLE IF NOT EXISTS test5
(
str1 CHAR(5),
str2 VARCHAR(5)
);
INSERT test5
VALUES ('1', '1');
INSERT test5
VALUES ('12345', '12345');
-- CHAR不保留插入的空格,VARCHAR保留
INSERT test5
VALUES ('1 ', '1 ');
-- 为了体现CHAR与VARCHAR对于空格保留的体现,通过CONCAT函数为str插入'-'
SELECT CONCAT(str1, '-'), CONCAT(str2, '-')
FROM test5;
-- 字符串开始的空格CHAR不会去掉
INSERT test5
VALUES (' a', ' a');
SELECT CONCAT('-', str1), CONCAT('-', str2)
FROM test5;
-- 插入中文
INSERT test5
VALUES ('啊', '啊');
-- 中文在UTF8下占用的长度是3个,但也只占有一个在字符
SELECT LENGTH('啊');
SELECT CHAR_LENGTH('啊');
-- TEXT不能有默认值
CREATE TABLE test6
(
str1 TEXT
);
INSERT test6
VALUES ('在山的那边,海的那边,有一群蓝精灵');
-- 测试枚举类型
CREATE TABLE IF NOT EXISTS test7
(
sex ENUM ('男','女','保密')
);
INSERT test7
VALUES ('男');
INSERT test7
VALUES ('女');
INSERT test7
VALUES ('保密');
-- 如果插入在'男''女''保密'之外的值,则报错,'男''女''保密'可以用序号表示,即1,2,3(序号顺序从1开始)
-- 可以插入NULL,但不能插入空值
INSERT test7
VALUES (NULL);
-- 测试集合类型
CREATE TABLE IF NOT EXISTS test8
(
fav SET ('A','B','C','D')
);
INSERT test8
VALUES ('A,C,D');
INSERT test8
-- 显示的顺序还是按照检索中的顺寻,即如下显示的是ABD
VALUES ('D,B,A');
-- MySQL存储是通过二进制,可根据二进制之和显示,如3代表A与B之和
INSERT test8
VALUES (3);
列类型 | 存储范围 | 存储需求 |
---|---|---|
TIME | -838:59:59~838:59:59 | 3 |
DATE | 1000-01-01~9999-12-31 | 3 |
DATETIME | 1000-01-01 00:00:00999912~31 23:59:59 | 8 |
TIMESTAMP | 19700101 00:00:01 UTC~2038-01-19 03:14:07 | 4 |
YEAR | 1901~2155 | 1 |
YEAR:
TIME:可以录入天数,但会换算成小时,所以范围数值为 -838:59:59~838:59:59
-- 测试YEAR
CREATE TABLE test9
(
birth YEAR
);
INSERT test9
VALUES (1901);
INSERT test9
VALUES (2155);
INSERT test9
VALUES (12);
INSERT test9
VALUES ('79');
INSERT test9
VALUES ('0');
-- 测试TIME
CREATE TABLE IF NOT EXISTS test10
(
test TIME
);
INSERT test10
VALUES ('1 12:12:12');
INSERT test10
VALUES ('11:11');
INSERT test10
VALUES ('1234');
INSERT test10
VALUES ('12');
INSERT test10
VALUES ('0');
CREATE TABLE IF NOT EXISTS test11
(
test DATE
);
INSERT test11
VALUES ('12-6-7');
INSERT test11
VALUES ('12/6/7');
INSERT test11
VALUES ('120607');
CREATE TABLE test3
(
num1 TINYINT ZEROFILL,
num2 SMALLINT ZEROFILL,
num3 MEDIUMINT ZEROFILL,
num4 INT ZEROFILL,
num5 BIGINT ZEROFILL
);
-- 未达到显示长度,则进行补充零
INSERT test3
VALUES (1, 1, 1, 1, 1);
INSERT test1
VALUES (-128, -3278, -8388608, -2147483648, -9223372036854775808);
CREATE TABLE test2
(
num1 TINYINT UNSIGNED,
num2 TINYINT
);
INSERT test2
VALUES (0, -12);
查看创建表的定义
-- 查看创建表的定义
SHOW CREATE TABLE user1;
INSERT user1
VALUES (1, 'king');
INSERT user1
VALUES (2, 'Queen');
CREATE TABLE IF NOT EXISTS user2
(
id INT,
username VARCHAR(20),
card CHAR(18),
PRIMARY KEY (id, card)
);
INSERT user2
VALUES (1, 'king', '111');
INSERT user2
VALUES (1, 'queen', '112');
存储引擎就是值表的类型。数据的存储类型决定了表在计算机中的村存储方式。用户可以根据不同的存储方式、是否进行事物处理等来选择合适的存储引擎。
查看MySQL支持的存储引擎:SHOW ENGINES
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N2YqZHb2-1594305308375)(C:\Users\z&y\AppData\Roaming\Typora\typora-user-images\image-20200707071021376.png)]
查看显示支持的存储引擎信息:SHOW VARIABLES LIKE ‘have%’
查看默认的存储引擎:SHOW VARIABLES LIKE ‘%storage_engine%’
InnoDB存储引擎:提供事物、回滚、多版本并发控制的能力,读写效率较低,占用空间较大;
MyISAM存储引擎:支持静态型,动态性,压缩性,占用磁盘空间小,处理速度快,但不支持事物;
MEMORY存储引擎:有利于对数据的快速处理,提高表的处理速度,但占用内存空间;