2020.3.23 MySQL 数据库简介,定义数据DDL

数据库简介

数据库

数据库(database)就是存储数据的仓库,为了方便数据的存储和管理,将数据按照特定的规律存储在磁盘上。通过数据库管理系统,有效地组织和管理存储在数据库中的数据。

数据库系统

数据库系统和数据不是一个概念,数据库系统(DBS),比数据库大很多,由数据库、数据库管理系统、应用开发工具构成。

数据库管理系统

DataBase Management System,简称DBMS,用来定义数据、管理和维护数据的软件。它是数据库系统的一种重要的组成部分。

MySQL数据库

选择mysql数据库的原因

  1. mysql是开发源代码的数据库
  2. mysql的跨平台性
  3. 开源免费
  4. 功能强大使用方便

SQL简介

什么是SQL

Structured Query Language,简称SQL,结构化查询语言,数据库管理系统通过SQL语言来管理数据库中的数据。

SQL语言的组成部分

  1. DDL,data definition language,数据定义语言,主要用于定义数据库、表、视图、索引和触发器等。像DROP、CREATE、ALTER等语句。
  2. DML,data manipulation language,主要包括对数据的增删改。INSERT插入数据、UPDATE更新数据、DELETE删除数据。
  3. DQL,data query language,数据检索语句,用来从表中获得数据,确定数据怎样在应用程序中给出,像SELECT查询数据。
  4. DCL,data control language,数据控制语言,主要用于控制用户的访问权限。像GRANT、REVOKE、COMMIT、ROLLBACK等语句。

MySQL相关知识

MySQL常用命令

  1. SELECT VERSION():显示当前版本
  2. SELECT NOW():显示当前日期时间
  3. SELECT USER():显示当前用户

MySQL语句的规范

  1. 关键字与函数名称全部大写
  2. 数据库名称、表名称、字段名称等全部小写
  3. SQL语句必须以分隔符结尾
  4. SQL语句支持折行操作,只要不把单词、标记或引号字符串分割为两部分,可以在下一行继续写
  5. 数据库名称、表名称、字段名称等尽量不要使用mysql的保留字,如果需要使用的时候需要使用反引号(` `)将名称括起来

数据库操作(DDL)

  1. 创建数据库
    CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name [[DEFAULT] CHARACTER SET [ = ] charset_name]
  2. 查看当前服务器下的数据库列表
    SHOW {DATABASES|SCHEMAS}
  3. 查看指定数据库的定义
    SHOW CREATE {DATABASE|SCHEMA} db_name
  4. 修改指定数据库的编码方式
    ALTER {DATABASE|SCHEMA} db_name [DEFAULT] CHARACTER SET [ = ] charset_name
  5. 打开指定数据库
    USE db_name
  6. 删除指定数据库
    DROP {DATABASE|SCHEMA} [IF EXISTS] db_name
  7. 常用命令
    SHOW WARNNINGS; 查看上一步操作产生的警告信息

数据表相关操作

  1. 数据表是数据库最重要的组成部分之一,是其他对象的基础
  2. 数据表是存储数据的数据结构
  3. 数据表是包含了特定实体类型的数据
  4. 数据表由行(row)和列(column)构成的二维网络
  5. 数据表一定先有表结构,再有数据
  6. 数据表至少有一列,可以没有行或者多行
  7. 数据表名称要求唯一,而且不要包含特殊字符

创建数据表

CREATE TABLE [IF NOT EXISTS] tbl_name(
字段名称 字段类型 [完整性约束条件]

)ENGINE = 引擎名称 CHARSET = ‘编码方式’;

查看数据库中的数据表以及表结构

  1. 查看数据库下的数据表
    SHOW TABLES
  2. 查看指定表的表结构
    DESC tbl_name
    DESCRIBE tbl_name
    SHOW COLUMNS FFROM tbl_name

MySQL存储引擎

  1. 什么是存储引擎:存储引擎是指表的类型,数据库的存储类型决定了表在计算机中的存储方式。用户可以根据不同的存储方式、是否进行事务处理等来选择合适的存储引擎。
  2. 如何查看mysql的存储引擎
    查看mysql支持的存储引擎:SHOW EENGINES
    查看显示支持的存储引擎信息:SHOW VARIABLES LIKE ‘have%’
    查看默认的存储引擎:SHOW VARIABLES LIKE ‘storage_engine’
  3. mysql常用存储引擎及特点
    InnoDB存储引擎: 默认,支持外界,频繁删除
    MyISAM存储引擎:支持插入、读取,查询快,不支持事物
    MEMORY存储引擎:对安全要求低时,一次性的合适,查询的临时表,不能建立太大的表

数据类型

  1. 整数类型
    在这里插入图片描述
  2. 浮点类型
    在这里插入图片描述
  3. 字符串类型
    在这里插入图片描述
  4. 日期时间类型

在这里插入图片描述

测试的代码

MySQL数据表的创建

# 注释内容
-- 注释内容
-- 创建maizi数据库
CREATE DATABASE IF NOT EXISTS `maizi` DEFAULT CHARACTER SET 'UTF8';

