DML和DQL
1.MySQL的存储引擎
(1)存储引擎的类型:
MyISAM、InnoDB 、Memory、CSV等9种
(2)MyISAM与InnoDB类型主要区别:
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣, 视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比 InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能
名称 | InnoDB | MyISAM |
---|---|---|
事务处理 | 支持 | 不支持 |
数据行锁定 | 支持 | 不支持 |
外键约束 | 支持 | 不支持 |
全文索引 | 不支持 | 支持 |
表空间大小 | 较大,约2倍 | 较小 |
(3)适用场合
使用MyISAM: 不支持事务,空间小,以查询访问为主 使用InnoDB: 多删除、更新操作,安全性高,事务处理及并发控制
(4)查看当前默认存储引擎
语法:
SHOW VARIABLES LIKE ‘%storage_engine%’;//模糊查询,查询mysql环境变量中字段包含eng的字段
(5)修改存储引擎
default-storage-engine= InnoDB //改为其他存储存储
2.设置表的存储引擎
语法:
CREATE TABLE 表名( #省略代码 )ENGINE=存储引擎;
示例:
CREATE TABLE `myisam` ( id INT(4) )ENGINE=MyISAM;
3.数据表的存储位置
(1)MyISAM类型表文件 *
.frm:表结构定义文件 * .MYD:数据文件 * .MYI:索引文件
(2)InnoDB类型表文件 *
.frm:表结构定义文件 ibdata1文件
(3)存储位置
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/" innodb_data_home_dir="D:/MySQL Datafiles/"
4.DML语句——插入单条数据记录
语法:
INSERT INTO 表名 [(字段名列表)] VALUES (值列表);
注意
字段名是可选的,如省略则依次插入所有字段 多个列表和多个值之间使用逗号分隔 值列表和字段名列表一一对应 如插入的是表中部分数据,字段名列表必填
示例:
INSERT INTO `student`(`loginPwd`,`studentName`,`gradeId`,`phone`,`bornDate`) VALUES('123','黄小平',1,'13956799999','1996-5-8');
5.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);
注意:
为避免表结构发生变化引发的错误,建议插入数据时写明具体字段名!
6.DML语句——将查询结果插入新表(如新表已存在,将会报错! )
语法: 如新表已存在,不能重复创建
CREATE TABLE 新表(SELECT 字段1,字段2…… FROM 原表);
示例:编写SQL语句实现从学生表提取姓名、手机号两列数据存储到通讯录表中
CREATE TABLE `phoneList`( SELECT `studentName`,`phone` FROM `student`);
7.删除数据记录(delete)
TRUNCATE语句删除后将重置自增列,表结构及其字段、约束、索引保持不变,执行速度比DELETE语句快(delete from 表名:清除表中的所有数据,使用之后自增列不会还原为1,而是跟随删除之前的索引继续增长,如原来是6,那么就从6开始增长;truncate table 表名:则是清零从1开始增长)
语法:
delete from 表名 【where条件】;//删除表中某条记录 truncate table 表名;//清除表中所有记录
示例:
delete from student where studentName = '王宝宝';//删除姓名为王宝宝的记录 truncate table student;//删除student表中的所有记录
8.更新数据记录
语法:
update 表名 set 字段1 = 值1, 字段2 = 值2,......字段n = 值n 【where 条件】;
示例:
UPDATE student SET sex = ‘女’;//将student表里的所有人的性别改为女
UPDATE student SET address = ‘北京女子职业技术学校家政班’ WHERE address = ‘北京女子职业技术学校刺绣班’;//把地址为北京女子刺绣班的人的地址改为家政班
9.查询语法
查询产生一个虚拟表 看到的是表形式显示的结果,但结果并不真正存储 每次执行查询只是从数据表中提取数据,并按照表的形式显示出来
语法:
SELECT <列名|表达式|函数|常量> FROM <表名> [WHERE <查询条件表达式>] [ORDER BY <排序的列名>[ASC(默认升序)或DESC(排序)]];
示例:
SELECT `studentNo`,`studentName`,`phone`,`address`,`bornDate` FROM `student` WHERE `gradeId` = 1 ORDER BY `studentNo`;//默认ASC升序排列
10.数据查询基础
查询全部的行和列
select * fron `student`;
查询部分列
SELECT `studentNo`,`studentName`,`address` FROM `student` WHERE `address`=‘河南新乡’;
/*给字段(列)起中文名,方便我们查询时查看,不改变原来表里字段名*/
/*1.as关键字起别名*/ select `studentNo`AS 学生学号,`studentName`as 学生姓名 ,`address` as 学生地址 from `student` where `address` <> '河南新乡';/*学生地址不等于河南新乡的所有学生*/ /*直接空格后加*/ select `studentNo` 学生学号,`studentName` 学生姓名,`address` 学生地址 from `student` where `address` <> '河南新乡';
11.数据查询-空行、常量列
查询空行
SELECT `studentName` FROM `student` WHERE `email` IS NULL;
使用常量列
SELECT `studentName` AS 姓名,`address` AS 地址, ’北京信息中心’ AS 学校名称 FROM `student`;
/*查询常量列*/ select `studentName`as 姓名,`address` as 学生地址,'昆明华信' as 学校名称 from `student`; select * from `student`;
12.常用函数——聚合函数
函数名 | 作用 |
---|---|
AVG() | 返回某字段的平均值 |
COUNT() | 返回某字段的行数 |
MAX() | 返回某字段的最大值 |
MIN() | 返回某字段的最小值 |
SUM() | 返回某字段的和 |
13.常用函数——字符串函数
函 数 名 | 作 用 | 举 例 |
---|---|---|
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 |
14.常用函数——时间日期函数
函数名 | 作用 | 举例(结果与当前时间有关) |
---|---|---|
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 |
15.常用函数——数学函数
函数名 | 作 用 | 举 例 |
---|---|---|
CEIL(x) | 返回大于或等于数值x的最小整数 | SELECT CEIL(2.3) 返回:3 |
FLOOR(x) | 返回小于或等于数值x的最大整数 | SELECT FLOOR(2.3) 返回:2 |
RAND() | 返回0~1间的随机数 | SELECT RAND() 返回:0.5525468583708134 |
16.MySQL查询语句中使用LIMIT子句限制结果集
SELECT <字段名列表> FROM <表名或视图> [WHERE <查询条件>] [GROUP BY <分组的字段名>] [HAVING <筛选分组的条件>[只能和GROUP BY一起用]] [ORDER BY <排序的列名>[ASC升序 或 DESC降序]]//不写默认是升序 [LIMIT [位置偏移量],[行数]];
示例:
/*查询所有年级编号为1的学院信息,按学号升序排序*/ select * from `student` where `gradeId` = 1 order by `studentNo`; /*显示前4条记录*/ select * from `student` where `gradeId` = 1 order by `studentNo` limit 0,4;/*从第0条记录开始默认是0 :正常写法:limit 0,4*/ /*每页4条,显示第2页,即从第5条记录开始显示4条数据(5-8)*/ /*第一个参数是从第几开始,第二个参数是取多少条(行)数据*/ select * from `student` where `gradeId` = 1 order by `studentNo` limit 4,4;
17.子查询
注意:将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个
子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询 子查询在WHERE语句中的一般用法
语法:
SELECT … FROM 表1 WHERE 字段1 比较运算符(子查询)
示例:
/*方法一:查找比‘李斯文’年龄小的学生*/ /*1.查询出李斯文的出生*/ select `bornDate` from `student` where `studentName` = '李斯文'; /*2.查询出生日期不李斯文的出生日期大的学生*/ select * from `student` where `bornDate` > '1903-07-23'; /*方法二:子查询合并两个查询*/ select * from `student` where `bornDate` >( select `bornDate` from `student` where `studentName` = '李斯文' );
18.查询“Logic Java”课程考试成绩为60分的学生名单
/*查询logic 课程考试成绩为60分的学生名单*/ select `studentName` from student where studentNo = ( select `studentNo` from `result` as r, `subject` as s where r.subjectNo = s.subjectNo and r.studentResult = 60 and s.subjectName = 'logic java' );
结果显示:(会报错:原因是子查询中返回不止1个值时, 使用比较运算符会出错)
解决方法:采用 IN 子查询 如下:
/*查询logic 课程考试成绩为60分的学生名单*/ select `studentName` from student where studentNo in ( select `studentNo` from `result` as r, `subject` as s where r.subjectNo = s.subjectNo and r.studentResult = 60 and s.subjectName = 'logic java' );
运行结果:(查询成功:将父查询中的where中的‘=’ 换为in即可 )
/*创建myschool数据库*/
create database myschool;
/*删除数据库myschool*/
drop database myschool;
/*删除student表里的主键*/
alter table `student` drop primary key;
/*删除student表*/
drop table student;
/*创建表前判断是否存在,存在就删除然后再创建*/
drop table if exists `student`;
create table `student`(
`studentNo` int(20) primary key auto_increment comment '学号',
`name` varchar(50) comment '姓名',
`class` varchar(50) comment '班级',
`sex` char(2) comment '性别',
`bornDate` DATETIME comment '出生日期'
);
/*删除student表里的studentNo和name字段*/
alter table `student` drop `studentNo`,drop `name`;
/*修改表里的studentNo字段为id*/
alter table `student` change `studentNo` `id` int(10);
/*添加兴趣爱好字段*/
alter table `student` add `like` varchar(100);
/*修改student表名为students*/
alter table `student` rename `students`;
/*查询students表的所有行和列*/
select * from `students`;
/*查询students表中学号为2021的学生信息*/
select id,`name`,class,sex,bornDate,`like` from `students` where id = '2021';
/*在students表中增加几条数据*/
insert into `students` values (2021,'张三','一年级一班','男','2021-01-01','听音乐'),(2022,'李四','一年级二班','女','2022-01-01','打游戏');
/*删除students表中的数据*/
delete from `students` where id = '2021' or id = '2022';
/*清空表中的数据*/
truncate table `students`;
/*修改更新id为2022的姓名为快乐的一只小青蛙*/
update `students` set `name` = '快乐的一只小青蛙' , `sex` = '男' where `id` = '2022';
select * from `student`;
select * from `result`;
select * from `subject`;
select * from `grade`;
/*查询结果集插入新表*/
/*从学生表提取姓名、手机号这两列数据存储到新的通讯录表里*/
create table `phoneList`(
select `studentName`,`phone` from `student`
);
/*查询新表phoneList*/
select * from `phoneList`;
/*给字段(列)起中文名,方便我们查询时查看,不改变原来表里字段名*/
/*1.as关键字起别名*/
select `studentNo`AS 学生学号,`studentName`as 学生姓名 ,`address` as 学生地址
from `student`
where `address` <> '河南新乡';/*学生地址不等于河南新乡的所有学生*/
/*直接空格后加*/
select `studentNo` 学生学号,`studentName` 学生姓名,`address` 学生地址
from `student`
where `address` <> '河南新乡';
/*查询空行*/
select * from `student`;
select * from `student`
where `email` is null;
/*查询常量列*/
select `studentName`as 姓名,`address` as 学生地址,'昆明华信' as 学校名称
from `student`;
select * from `student`;
/*把成绩都降低10%后加5分,查询及格成绩,成绩从高到低排序*/
select `studentNo` as 学生学号,(studentResult*0.9)+5 as 学生成绩
from `result`
where (studentResult*0.9)+5>=60
order by `studentResult` desc;
select * from result;
/*查询所有年级编号为1的学院信息,按学号升序排序*/
select * from `student`
where `gradeId` = 1
order by `studentNo`;
/*显示前4条记录*/
select * from `student`
where `gradeId` = 1
order by `studentNo`
limit 0,4;/*从第0条记录开始默认是0 :正常写法:limit 0,4*/
/*每页4条,显示第2页,即从第5条记录开始显示4条数据(5-8)*/
/*第一个参数是从第几开始,第二个参数是取多少条(行)数据*/
select * from `student`
where `gradeId` = 1
order by `studentNo`
limit 4,4;
/*将学生表中学号为2000,邮箱改为stu20000@163.com,密码=改为000*/
select * from `student`
where `studentNo` = 20000;
update `student` set `email` = 'stu20000@163.com',`loginPwd` = '000'
where `studentNo` = 20000;
/*讲课目表中课时数大于200且年级编号为1 的科目的课时减少10*/
select * from `subject`;
update `subject` set `classHour` = `classHour` - 10
where `classHour` > 200 and `gradeID` = 1;
/*将所有年级标号为1的学院姓名、性别、出生日期、手机号码信息保存到新表student_grade1*/
create table `student_grade1`(
select `studentName`,`sex`,`bornDate`,`phone`
from `student`
where `gradeID` = 1
);
/*方法一:查找比‘李斯文’年龄小的学生*/
/*1.查询出李斯文的出生*/
select `bornDate` from `student`
where `studentName` = '李斯文';
/*2.查询出生日期不李斯文的出生日期大的学生*/
select * from `student`
where `bornDate` > '1903-07-23';
/*方法二:子查询合并两个查询*/
select * from `student`
where `bornDate` >(
select `bornDate` from `student`
where `studentName` = '李斯文'
);
/*查询参加最近一次logic java 考试成绩的学生的最高分和最低分*/
/*1.查询参加最近一次logic java 考试的学生*/
select * from `result`;
select * from `subject`;
/*根据上面查询的日期再来查学生表*/
select max(`studentResult`) as 最高分,min(`studentResult`) as 最低分
from `result`
where `examDate` = (
select max(r.`examDate`) from `result` as r,
`subject` as s
where r.subjectNo = s.subjectNo
and s.subjectName = 'logic java'
);
/*查询logic 课程考试成绩为60分的学生名单*/
select `studentName` from student
where studentNo in (
select `studentNo` from `result` as r,
`subject` as s
where r.subjectNo = s.subjectNo
and r.studentResult = 60
and s.subjectName = 'logic java'
);
/*查询参加“Logic Java”课程最近一次考试的在读学生名单*/
/*1.获得 “Logic Java”课程的课程编号 子查询*/
select max(r.examDate) from result as r
inner join subject as s
on r.subjectNo = s.subjectNo
where s.subjectName = 'logic java';
/*2.根据课程编号查询得到“Logic Java”课程最近一次的考试日期*/
select * from student as s
inner join result as r
on s.studentNo = r.studentNo
where r.examDate in (
select max(r.examDate) from result as r
inner join `subject` as s
on r.subjectNo = s.subjectNo
where s.subjectName = 'logic java'
);
select * from student
where studentNo in (select studentNo from result);
/*查询未参加'logic java'课程最近一次考试的在读学生名单*/
select * from student as s
inner join result as r
on s.studentNo = r.studentNo
where examDate not in (
select max(r.examDate) from result as r
inner join `subject` as s
on r.subjectNo = s.subjectNo
where s.subjectName = 'logic java'
);
select * from grade;
select * from student;
select * from subject;
/*先查询获得年级名称是一年级的所有课程的课程编号,再根据课程编号查询课程表得到课程名称*/
select subjectName from `subject`
where gradeId in (
select gradeId from grade where gradeName = '一年级'
);
select * from result;
/*查询未参加“HTML”课程最近一次考试的在读学生名单*/
select * from student
where studentNo not in
(select studentNo from result
where studentNo in(
select max(r.examDate) from result as r
inner join `subject` as s
on r.subjectNo = s.subjectNo
where r.subjectNo in (
select subjectNo from `subject`
where subjectName = 'HTML'
)))
and gradeId = (
select subjectNo from subject
where subjectName = 'HTML'
);
SELECT `studentName` FROM `student`
WHERE `studentNo` NOT IN (
SELECT `studentNo` FROM `result`
WHERE `subjectNo` = (
SELECT `subjectNo` FROM `subject`
WHERE `subjectName`='HTML'
)
AND `examDate` = (
SELECT MAX(`examDate`) FROM `result`
WHERE `subjectNo` =(
SELECT `subjectNo` FROM `subject`
WHERE `subjectName`='HTML' )
))
AND `gradeId` = (
SELECT `subjectNo` FROM `subject`
WHERE `subjectName`='HTML'
);
19.union all 和union 的用法
-- 使用union all 是将两个字段数量相等的表中查到的所有信息合并在一列,不会去重;
--只使用union的话,就是将两个表中查到的信息合并到一个表中,并且将重复的字段去除
select * from result union select * from result;
union查询到的结果:
union all 查询到的结果:
20.数据库不适用表创建虚拟数据
注意:只能使用数字 as 起别名创建,使用字符串会出错
select 1 as a union all select 2 as b;
21.数据库获取当前数据库系统的时间
select sysdate() as 数据库当前时间,now() as 数据库当前时间; select now() as 数据库当前时间;
两个语句的运行结果是一样的
相关文章
- MySQL中DML语句和事务的概念「建议收藏」
- ORA-24381: error(s) in array DML ORACLE 报错 故障修复 远程处理
- ORA-38919: remote table not supported for DML error logging ORACLE 报错 故障修复 远程处理
- ORA-01135: file string accessed for DML/query is offline ORACLE 报错 故障修复 远程处理
- ORA-16129: unsupported DML encountered ORACLE 报错 故障修复 远程处理
- MySQL的 DDL和DML和DQL的基本语法详解
- SQL四种语言:DDL,DML,DCL,TCL详解程序员
- Oracle 视图 DBA_APPLY_DML_HANDLERS 官方解释,作用,如何使用详细说明
- 使用MySQL DML语句实现数据更新(mysqldml语句)
- 精通 Oracle 触发器的 DML 类型(oracle触发器类型)
- Exploring the World of MySQL DML: Understanding Data Manipulation in Action(mysqldml)
- Oracle DML操作实时监控系统(oracledml监控)
- MySQL数据库DML完全指南(mysql中dml全程)
- MySQL中DML的完整名称是什么(mysql中dml全称)
- Oracle数据库管理系统中的DML语句(oracle中dml语句)
- 掌握Oracle DQL语句实现数据查询(oracle dql语句)