存储引擎的类型:MyISAM、InnoDB 、Memory、CSV等9种
名称 | InnoDB | MyISAM |
---|---|---|
事务处理 | 支持 | 不支持 |
数据行锁定 | 支持 | 不支持 |
外键约束 | 支持 | 不支持 |
全文索引 | 不支持 | 支持 |
表空间大小 | 较大,约2倍 | 较小 |
适用场合
• 使用MyISAM: 不需事务,空间小,以查询访问为主
• 使用InnoDB: 多删除、更新操作,安全性高,事务处理及并发控制
? 查看当前默认存储引擎
语法:
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文件
注意:
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/" innodb_data_home_dir="D:/MySQL Datafiles/"
存储位置:因操作系统而异,可查my.ini
? DML语句——插入单条数据记录
语法:INSERT INTO 表名 [(字段名列表)] VALUES (值列表);
简化:insert into 表名 values (值列表);
注意:
字段名是可选的,如省略则依次插入所有字段n多个列表和多个值之间使用逗号分隔
值列表和字段名列表一一对应
如插入的是表中部分数据,字段名列表必填
如:
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 |
? ORDER BY子句
ORDER BY子句实现按一定顺序显示查询结果ragment-->如:
把成绩都降低10%后加5分,再查询及格成绩,并按照成绩从高到低排序 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 [位置偏移量,]行数]; 位置偏移量 = 行数 * (页数-1)
如:
查询所有年级编号为1的学员信息,按学号升序排序 显示前4条记录 每页4条,显示第2页,即从第5条记录开始显示4条数据 SELECT `studentNo`,`studentName`,`phone`,`address`,`bornDate` FROM `student` WHERE `gradeId` = 1 ORDER BY studentNo LIMIT 4;
注意:使用LIMIT子句时,注意第1条记录的位置是0!
插入单条数据:insert into 表名 (字段)values (值);
插入多条数据:insert into 表名 (字段1 ,字段2,字段3)values (值1,值2,值3);
更新(修改):update 表名 set 字段1=值1,字段2=值2 ,
复制(将查询的结果放入新表):create table 新表名 (select 字段1, 字段2 ,字段3, from 原表);
别名: select 字段名 as 字段名含义 , 字段名 as 字段名含义, from 表名 where 字段名 = 值;
?
?
查询所有:select * from 表名;
查询:select 要查找的字段 from 表名 where 字段= ;
如:selcet sname from syudents where sid =102;
order by子句查询:select 字段 as 字段名含义 from 表名 where 字段名=值 order by 字段名 desc; //降序
select 字段 as 字段名含义 from 表名 where 字段名=值 order by 字段名 asc; //升序
limit子句查询:select 查找的字段1,字段2,字段3,from 表名 where 字段=值 order by 字段 limit 行数 ; //显示几行
select 字段1 ,字段2,字段3,from 表名 where 字段=值 order by 字段 limit 第几行,显示行数;
分组:select 字段 from 表名 where 字段=值 group by 分组的字段名 oreder by 排序字段名 desc/asc limt 开始位置,显示行数;
最大值,最小值....: select MAX(字段) ,as 最大值 MIN(字段),avg (字段名) as 平均分 from where 字段=值 order by 字段 desc/asc limit 第几行,显示行数
IN子查询select 字段 from 表名 where 字段 IN (select....);//嵌套
NOT IN子查询: select 字段 from 表名where 字段 NOT IN (select ....);//嵌套
?
?
原文:https://www.cnblogs.com/1314szh/p/13167948.html