MySQL的存储引擎
存储引擎的类型
MyISAM、InnoDB 、Memory、CSV等9种
MyISAM与InnoDB类型主要区别
InnoDB MyISAM
事务处理 支持 不支持
数据行锁定 支持 不支持
外键约束 支持 不支持
全文索引 不支持 支持
表空间大小 较大,约2倍 较小
适用场合
使用MyISAM: 不需事务,空间小,以查询访问为主
使用InnoDB: 多删除、更新操作,安全性高,事务处理及并发控制
MySQL的存储引擎
查看当前默认存储引擎
SHOW VARIABLES LIKE ‘storage_engine%’;
修改存储引擎
修改my.ini配置文件
default-storage-engine= InnoDB
设置表的存储引擎
CREATE TABLE 表名(
#省略代码
)ENGINE=存储引擎;
示例
CREATE TABLE `myisam` (
id INT(4)
)ENGINE=MyISAM;
数据表的存储位置
MyISAM类型表文件
*.frm:表结构定义文件
*.MYD:数据文件
*.MYI:索引文件
InnoDB类型表文件
*.frm:表结构定义文件
ibdata1文件
存储位置
因操作系统而异,可查my.ini
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
innodb_data_home_dir="D:/MySQL Datafiles/"
DML语句——插入单条数据记录
语法
INSERT INTO 表名 [(字段名列表)] VALUES (值列表);
字段名是可选的,如省略则依次插入所有字段
多个列表和多个值之间使用逗号分隔
值列表和字段名列表一一对应
如插入的是表中部分数据,字段名列表必填
示例
INSERT INTO `student`(`loginPwd`,`studentName`,`gradeId`,`phone`,`bornDate`)
VALUES('123','黄小平',1,'13956799999','1996-5-8');
DML语句——插入多条数据记录
语法
INSERT INTO 新表(字段名列表)
VALUES(值列表1),(值列表2),……,(值列表n);
示例
INSERT INTO `subject`(`subjectName`,`classHour`,`gradeID`)
VALUES('Logic Java',220,1),('HTML',160,1),('Java OOP',230,2);
为避免表结构发生变化引发的错误,建议插入数据时写明具体字段名!
DML语句——将查询结果插入新表
编写SQL语句实现从学生表提取姓名、手机号两列数据存储到通讯录表中
如新表已存在,将会报错!
示例
CREATE TABLE `phoneList`(
SELECT `studentName`,`phone`
FROM `student`);
数据更新
更新数据记录
UPDATE 表名
SET 字段1=值1,字段2=值2,…,字段n=值n
[WHERE 条件];
UPDATE student SET sex = ‘女’;
UPDATE student SET address = ‘北京女子职业技术学校家政班’
WHERE address = ‘北京女子职业技术学校刺绣班’;
数据删除
删除数据记录
DELETE FROM 表名 [WHERE条件];
TRUNCATE TABLE 表名;
TRUNCATE语句删除后将重置自增列,表结构及其字段、约束、索引保持不变,执行速度比DELETE语句快
DELETE FROM student WHERE studentName = ‘王宝宝’;
TRUNCATE TABLE student;
查询语法
SELECT <列名|表达式|函数|常量>
FROM <表名>
[WHERE <查询条件表达式>]
[ORDER BY <排序的列名>[ASC或DESC]];
SELECT `studentNo`,`studentName`,`phone`,`address`,`bornDate`
FROM `student`
WHERE `gradeId` = 1
ORDER BY `studentNo`;
数据查询基础
查询全部的行和列
SELECT * FROM `student`;
查询部分列
SELECT `studentNo`,`studentName`,`address`
FROM `student`
WHERE `address`=‘河南新乡’;
数据查询-列别名
使用AS命名列
SELECT `studentNo` AS 学生编号,`studentName` AS 学生姓名,
`address `AS 学生地址
FROM `student`
WHERE `address` <> '河南新乡‘;
SELECT `firstName` + '.' + `lastName` AS 姓名
FROM `employees`;
注意:
1. + 连接的数据类型必须兼容
2. 如果 + 连接字符型数据,结果为字符串数据的连接
3. 如果 + 连接数值型数据,结果为数值的和
数据查询-空行、常量列
查询空行
SELECT `studentName` FROM `student` WHERE `email` IS NULL;
使用常量列
SELECT `studentName` AS 姓名,`address` AS 地址,
’北京信息中心’ AS 学校名称
FROM `student`;
常用函数——聚合函数
AVG() 返回某字段的平均值
COUNT() 返回某字段的行数
MAX() 返回某字段的最大值
MIN() 返回某字段的最小值
SUM() 返回某字段的和
常用函数——字符串函数
CONCAT(str1,str1...strn) 字符串连接SELECT CONCAT('My','S','QL');返回:MySQL
INSERT(str,pos,len,newstr) 字符串替换 SELECT INSERT('这是SQL Server数据库',3,10,'MySQL');返回:这是MySQL数据库
LOWER(str) 将字符串转为小写 SELECT LOWER('MySQL');返回:mysql
UPPER(str) 将字符串转为大写 SELECT UPPER('MySQL');返回:MYSQL
SUBSTRING(str,num,len) 字符串截取 SELECT SUBSTRING('JavaMySQLOracle',5,5);返回:MySQL
常用函数——时间日期函数
CURDATE() 获取当前日期 SELECT CURDATE();返回:2016-08-08
CURTIME() 获取当前时间 SELECT CURTIME();返回:19:19:26
NOW() 获取当前日期和时间 SELECT NOW();返回:2016-08-08 19:19:26
WEEK(date) 返回日期date为一年中的第几周 SELECT WEEK(NOW());返回:26
YEAR(date) 返回日期date的年份 SELECT YEAR(NOW());返回:2016
HOUR(time) 返回时间time的小时值 SELECT HOUR(NOW());返回:9
MINUTE(time) 返回时间time的分钟值 SELECT MINUTE(NOW());返回:43
DATEDIFF(date1,date2) 返回日期参数date1和date2之间相隔的天数 SELECT DATEDIFF(NOW(),'2008-8-8');返回:2881
ADDDATE(date,n) 计算日期参数date加上n天后的日期 SELECT ADDDATE(NOW(),5);返回:2016-09-02 09:37:07
常用函数——数学函数
CEIL(x) 返回大于或等于数值x的最小整数 SELECT CEIL(2.3)返回:3
FLOOR(x) 返回小于或等于数值x的最大整数 SELECT FLOOR(2.3)返回:2
RAND() 返回0~1间的随机数 SELECT RAND()返回:0.5525468583708134
ROUND() 四舍五入
ORDER BY子句
ORDER BY子句实现按一定顺序显示查询结果
SELECT `studentNo` AS 学生编号,(studentResult*0.9+5 ) AS 综合成绩
FROM `result`
WHERE (`studentResult`*0.9+5) >=60
ORDER BY studentResult DESC;
LIMIT子句
MySQL查询语句中使用LIMIT子句限制结果集
SELECT <字段名列表>
FROM <表名或视图>
[WHERE <查询条件>]
[GROUP BY <分组的字段名>]
[ORDER BY <排序的列名>[ASC 或 DESC]]
[LIMIT [位置偏移量,]行数];
LIMIT 4,4; 从第5条开始显示4条
子查询
SELECT `studentNo`,`studentName`,`sex`,`bornDate`,`address`
FROM `student`
WHERE `bornDate` >
(SELECT `bornDate` FROM `student` WHERE `studentName`='李斯文');
子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询
子查询在WHERE语句中的一般用法
SELECT … FROM 表1 WHERE 字段1 比较运算符(子查询)
先执行子查询,返回所有来自子查询的结果
再执行外围的父查询,返回查询的最终结果
将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个