DML和DQL使用方法及注意事项

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  比较运算符(子查询)

先执行子查询,返回所有来自子查询的结果
再执行外围的父查询,返回查询的最终结果


将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个

猜你喜欢

转载自blog.csdn.net/a814163435/article/details/82827472