USE `maizi1`;


-- 创建学员表(user)
-- 编号id
-- 用户名 username
-- 年龄 age
-- 性别 sex
-- 邮箱 email
-- 地址 addr
-- 生日 birth
-- 薪水 salary
-- 电话 tell
-- 是否结婚 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),
tell INT,
married TINYINT(1) COMMENT '0代表未婚,非0代表已婚'
)ENGINE=INNODB CHARSET=UTF8;


-- 创建课程表 course
-- 编号 cid
-- 课程名称 courseName
-- 课程描述 courseDesc
CREATE TABLE IF NOT EXISTS course(
cid TINYINT,
courseName VARCHAR(50),
courseDesc VARCHAR(200)
);


-- 创建新闻分类表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,
isTop TINYINT(1) COMMENT '0代表不置顶,1代表置顶'
);


-- 查看cms_news表的表结构
-- field是字段列,type字段类型,null是否为空,key否是主键,default默认值,extra额外的信息
DESC cms_news;
DESCRIBE cms_news;
SHOW COLUMNS FROM cms_news;

测试数据类型

-- 创建数据表,测试整型
CREATE TABLE mysql01(
num1 TINYINT,
num2 SMALLINT,
num3 MEDIUMINT,
num4 INT,
num5 BIGINT
);
-- 向表中插入记录INSERT tbl_name VALUE|VALUES(值,...);
INSERT mysql01 VALUES(-128,-32768,-8388608,-2147483648,-9223372036854775808);

-- 查询表中所有记录SELECT * FROM tbl_name;   tbl_name是表名的意思
SELECT * FROM mysql01;


-- 无符号UNSIGNED,比如不可能出现负数时用
CREATE TABLE mysql02(
num1 TINYINT UNSIGNED,
num2 TINYINT
);
INSERT mysql02 VALUES(0.-12);


-- 零填充ZEROFILL,写这个就是自动从0开始
CREATE TABLE mysql03(
num1 TINYINT(3) ZEROFILL,
num2 TINYINT(3)
);
INSERT mysql03 VALUES(1,1);
INSERT mysql03 VALUES(123,1);
SELECT * FROM mysql03;


-- 测试浮点类型
CREATE TABLE test4(
num1 FLOAT(6,2),
num2 DOUBLE(6,2),
num3 DECIMAL(6,2)
);
INSERT test4 VALUES(3.1415,3.1415,3.1415);
INSERT test4 VALUES(3.2495,3.2495,3.2495);

-- SELECT * FROM test4 WHERE num1=3.14,可查;SELECT * FROM test4 WHERE num1='3.14',不可查;SELECT * FROM test4 WHERE num3='3.14',可查.
-- DECIMAL是定点数,精度比较高,银行经常选用

测试字符串类型

-- 测试CHAR和VARCHAR
CREATE TABLE IF NOT EXISTS test5(
str1 CHAR(5),
str2 VARCHAR(5)
);
INSERT test5 VALUES('1','1');
INSERT test5 VALUES('12345','12345');
# 超字符长度就不行了,以下报错
INSERT test5 VALUES('123456','123456');
INSERT test5 VALUES('','');  #插入空是可以的
INSERT test5 VALUES('1  ','1  ');  #1后面有空格,CHAR后面的空格默认去掉,而VARCHAR会保存空格。
# 可以利用SELECT CONCAT(str1,'-'),CONCAT(str2,'-') FROM test5; 查询观察便知,CONCAT是连接符的意思
INSERT test5 VALUES(' a','  a');  #a前面有空格,两者都会留下。可以利用SELECT CONCAT('-',str1),CONCAT('-',str2) FROM test5;来查询观察
INSERT test5 VALUES('啊','啊');  #输入中文不用改编码方式了,一个啊算一个字符,所以输入5个啊也不会超字符长度


-- 测试TEXT相关
CREATE TABLE test6(
str1 TEXT
);
INSERT test6 VALUES('HHINJN234S3');


-- 测试枚举类型
CREATE TABLE IF NOT EXISTS test7(
sex ENUM('男','女','保密')
);
INSERT test7 VALUES('男  ');
INSERT test7 VALUES('女  ');
INSERT test7 VALUES('保密');
# INSERT test7 VALUES('保密123');报错,因为插入的值只能是列举值中的一个
INSERT test7 VALUES(2);  #插入序号也可以,2就相当于女,第一个序号为1,不是0,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 VALUES('D,B,A'); #虽然顺序不一样,还是按之前的顺序排列,即ABD。
#且以二进制形式保存的。即A对应1,B对应2,C对应4,D对应8,以此类推
INSERT test8 VALUES(3);  #为前两个爱好A和B,因为3=1+2
INSERT test8 VALUES(15);  #为ABCD,因为15=1+2+4+8  

测试日期时间类型

