MySQL 简介:是现流行的开源、免费的关系型数据库
端口号:
MySQL :3306
Oracle:1521
SQL Server:1433
结构化查询语句分类
DDL(数据定义语言)
解释:定义和管理数据对象,如数据库,数据表等
命令:CREATE DROP ALTER
DML(数据操作语言)
解释:用于操作数据库对象中所包含的数据
命令:INSERT UPDATE DELETE
DQL(数据查询语言)
解释:用于查询数据库数据
命令:SELECT
DCL(数据控制语言)
解释:用来管理数据库的语言,包括管理权限及数据更改
命令:GRANT COMMIT ROLLBACK
创建数据库、表名
create database `数据库名`;
create table `表名`(
id int(11) AUTO_INCREMENT,
name varchar(30),
type varchar(30),
RRIMARY KEY(id)
)DEFAULT CHARSET=utf8;
核心:增删改查
增:insert into `表名` values(1,'abc',null);
删:delete from `表名` where id=1;
改:update `表名` set name='bcd' where id=1;
查:select * from `表名`;
数值类型:
类型 | 说明 | 存储需求 |
---|---|---|
tinyint | 非常小的数据 | 1字节 |
smallint | 较小的数据 | 2字节 |
mediumint | 中等大小的数据 | 3字节 |
int | 标准整数 | 4字节 |
bigint | 较大的整数 | 8字节 |
float | 单精度浮点数 | 4字节 |
double | 双精度浮点数 | 8字节 |
decimal | 字符串形式的浮点数decimal(m,d) | m个字节 |
字符串类型:
类型 | 说明 | 最大长度 |
---|---|---|
char[(M)] | 固定长度字符串 | M字节 |
varchar[(M)] | 可变长度字符串 | 变长度 |
tinytext | 微型文本串 | 2^8-1字节 |
text | 文本串 | 2^16-1字节 |
日期和时间型数值类型
类型 | 说明 |
---|---|
DATE | YYYY–MM–DD ,日期格式 |
TIME | Hh:mm:ss ,时间格式 |
DATETIME | YY- -MM- -DD Hh:mm:ss |
TIMESTAMP | YYYYMMDDhhmmss 格式表示的时间戳 |
YEAR | YYYY 格式的年份值 |
NULL
理解为“没有值”或“未知值”
不要用NULL进行算术运算,结果仍为NULL
MySQL中,0或NULL都意味着为假,1为真
UNSIGNED
无符号的
声明该数据列不允许负数
ZEROFILL
0填充的
不足位数的用0来填充,如 int(3),5则为 005
AUTO_INCREMENT:
自动增长的,每添加一条数据,自动在上一个记录数上加1
通常用于设置主键,且为整数类型
可定义起始值和步长
DEFAULT
默认的
用于设置默认值
1、表列类型注释
CREATE TABLE [ IF NOT EXISTS ]表名
(
字段名1
列类型 [ 属性 ] [ 索引 ] [注释] ,
) [ 表类型 ] [ 表字符集 ] [注释] ;
例如:
CREATE TABLE [ IF NOT EXISTS ]test
(
id
int (11) UNSIGNED COMMENT ‘编码号’
)COMMENT=‘测试表’;2、MySQL注释:
1、#…… 单行注释
2、/……/ 多行注释
MySQL 的数据表的类型:
MyISAM、InnoDB 、HEAP、BOB、CSV等
CREATE TABLE 表名(
#省略一些代码
) ENGINE = MyISAM或InnoDB
名称 | MyISAM | InnoDB |
---|---|---|
事务处理 | 不支持 | 支持 |
数据行锁定 | 不支持 | 支持 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小 | 较小 | 较大,约2倍 |
适用场合 | 节约空间及相应速度(查) | 安全性,事务处理及多用户操作数据表(增、删、改) |
修改数据表:
修改表名
ALTER TABLE 旧表名 RENAME AS 新表名
添加字段
ALTER TABLE 表名 ADD 字段名 列类型[属性]
修改字段
ALTER TABLE 表名 MODIFY 字段名 列类型[属性]
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列类型[属性]
删除字段
ALTER TABLE 表名 DROP 字段名
删除数据表语法:
DROP TABLE [IF EXISTS]表名
DELETE与TRUNCATE
DELETE 命令
语法:
DELETE FROM 表名 [ WHERE condition ];
TRUNCATE 命令
用于完全清空表数据,但表结构、索引、约束等不变
语法:
TRUNCATE [TABLE] table_name
区别于 DELETE 命令
相同:
都能删除数据、不删除表结构,但TRUNCATE 速度更快
不同:
使用TRUNCATE TABLE重新设置AUTO_INCREMENT计数器
使用TRUNCATE TABLE不会对事务有影响
MySQL 的事务处理
事务就是将一组 SQL 语句放在同一批次内去执行
如果一个 SQL 语句出错,则该批次内的所有 SQL 都将被取消执行
MySQL 事务处理只支持 InnoDB 和 BDB事务的ACID原则
原子性(Atomic)
一致性(Consist)
隔离性(Isolated)
持久性(Durable)
SET AUTOCOMMIT = 0; # 关闭自动提交模式
SET AUTOCOMMIT = 1; # 开启自动提交模式
注意:
MySQL中默认是自动提交
使用事务时应先关闭自动提交
实现方法及步骤
1.SET AUTOCOMMIT = 0;
关闭自动提交模式
2.START TRANSACTION
开始一个事务,标记事务的起始点
3.COMMIT
提交一个事务给数据库
4.ROLLBACK
将事务回滚,数据回到本次事务的初始状态
5.SET AUTOCOMMIT = 1;
还原MySQL数据库的自动提交
DISTINCT 关键字
作用:
去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条
语法:
SELECT DISTINCT 字段名1, 字段名2… FROM 表名
注意:
ALL 关键字是默认的,返回所有的记录,与之相反
例如:
查询成绩表中的所包含的课程ID
SELECT DISTINCT SubjectNo FROM result;
逻辑操作符
名称 | 类型 |
---|---|
AND或&& | 逻辑与 |
OR | 逻辑或 |
XOR或^ | 逻辑异或,不同为真,相同为假 |
NOT或! | 逻辑非 |
比较操作符
名称
IS NULL
IS NOT NULL
BETWEENLIKE : a LIKE b
IN : a IN (a1,a2,a3,„.)
LIKE模糊查询
在 WHERE 子句中,使用 LIKE 关键字进行模糊查询
与“%”一起使用,表示匹配0或任意多个字符
与“_”一起使用,表示匹配单个字符
查询包含“数学”的所有课程
SELECT * FROM subject WHERE SubjectName LIKE “%数学%”;
查询所有姓名为“李** ”三个字的学生信息
SELECT StudentNo,StudentName FROM student WHERE StudentName LIKE “李__”;
查询含有特殊字符%
WHERE s.SubjectName
LIKE “%:%%” ESCAPE ‘:’;
WHERE s.SubjectName
LIKE “%/%%” ESCAPE ‘/’;
WHERE s.SubjectName
LIKE “%\%%” ESCAPE ‘\’;
内连接
INNER JOIN 内连接
在表中至少一个匹配时,则返回记录
SELECT 字段1,字段2,… FROM table_1
INNER JOIN table_2 ON table_1.字段x = table_2.字段y;
INNER JOIN 与 JOIN 是相同的;
如table_1 中的行在table_2 中没有匹配,则不返回;
例如:
要求:从subject 和grade 数据表查询课程名称和所属年级名称
SELECT SubjectName,GradeName
FROM subject INNER JOIN grade
ON subject.GradeID= grade.GradeID;等效于内连接:
SELECT SubjectName, GradeName FROM subject, grade
WHERE subject.GradeID = grade.GradeID;外连接
左外连接( LEFT JOIN )
从左表(table_1)中返回所有的记录,即便在右(table_2)中没有匹配的行;
SELECT 字段1,字段2,… FROM table_1
LEFT [ OUTER ] JOIN table_2 ON table_1.字段x = table_2.字段y;右外连接 (RIGHT JOIN)
从右表(table_2)中返回所有的记录,即便在左(table_1)中没有匹配的行;
SELECT 字段1,字段2,… FROM table_1
RIGHT [ OUTER ] JOIN table_2 ON table_1.字段x = table_2.字段y;对比
操作符名称 | 描述 |
---|---|
INNER JOIN ( JOIN ) | 如果表中有至少一个匹配,则返回行 |
LEFT JOIN | 即使右表中没有匹配,也从左表中返回所有的行 |
RIGHT JOIN | 即使左表中没有匹配,也从右表中返回所有的行 |
例如:
要求:从一个包含栏目ID, 栏目名称和父栏目ID 的表中,查询父栏目名称和其
子栏目名称。表结构语句
CREATE TABLE IF NOT EXISTS category(
categoryId int(10) auto_increment primary key,
categoryName varchar(32) not null ,
pid int(10)
);
自身连接
SELECT c1.categoryName=c2.categoryName
FROM category c1 INNER JOIN categoryc2
ON c2.pid=c1.categoryId
ORDER BY c1.categoryName DESC
ORDER BY排序查询
对SELECT语句查询得到的结果,按某些字段进行排序
与DESC(降序)或ASC(升序)搭配使用,默认为ASC
MySQL 的 LIMIT
LIMIT [ [ m,] ] n 或 LIMIT n n OFFSET m m
限制SELECT返回结果的行数
m 制定第一个返回记录行的偏移量
n 制定返回记录行的最大数目
注意:
m不指定则偏移量为0,从第一条开始返回前n条记录
LIMIT 常用于分页显示
例如:
SELECT * FROMresult
LIMIT 5 # 返回前5条记录 条记录
SELECT * FROMresult
LIMIT 5,10 # 返回6-15条记录子查询
在查询语句中的WHERE条件子句中,又嵌套了另外一个查询语句
注意:
嵌套查询可由多个子查询组成,求解的方式是由里及外;
子查询返回的结果一般都是集合,故而建议使用 IN 关键字;常用统计函数
函数名称 | 描述 |
---|---|
COUNT( ) | 返回满足SELECT条件的记录总和数,如 SELECT COUNT(*).. |
SUM( ) | 返回数字字段或表达式列作统计,返回一列的总和 |
AVG( ) | 通常为数值字段或表达列作统计,返回一列的平均值 |
MAX( ) | 可以为数值字段、字符字段或表达式列作统计,返回最大的值 |
MIN( ) | 可以为数值字段、字符字段或表达式列作统计,返回最小的值 |
GROUP BY分组配合HAVING使用
使用 GROUP BY 关键字对查询结果分组
对所有的数据进行分组统计
分组的依据字段可以有多个,并依次分组
与HAVING结合使用,进行分组后的数据筛选
数据库索引
作用:
提高查询速度
确保数据的唯一性
可以加速表和表之间的连接,实现表与表之间的参照完整性
使用分组和排序子句进行数据检索时,可以显著减少分组和排序的时间
全文检索字段进行搜索优化
分类
主键索引(PRIMARY KEY)
唯一索引(UNIQUE)
常规索引(INDEX)
全文索引(FULLTEXT)主键索引(PRIMARY KEY)
主键:
某一个属性组能唯一标识一条记录
如:学生表(学号,姓名,班级,性别等) ,学号就是唯一标识的,可作为主键
特点:
最常见的索引类型
确保数据记录的唯一性
确定特定数据记录在数据库中的位置唯一索引( UNIQUE)
作用:避免同一个表中某数据列中的重复值
与主键索引的区别
主键索引只能有一个
唯一索引可以有多个
示例:
GradeName
VARCHAR(32) UNIQUE
或 UNIQUE KEYGradeID
(GradeID
)常规索引(KEY/INDEX)
作用:
快速定位特定数据
注意:
index和key关键字都可设置常规索引
应加在查找条件的字段
不宜添加太多常规索引,影响数据的插入、删除和修改操作
创建表时添加:
CREATE TABLEresult
(
// 省略一些代码
INDEX/KEYind
(studentNo
,subjectNo
)
)
创建后追加:
ALTER TABLEresult
ADD INDEXind
(studentNo
,subjectNo
);全文索引(FULLTEXT)
作用:
快速定位特定数据
注意:
只能用于MyISAM类型的数据表
只能用于CHAR、VARCHAR、TEXT数据列类型
适合大型数据集
CREATE TABLEstudent
(
省略一些SQL
FULLTEXT (StudentName
)
)ENGINE=MYISAM;
ALTER TABLE employee ADD FULLTEXT (first_name
);
还有一种写法:
SELECT * FROM test WHERE MATCH(studentname
)AGAINST(‘key’);
注:key是关键字管理索引:
创建索引
创建表时添加
建表后追加:
语法: ALERT TABLE 表名 ADD 索引类型(数据列名)删除索DROP INDEX 索引名 ON 表名
ALTER TABLE 表名 DROP INDEX 索引名
ALTER TABLE 表名 DROP PRIMARY KEY
查看索引
SHOW INDEX(或KEYS) FROM 表名索引准则:
索引不是越多越好
不要对经常变动的数据加索引
小数据量的表建议不加索引
索引一般加在查找条件的字段
MySQL数据备份方法
mysqldump备份工具
数据库管理工具,如SQLyog
直接拷贝数据库文件和相关配置文件mysqldump客户端
作用:
转储数据库
搜集数据库进行备份
将数据转移到另一个SQL服务器(不一定是MySQL服务器)
语法:
mysqldump -h 主机名 –u 用户名 –p [options] 数据库名 数据库名
[ table1 table2 table3 ] > path/filename.sql
示例:
备份myschool 数据库如:
mysqldump -u root -p myschool > d:/myschool.sql
EnterPassword: *****
mysqldump常用选项
符号名称
–add-drop-table
导出sql 脚本会加上 DROP TABLE IF EXISTS 语句默认是打开的 ,可以用 –skip-add-drop-table
–add-locks
该选项会在INSERT 语句中捆绑一个LOCK TABLE 和UNLOCK TABLE 语句
好处:防止记录被再次导入时,其他用户对表进行的操作,
-t或–no-create-info
忽略不写重新创建每个转储表的CREATE TABLE 语句
-c或–complete-insert
在每个INERT 语句的列上加上字段名在数据库导入另一个数据库时非常有用
-d 或 –no-data
不写表的任何行信息。对于只想转储表的结构很有用
–where “where-condition”, -w “where-condition”
只转储给定的WHERE 条件选择的记录
–opt
该选项是速记;等同于指定
–add-drop-tables
–add-locking
–create-option
–disable-keys–extended-insert
–lock-tables
–quick
–set-charset
注意:
可通过mysqldump –help
MySQL数据库的恢复
方法一:
用 SOURCE 语法
/path/是一个绝对路径,并且必须是mysql 运行用户有权限读取的文件
SOURCE 在MySQL命令行里执行
先创建或选择数据库,然后SOURCE /path/db_name.sql;
方法二:
用 mysql 客户端
mysql –u root –p dbname < /path/db_name.sql;
利用 SQL语句导出、导入数据库
语法:
SELECT * INTO OUTFILE ‘file_name’ FROM tbl_name
注意:输出文件不能现存在,否则报错索引优化:
show index from sutdent;
alter table student add primary key(`StudentNo`);#主键索引
alter table student add unique index(IdentityCard);#唯一索引
alter table student add index (Email);#常规索引
先修改为MyISAM类型数据表
alter table student engine=MyISAM;#全文索引
alter table student add fulltext(StudentName);