一.数据库相关概念
1.什么是数据库
组织管理和存储数据的操作
2.常见数据库
- Oracle
- DB2
- SQL Server
- Postgre SQL
- MySQL
3.相关术语
- 数据库系统(Database System):DBS
- 数据库(Database)
- 数据库管理系统(Database Management System):DBMS
- 应用开发工具
- 管理员及用户
- SQL语言(Structured Query Language):结构化查询语言
- DDL:数据定义语言——用于定义数据库、表、视图、索引、触发器
- DML:数据操作语言——用于增删改数据
- DQL:数据查询语言——用于查询数据
- DCL:数据控制语言——用于控制用户的访问权限
二.MySQL相关操作
1.配置文件
my.cnf是MySQL的配置文件
2.登录/退出MySQL
- 登录
mysql -u root -p
mysql -u root -p root
- 登录的同时打开指定数据库db_name:
mysql -u root -p root -D db_name
- 退出
exit
quit
3.得到版本号
mysql -V
mysql --version
4.登录信息中需要掌握的内容
Commands end with ; or \g
表示命令行结果符默认使用;或\g来结束Type 'help;' or '\h' for help.
表示可以通过help或者\h或者?加上相关关键字来查看手册Type '\c' to clear the current input statement.
表示使用\c取消当前命令的执行如执行:
show table\c
则会跳转到下一行,即该行忽略
5.常用SQL语句
- 得到登录的用户:
SELECT USER();
- 得到MySQL的版本信息:
SELECT VERSION();
- 得到当前的日期时间:
SELECT NOW();
- 得到当前打开的数据库:
SELECT DATABASE();
6.SQL语句语法规范
- 常用MySQL的关键字我们需要大写;库名、表名、字段名称等使用小写
- SQL语句支持折行操作,拆分的时候不能把完整单词拆开
- 数据库名称、表名称、字段名称不要使用MySQL的保留字,如果必须要使用,需要用反引号“将其括起来
三.数据库相关操作
1.创建数据库
CREATE (DATABASE|SCHEMA) db_name;
注意:
- 数据库名称最好有意义
- 名称不要包含特殊字符或MySQL关键字
检测数据库名称是否存在,不存在再创建:
CREATE DATABASE [IF NOT EXISTS] db_name;
在创建数据库的同时指定编码方式:
CREATE DATABASE IF NOT EXISTS db_name DEFAULT CHARACTER SET [=] 'charset';
其中db_name为数据库名,charset为编码字符集。例子如下:
CREATE DATABASE IF NOT EXISTS test3 DEFAULT CHARACTER SET 'UTF8';
2.查看当前服务器下全部数据库
SHOW (DATABASES|SCHEMAS);
3.查看指定数据库的详细信息[查看编码方式]
SHOW CREATE DATABASE db_name;
4.修改指定数据库编码方式
ALTER DATABASE db_name [DEFAULT] CHARACTER SET [=] 'charset';
5.打开指定数据库
USE db_name;
6.得到当前打开的数据库
SELECT DATABASE()|SCHEMA();
7.删除指定的数据库
DROP DATABASE db_name;
- 如果数据库存在则删除:
DROP DATABASE [IF EXISTS] db_name;
四.数据表相关操作
1.数据表
- 数据表是数据库最重要的组成部分之一,数据是保存在数据表中
- 数据表由行(row)和列(column)来组成
- 每个数据表中至少有一列,行可以有0行、1行或者多行组成
- 表名要求唯一,不要包含特殊字符,最好含义明确
2.创建数据表
创建数据表语法规范:
CREATE TABLE [IF NOT EXISTS] tbl_name( 字段名称 字段类型 [完整性约束条件], 字段名称 字段类型 [完整的约束条件], ... )ENGINE=存储引擎 CHARSET=编码方式;
约束条件
unsigned
无符号,没有负数,从0开始zerofill
零填充,当数据的显示长度不够的时候可以使用前补0的效果填充到指定长度[设置为零填充时,自动带有unsigned约束条件]NOT NULL
非空约束,也就是插入值的时候这个字段必须要给值DEFAULT
默认值,如果插入记录的时候没有给字段赋值,则使用默认值PRIMARY KEY
主键,标识表示记录的唯一性,值不能重复,一个表只能有一个主键。【可以使用PRIMARY KEY(主键1,主键2)
定义复合主键】UNIQUE KEY
唯一性,一个表中可以有多个字段是唯一索引,同样的值不能重复,但NULL值除外AUTO_INCREMENT
自动增长,只能用于数值列,而且配合索引使用,默认起始值从1开始,每次增长1,可以通过SHOW CREATE TABLE 表名;
的最后一行查看当前增长到的需要。当前增长的序号为所设增长的所有值中最大值+1。FOREIGN KEY
外键约束
3.查看当前数据库下已有数据表
SHOW TABLES;
完整查看数据表语句:
SHOW [FULL] TABLES [{FROM | IN} db_name][LIKE 'pattern'| WHERE expr]
写
SHOW [FULL] TABLES FROM db_name;
进行查询时,可以不打开指定数据库
4.查看指定数据表的详细信息
SHOW CREATE TABLE tbl_name;
5.查看表结构
DESC tbl_name;
DESCRIBE tbl_name;
SHOW COLUMNS FROM tbl_name;
6.删除表
DROP TABLE [IF EXISTS] tbl_name;
7.向数据表中插入记录
INSERT [INTO] tbl_name (id,username,...) VALUES(1,'KING',...);
- 如果超出数据类型的范围,则会发生截断的效果
8.查询数据表中所有记录
SELECT * FROM tbl_name;
9.表结构相关操作
添加字段到指定字段周围
ALTER TABLE tbl_name ADD 字段名称 字段属性[完整性约束条件][FIRST|AFTER 字段名称];
删除字段
ALTER TABLE tbl_name DROP 字段名称;
添加默认值
ALTER TABLE tbl_name ALTER 字段名称 SET DEFAULT 默认值;
删除默认值
ALTER TABLE tbl_name ALTER 字段名称 DROP DEFAULT;
修改字段类型、字段属性
ALTER TABLE tbl_name MODIFY 字段名称 字段类型[字段属性][FIRST|AFTER 字段名称]
修改字段名称、字段类型、字段属性
ALTER TABLE tbl_name CHANGE 原字段名称 新字段名称 字段类型 字段属性 [FIRST|AFTER 字段名称]
添加主键约束
ALTER TABLE tbl_name ADD PRIMARY KEY(字段名称);
删除主键约束
ALTER TABLE tbl_name DROP PRIMARY KEY;
删除前需要删除自增长的约束添加唯一
ALTER TABLE tbl_name ADD UNIQUE KEY|INDEX index_name (字段名称)
index_name为索引名称,可以通过查询表创建语句查看索引名称,添加时index_name可以省略(默认使用字段名称作为索引名称)删除唯一
ALTER TABLE tbl_name DROP KEY|INDEX index_name;
修改数据表名称`ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name
或
RENAME TABLE tbl_name TO new_tbl_name;
五.MySQL中的数据类型
1.数值型
整数型
浮点数
2.字符串类型
- CHAR效率高于VARCHAR,CHAR相当于拿空间换时间,VARCHAR拿时间换空间
- CHAR默认存储数据的时候,后面会用空格填充到指定长度,而在检索的时候会去掉后面空格;VARCHAR在保存的时候不进行填充,尾部的空格会留下
- TEXT列不能有默认值,检索的时候不存在大小写转换
3.日期时间类型
六.MySQL存储引擎
1.MyISAM存储引擎
测试MyISAM存储引擎
CREATE TABLE test_myisam( a INT UNSIGNED, b VARCHAR(20), c CHAR(32) )ENGINE=MyISAM
默认MyISAM的表会在磁盘中产生3个文件
- .frm表结构文件
- .MYD数据文件
- .MYI索引文件
可以在创建表的时候指定数据文件和索引文件的存储位置,只有MyISAM表支持
DATA DIRECTORY [=] 数据保存的绝对路径
INDEX DIRECTORY [=] 索引文件保存的绝对路劲
MyISAM单表最大支持的数据量:2的64次方条数据
每个表最多可以建立64个索引
如果是复合索引,每个复合索引最多包含16个列,索引值最大长度是1000B
MyISAM引擎的存储格式【使用
SHOW TABLE STATUS LIKE '表名'
来查看】- 定长(FIXED静态)
- 是指字段中不包含VARCHAR/TEXT/BLOB
- 动态(DYNAMIC)
- 只要字段中包含变长的列(VARCHAR/TEXT/BLOB)则是动态
- 压缩(COMPRESSED)
- 使用myisampack创建
- 定长(FIXED静态)
2.InnoDB存储引擎
设计遵循ACID模型,支持事务,具有从服务崩溃中恢复的能力,能够最大限度保护用户的数据。
- ACID
- 原子性(Atomiocity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
- 支持行级锁,可以提升多用户并发的读写性能
- 支持外键,保证数据的一致性和完整性
- InnoDB拥有自己独立的缓冲池
- 对于INSERT、UPDATE、DELETE操作,InnoDB会使用一种change buffering的机制来自动优化,还可以提供一致性的读,并且还能够缓存变更的数据,减少磁盘IO,提高性能
- 创建InnoDB表后会产生两个文件
- .frm表结构文件
- .ibd数据和索引存储表空间
- 所有的表都需要创建主键,最好是配上AUTO_INCREMENT,也可以放到经常查询的列作为主键
七.常用SQL语句
1.查看上一步操作产生的警告信息
SHOW WARNINGS;
2.MySQL中的注释
#注释内容
--注释内容
八.应用实例
创建慕课网imooc数据库
CREATE DATABASE IF NOT EXISTS imooc DEFAULT CHARACTER SET 'UTF8';
打开imooc
USE imooc;
创建用户表
CREATE TABLE IF NOT EXISTS user( id INT, username VARCHAR(20), password CHAR(32), email VARCHAR(50), age TINYINT, card CHAR(18), tel CHAR(11), salary FLOAT(8,2), married TINYINT(1), addr VARCHAR(100), sex ENUM('男','女','保密') )ENGINE=INNODB CHARSET=UTF8;
查看user表结构
DESC user; DESCRIBE user; SHOW COLUMNS FROM user;
删除user表
DROP TABLE [IF EXISTS] user;
查看当前数据库下的数据表
SHOW TABLES;
查看user表的详细信息
SHOW CREATE TABLE user;
向user表插入记录
INSERT user (id,username,password,email,age,card,tel,salary,married,addr,sex) VALUES(1,'king','king','[email protected]',24,'210203199003311777','18041168030',800000.68,0,'Dalian','男');
查询user表中所有记录
SELECT * FROM user;
创建用于测试整型的表
CREATE TABLE test_int( a tinyint, b smallint, c mediumint, d int, e bigint );
创建用于测试无符号的表
CREATE TABLE test_unsigned( a tinyint, b tinyint unsigned );
INSERT test_signed(a,b)VALUES(-12,-12);#报错:ERROR 1264 (22003): Out of range value for column 'b' at row 1 INSERT test_unsigned(a,b)VALUES(0,0);#插入成功:Query OK, 1 row affected (0.00 sec) INSERT test_unsigned(a,b)VALUES(0,256);#报错:ERROR 1264 (22003): Out of range value for column 'b' at row 1
创建用于测试零填充的表
CREATE TABLE test_int1( a tinyint ZEROFILL, b smallint ZEROFILL, c mediumint ZEROFILL, d int ZEROFILL, e bigint ZEROFILL );
INSERT test_int1 (a,b,c,d,e) VALUES (1,1,1,1,1);
创建用于测试浮点型的表
CREATE TABLE test_float( a FLOAT(6,2), b DOUBLE(6,2), c DECIMAL(6,2) ); INSERT test_float (a,b,c) VALUES (4.143,4.146,4.149);#报出警告:c是被截断进行四舍五入,FLOAT和DOUBLE直接进行四舍五入不报警高
CREATE TABLE test_float1( a FLOAT, b DOUBLE, c DECIMAL ); INSERT test_float1 (a,b,c) VALUES (4.143,4.146,4.149);#报出警告:c是被截断进行四舍五入,DECIMAL默认保存整数,FLOAT和DOUBLE正常保存
创建用于测试char和varchar【CHAR效率高于VARCHAR,CHAR,相当于拿空间换时间,VARCHAR拿时间换空间】CHAR默认存储数据的时候,后面会用空格填充到指定长度;而在检索的时候会去掉后面的空格;VARCHAR在检索的时候不进行填充,尾部的空格会留下。
CREATE TABLE test_str( a CHAR(5), b VARCHAR(5) ); INSERT test_str (a,b) VALUE('',''); INSERT test_str (a,b) VALUE('a','a'); INSERT test_str (a,b) VALUE('ab','ab'); INSERT test_str (a,b) VALUE('abc','abc'); INSERT test_str (a,b) VALUE('abcd','abcd'); INSERT test_str (a,b) VALUE('abcde','abcde'); INSERT test_str (a,b) VALUE('abcdef','abcdef');#报错:ERROR 1406 (22001): Data too long for column 'a' at row 1 INSERT test_str (a,b) VALUE(' 123 ',' 123 ');#查询时,CHAR会将后面的空格去掉,VARCHAR不会去掉,结果a为" 123",b为" 123 " SELECT CONCAT('*',a,'*'),CONCAT('*',b,'*') FROM test_str;#CANCAT用于拼接字符串
测试TEXT不能有默认值,检索的时候不存在大小写转换
CREATE TABLE test_str1( content TEXT DEFAULT 'THIS IS A TEXT' );#报错:ERROR 1101 (42000): BLOB, TEXT, GEOMETRY or JSON column 'content' can't have a default value
测试ENUM,枚举类型在插入的时候会自动过滤到空格
CREATE TABLE test_enum( sex ENUM('男','女','保密') ); INSERT test_enum(sex) VALUES('男'); INSERT test_enum(sex) VALUES('男1');#报错 INSERT test_enum(sex) VALUES(NULL);#没有指定非空,则可以插入NULL值 INSERT test_enum(sex) VALUES(1);#则插入的为'男',编号从1开始
测试SET集合
CREATE TABLE test_set( a SET('A','B','C','D','E','F') ); INSERT test_set(a) VALUES ('A'); INSERT test_set(a) VALUES ('C'); INSERT test_set(a) VALUES ('C,D,E'); INSERT test_set(a) VALUES ('C,F,A');#插入时会变成A,C,F INSERT test_set(a) VALUES (2);#插入的是B
TIME类型存储[D HH:MM:SS] D表示天数0~34。若为
2 10:10:10
则小时为2*24+10,分钟为10,秒为10CREATE TABLE test_time( a TIME ); INSERT INTO test_time(a) VALUES ('12:23:45');#12:23:45 INSERT INTO test_time(a) VALUES ('2 12:23:45');#60:23:45 INSERT INTO test_time(a) VALUES ('22:22');#22:22:00 INSERT INTO test_time(a) VALUES ('22');#00:00:22 INSERT INTO test_time(a) VALUES ('2 22');#70:00:00 INSERT INTO test_time(a) VALUES ('121212');#12:12:12 INSERT INTO test_time(a) VALUES ('0');#00:00:00 INSERT INTO test_time(a) VALUES ('787878');#报错 INSERT INTO test_time(a) VALUES (NOW());#当前时间 INSERT INTO test_time(a) VALUES (CURRENT_TIME);#当前时间
DATE类型
#YYYY-MM-DD YYYYMMDD CREATE TABLE test_date( a DATE ); INSERT INTO test_date(a) VALUES('2017-03-04');#2017-03-04 INSERT INTO test_date(a) VALUES('2017-3-4');#2017-03-04 INSERT INTO test_date(a) VALUES('4017-03-04');#4017-03-04 INSERT INTO test_date(a) VALUES('20170304');#2017-03-04 INSERT INTO test_date(a) VALUES('2017@03@04');#2017-03-04 任意分隔符都可以分割时间 #YY-MM-DD YYMMDD(插入方式,查询结果都是YY-MM-DD) 70~99之间转换成1970~1999 00~69之间转换成2000~2069 INSERT INTO test_date(a) VALUES('17-03-04');#2017-03-04 INSERT INTO test_date(a) VALUES('88-03-04');#1988-03-04 INSERT INTO test_date(a) VALUES(NOW());#当前日期 INSERT INTO test_date(a) VALUES(CURRENT_DATE);#当前日期
DATETIME类型
CREATE TABLE test_datetime( a DATETIME ); INSERT INTO test_datetime(a) VALUES('2017-03-04 13:05:10');#2017-03-04 13:05:10 INSERT INTO test_datetime(a) VALUES('170304130510');#2017-03-04 13:05:10 INSERT INTO test_datetime(a) VALUES(NOW());#当前日期
TIMESTAMP类型,与DATETIME类似,就是时间范围比DATETIME小;且自动带有时区
CREATE TABLE test_timestamp( a TIMESTAMP ); INSERT INTO test_timestamp(a) VALUES('2017-03-04 13:05:10');#2017-03-04 13:05:10 INSERT INTO test_timestamp(a) VALUES('170304130510');#2017-03-04 13:05:10 INSERT INTO test_timestamp(a) VALUES(CURRENT_TIMESTAMP);#当前日期时间 INSERT INTO test_timestamp(a) VALUES(NULL);#当前日期时间 INSERT INTO test_timestamp(a) VALUES();#当前日期时间
YEAR类型,用于存储年份(范围1901~~2155)
CREATE TABLE test_year( a YEAR ); INSERT INTO test_year(a) VALUES(1901);#1901 INSERT INTO test_year(a) VALUES(1900);#报错 INSERT INTO test_year(a) VALUES(2155);#当前日期时间 INSERT INTO test_year(a) VALUES(2156);#报错 INSERT INTO test_year(a) VALUES(0);#0000 INSERT INTO test_year(a) VALUES('0');#2000 #00~69为2000~2069 70~99表示1970~1969