-- 测试YEAR
CREATE TABLE IF NOT EXISTS test9(
birth YEAR
);
INSERT test9 VALUES(1901);
INSERT test9 VALUES(2155);
INSERT test9 VALUES(2156);  #超过范围,报错,Out of range
INSERT test9 VALUES('1988');  #写成字符串形式也可
INSERT test9 VALUES(12);  #写两位数字也可,代表2012
INSERT test9 VALUES('79');  #写成两位数字的字符串形式也可
# 00-69会转换成2000-2069年,70-99会转换成1970-1999年,
INSERT test9 VALUES(0);   #得到0000
INSERT test9 VALUES('0');   #字符串的0,转换成2000
INSERT test9 VALUES('00');   #仍然转换成2000


-- 测试时间TIME
CREATE TABLE IF NOT EXISTS test10(
test TIME
);
INSERT test10 VALUES('1 12:12:12'); #1天,12点12分12秒,得到36:12:12,即为24*1+12=36,后面分和秒不变
INSERT test10 VALUES('11:11');  #得到11:11:00,11点11分0秒
INSERT test10 VALUES('1234');  #得到00:12:34,小时的位置省略掉
INSERT test10 VALUES('12');   #得到00:00:12
INSERT test10 VALUES('0');    #得到00:00:00
INSERT test10 VALUES(0);    #得到00:00:00
INSERT test10 VALUES('66');  #报错,超过范围

-- 测试DATE  3字节
-- 范围 1000-01-01至9999-12-31
CREATE TABLE IF NOT EXISTS test12(
test DATE
);
INSERT test12 VALUES('12-6-7');  #得到2012-06-07
INSERT test12 VALUES('12/6/7');  #也可
# INSERT test12 VALUES('1267');  报错
# INSERT test12 VALUES('12 6 7');  报错
INSERT test12 VALUES('120607');  #也可
INSERT test12 VALUES('12@6/7');  #也可,可以指定分隔符

测试自增长

-- 测试自增长AUTO_INCREMENT
CREATE TABLE IF NOT EXISTS user5(
id SMALLINT KEY AUTO_INCREMENT,
username VARCHAR(20)
);
INSERT user5 VALUES(1,'KING');
INSERT user5(username) VALUES('queen');  #SELECT * FROM user5 得到queen前面的编号自动变为2,已有编号1再+1
INSERT user5 VALUES(111,'KING1');  #得到KING1前编号为111
INSERT user5(username) VALUES('queen1');  #得到queen1前面编号变为112,为已有数字111+1
INSERT user5 VALUES(NULL,'AAAA');   #得到编号113
INSERT user5 VALUES(DEFAULT,'AAAA');   #得到编号114

CREATE TABLE IF NOT EXISTS user6(
id SMALLINT KEY AUTO_INCREMENT,
username VARCHAR(20)
)AUTO_INCREMENT=100;   #设置自增长从100开始
INSERT user6(username) VALUES('queen');   #编号就是从100开始
-- 修改自增长的值
ALTER TABLE user6 AUTO_INCREMENT =500;
#输入SHOW CREATE TABLE user6; 得到AUTO_INCREMENT=500
INSERT user6(username) VALUES('queen');  #得到这个queen前面编号是500

测试非空约束

-- 测试NOT NULL非空,就是一定要有值
CREATE TABLE IF NOT EXISTS user7(
id INT UNSIGNED KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL,
password CHAR(32) NOT NULL,
age TINYINT UNSIGNED
);
INSERT user7(username,password) VALUES('KING','KING');   #得到username,password都对应KING,age对应NULL
INSERT user7(username,password,age) VALUES('KING1','KING1',12);
# INSERT user7(username,password) VALUES(NULL,NULL);  #报错,username不能为空,因为刚开始约束了

测试默认值

-- 测试DEFAULT 默认值
CREATE TABLE IF NOT EXISTS user8(
id INT UNSIGNED KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL,
password CHAR(32) NOT NULL,
age TINYINT UNSIGNED DEFAULT 18,
addr VARCHAR(50) NOT NULL DEFAULT '北京',
sex ENUM('男','女','保密') NOT NULL DEFAULT '男'
);
INSERT user8(username,password) VALUES('KING','KING');   #其余没赋值的都是默认值
INSERT user8 VALUES(2,'QUEEN','QUEEN',29,'上海','保密');  #赋值就按给的值
INSERT user8 VALUES(2,'QUEEN',DEFAULT,29,DEFAULT,'保密');   #也可

测试唯一性约束

-- 测试唯一性约束 UNIQUE KEY,KEY可以省略
-- 一个表只能有一个主键,但是可以有多个唯一
CREATE TABLE IF NOT EXISTS user9(
id TINYINT UNSIGNED KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL UNIQUE,
card CHAR(18) UNIQUE
);
INSERT user9(username) VALUES('A');
INSERT user9(username) VALUES('A1');  #得到card下面是默认值NULL,NULL不算重复
#INSERT user9(username) VALUES('A1');  #再打一遍,报错,因为不能重复
INSERT user9(username,card) VALUES('B','111');
INSERT user9(username,card) VALUES('B1',NULL);
INSERT user9(username,card) VALUES('B2',NULL);  #可以建成功,NULL不算重复

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值