DML和DQL命令

MySQL的存储引擎

存储引擎的类型:MyISAM、InnoDB 、Memory、CSV等9种

名称InnoDBMyISAM
事务处理 支持 不支持
数据行锁定 支持 不支持
外键约束 支持 不支持
全文索引 不支持 支持
表空间大小 较大,约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