zl程序教程

您现在的位置是:首页 >  其它

当前栏目

DML和DQL

DML DQL
2023-06-13 09:14:11 时间

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 数据库当前时间;

两个语句的运行结果是一样的