文章目录
数据库简介
数据库
数据库(database)就是存储数据的仓库,为了方便数据的存储和管理,将数据按照特定的规律存储在磁盘上。通过数据库管理系统,有效地组织和管理存储在数据库中的数据。
数据库系统
数据库系统和数据不是一个概念,数据库系统(DBS),比数据库大很多,由数据库、数据库管理系统、应用开发工具构成。
数据库管理系统
DataBase Management System,简称DBMS,用来定义数据、管理和维护数据的软件。它是数据库系统的一种重要的组成部分。
MySQL数据库
选择mysql数据库的原因
- mysql是开发源代码的数据库
- mysql的跨平台性
- 开源免费
- 功能强大使用方便
SQL简介
什么是SQL
Structured Query Language,简称SQL,结构化查询语言,数据库管理系统通过SQL语言来管理数据库中的数据。
SQL语言的组成部分
- DDL,data definition language,数据定义语言,主要用于定义数据库、表、视图、索引和触发器等。像DROP、CREATE、ALTER等语句。
- DML,data manipulation language,主要包括对数据的增删改。INSERT插入数据、UPDATE更新数据、DELETE删除数据。
- DQL,data query language,数据检索语句,用来从表中获得数据,确定数据怎样在应用程序中给出,像SELECT查询数据。
- DCL,data control language,数据控制语言,主要用于控制用户的访问权限。像GRANT、REVOKE、COMMIT、ROLLBACK等语句。
MySQL相关知识
MySQL常用命令
- SELECT VERSION():显示当前版本
- SELECT NOW():显示当前日期时间
- SELECT USER():显示当前用户
MySQL语句的规范
- 关键字与函数名称全部大写
- 数据库名称、表名称、字段名称等全部小写
- SQL语句必须以分隔符结尾
- SQL语句支持折行操作,只要不把单词、标记或引号字符串分割为两部分,可以在下一行继续写
- 数据库名称、表名称、字段名称等尽量不要使用mysql的保留字,如果需要使用的时候需要使用反引号(` `)将名称括起来
数据库操作(DDL)
- 创建数据库
CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] db_name [[DEFAULT] CHARACTER SET [ = ] charset_name] - 查看当前服务器下的数据库列表
SHOW {DATABASES|SCHEMAS} - 查看指定数据库的定义
SHOW CREATE {DATABASE|SCHEMA} db_name - 修改指定数据库的编码方式
ALTER {DATABASE|SCHEMA} db_name [DEFAULT] CHARACTER SET [ = ] charset_name - 打开指定数据库
USE db_name - 删除指定数据库
DROP {DATABASE|SCHEMA} [IF EXISTS] db_name - 常用命令
SHOW WARNNINGS; 查看上一步操作产生的警告信息
数据表相关操作
表
- 数据表是数据库最重要的组成部分之一,是其他对象的基础
- 数据表是存储数据的数据结构
- 数据表是包含了特定实体类型的数据
- 数据表由行(row)和列(column)构成的二维网络
- 数据表一定先有表结构,再有数据
- 数据表至少有一列,可以没有行或者多行
- 数据表名称要求唯一,而且不要包含特殊字符
创建数据表
CREATE TABLE [IF NOT EXISTS] tbl_name(
字段名称 字段类型 [完整性约束条件]
…
)ENGINE = 引擎名称 CHARSET = ‘编码方式’;
查看数据库中的数据表以及表结构
- 查看数据库下的数据表
SHOW TABLES - 查看指定表的表结构
DESC tbl_name
DESCRIBE tbl_name
SHOW COLUMNS FFROM tbl_name
MySQL存储引擎
- 什么是存储引擎:存储引擎是指表的类型,数据库的存储类型决定了表在计算机中的存储方式。用户可以根据不同的存储方式、是否进行事务处理等来选择合适的存储引擎。
- 如何查看mysql的存储引擎
查看mysql支持的存储引擎:SHOW EENGINES
查看显示支持的存储引擎信息:SHOW VARIABLES LIKE ‘have%’
查看默认的存储引擎:SHOW VARIABLES LIKE ‘storage_engine’ - mysql常用存储引擎及特点
InnoDB存储引擎: 默认,支持外界,频繁删除
MyISAM存储引擎:支持插入、读取,查询快,不支持事物
MEMORY存储引擎:对安全要求低时,一次性的合适,查询的临时表,不能建立太大的表
数据类型
- 整数类型
- 浮点类型
- 字符串类型
- 日期时间类型
测试的代码
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不算重复