第三章 MySQL高级查询(一)
第三章 MySQL高级查询(一)
一.SQL语言的四个分类
- 1. DML(Data Manipulation Language)(数据操作语言):用来插入,修改和删除表中的数据,如INSERT,UPDATE,DELECT。
- 2. DDL(Data Definition Language)(数据定义语言):创建或删除数据库对象操作,有CREATE,DROP,ALTER三个语法组成。
- 3. DQL (STructured Query Language)(数据查询语言):用来对数据库中的语言进行查询,指SELECT语句。
- 4. DCL(Data Control Language)(数据控制语言):用来控制数据库组建的存取许可,存取权限等,如GRANT,REVOKE. <GRANT 授权 REVOKE 取消授权>
二.修改表
MySQL使用ALTER关键字来实现,注意在修改表之前,使用SHOW TABLES语句查询该数据库中是否存在该表。
1.修改表名
语法: ALTER TABLE <旧表名> RENAME [TO] <新表名>;
其中[TO]为可选参数,不影响结果,仅修改表名,表结构不变。
2.添加字段<列>
语法: ALTER TABLE 表名 ADD 字段名 数据类型 [属性];
例: ALTER TABLE `student` ADD `password ` VARCHAR(32) NOT NULL;向学生表中添加密码的字段。
3.修改字段<列>
语法: ALTER TABLE 表名 CHANGE 原字段名 新字段名 数据类型[属性];
例: ALTER TABLE `student` CHANGE `password` `pwd`CHAR(12) NOTNULL;修改学生表中的密码字段的名称和属性。
4.删除字段
语法: ALTER TABLE 表名 DROP 字段名;
例: ALTER TABLE `student` DROP `pwd`; 删除学生表中的密码字段
5.添加主键
语法: ALTER TABLE 表名 ADD CONSTRAINT 主键名 PEIMARY KEY 表名(主键字段);
例: ALTER TABLE `student` ADD CONSTRAINT ‘pk_student’ PRIMARY KEY `student`(`studentNO`);把学生表中的学号设置为主键列
6.添加外键约束
语法: ALTER TABLE 主表名 ADD CONSTRAINT 外键名 FOREIGN KEY (外键字段)REFERENCES 关联从表名(关联字段);
例: ALTER TABLE `student` ADD CONSTRAINT `fk_student_grade` FOREIGN KEY(`gradeID`) REFERENCES `grade`(`gradeID`);把学生表和年级表中的年级字段设置为主外键关系。
三.数据操作(DML)语句
1.插入单行数据
语法: INSERT INTO 表名 [(字段名列表)] VALUES (值列表);
插入数据的注意事项:
1) 表的字段名时可选的,如果省略,则需插入表中的所有字段。
2) 多个列表和多个值之间使用逗号“,”分开。
3) 值列表必须和字段列表一一对应,且值类型相同。
4) 如果插入表中部分数据,字段名列表必须填写,且遵循3)。
2.插入多行数据
语法:INSERT INTO 表名 [(字段名列表)] VALUES (值列表1),(值列表2)….. (值列表n);
3.将查询结果插入到新表
语法一: 需要按插入字段的类型,顺序,个数先创建表,才能插入数据
SELECT 字段1,字段2…….INTO 新表名 FROM 原表名;
语法二:无需先创建表
CREATE TABLE 新表(SELECT 字段1,字段2……FROM 原表);
4.更新数据记录
语法: UPDATE 表名 SET 字段1=值1,字段2=值2…字段n=值n WHERE 条件;
5.删除数据
语法一: DELETE FROM 表名 WHERE条件;
语法二:TRUNCATE TABLE 表名;
它们的区别是delete按条件删除表中的数据,精确性更高;truncate是删除整个表,效率更高,并且删除后可以重置自增列。
四.数据查询语句(DQL)
1.SQLserver语句语法
SELECT <字段名列表>
FROM <表名或视图>
WHERE 查询条件
GROUP BY<分组的字段名>
HAVING<筛选分组的条件>
ORDER BY<排序的字段名>[ASC升序/DESC降序]
2 .MySQL的LIMIT子句
SELECT <字段名列表>
FROM <表名或视图>
WHERE 查询条件
GROUP BY<分组的字段名>
ORDER BY<排序的字段名>[ASC升序/DESC降序]
LIMIT 位置偏移量,显示数据的行数;
其中位置的偏移量是指从查询结果集中第几条数据开始显示,第一条记录的位置是0,此参数为可选项,默认从第一条显示.
3 .常用的函数
1.聚合函数
AVG()平均值;COUNT()统计字段的行数; MAX()最大值; MIN()最小值; SUM()求和
2.字符串函数
|
函数名、 |
作用 |
举例 |
|
CONCAT(str1,str2…) |
连接括号内的字符串 |
SELECT CONCAT(‘my’,’s’,’ql’); 返回:mysql |
|
INSERT(str,pos,len,newstr) |
将字符串str从pos位置开始,len个字符长的子串替换为字符串newstr |
SELECT INSERT(‘这是SQLserver数据库’,3,10,’mysql’) 返回:这是mysql数据库 |
|
LOWER(str) |
将字符串str全部变为小写 |
|
|
UPPER(str) |
将字符串str全部变为大写 |
|
|
SUBSTRING(str,num,len) |
返回字符串str的第num个位置开始长度为len的子字符串 |
SELECT SUBSTRING(‘javamysqlOrcle’,5,5); 返回:mysql |
3.时间日期函数
|
函数名 |
作用 |
举例 |
|
CURDATE() |
获取当前的日期 |
SELECT CURDATE(); 返回:2017-09-23 |
|
CURTIME() |
获取当前的时间 |
SELECT CURTIME(); 返回:12:25:00 |
|
NOW() |
获取当前的日期和时间 |
SELECT NOW(); 返回:2017-09-23 12:25:01 |
|
WEEK(date) |
返回日期date为一年中的第几周 |
SELECT WEEK(NOW()); 返回:26 |
|
YEAR(date) |
返回日期date的年份 |
SELECT YEAR(NOW()); 返回:20017 |
|
HOUR(time) |
返回事件time的小时值 |
SELECT HOUR(NOW()); 返回:12,返回现在几点 |
|
MINUTE(time) |
返回时间的分钟值 |
|
|
DATEDIFF(date1,date2) |
返回日期参数date 1和date2之间相隔的天数 |
SELECR DATEDIFF(NOW(),2009-09-1); 返回:2281 |
|
ADDDATE(date,n) |
计算日期date加上天数n天之后的日期 |
SELECT ADDDATE(NOW(),5); 返回:2017-09-28 12:34:00 |
4.数学函数
|
函数名 |
作用 |
举例 |
|
CELT(x) |
返回大于或等于x的最小整数 |
SELECT CELT(2.3); 返回:3 |
|
FLOOR(x) |
返回小于或等于x的最小整数 |
SELECR FLOOR(2.3); 返回:2 |
|
RAND() |
返回0~1之间的随机数 |
SELECT RAND(); 返回:0.551111245245016 |
五.子查询
1.简单的子查询
定义:子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询
子查询在WHERE语句中的一般用法:
将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个
例:查询“Java Logic”课程至少一次考试刚好等于60分的学生
第一步:查询“Java Logic”课程的课程编号
第二步:根据课程编号查询成绩是60分学生的学号
第三步:根据学号查询得到学生姓名
法一:采用表连接
SELECT `StudentName` FROM `Student` stu
INNER JOIN `Result` r ON stu.StudentNO = r.StudentNo
INNER JOIN `Subject` sub ON r.SubjectNo = sub.SubjectNo
WHERE `StudentResult` = 60 AND `SubjectName` = 'Java Logic'
GO
实现方法二:采用子查询
SELECT `StudentName` FROM `Student` WHERE `StudentNo` = (
SELECT `StudentNo` FROM `Result`
INNER JOIN `Subject` ON Result.SubjectNo= Subject.SubjectNo
WHERE StudentResult=60 AND SubjectName='Java Logic'
)
GO
1)一般来说,表连接都可以用子查询替换,但有的子查询却不能用表连接替换
2)子查询比较灵活、方便,常作为增删改查的筛选条件,适合于操纵一个表的数据
3)表连接更适合于查看多表的数据
2.IN子查询
使用IN关键字可以使父查询匹配子查询返回多个字段值。
例:查询参加“Java Logic”课程最近一次考试的在读学生名单
第一步:获得Java Logic课程的课程编号
SELECT SubjectNo FROM Subject
WHERE SubjectName='Java Logic'
第二步:根据课程编号查询得到Java Logic课程最近一次的考试日期
SELECT MAX(ExamDate) FROM Result WHERE SubjectNo=(
SELECT SubjectNo FROM Subject
WHERE SubjectName='Java Logic' )
第三步:根据课程编号和最近一次的考试日期查询出在读学生信息
SELECT StudentNo, StudentName FROM Student
WHERE StudentNo IN (
SELECT StudentNo FROM Result
WHERE SubjectNo IN (
SELECT SubjectNo FROM Subject
WHERE SubjectName='Java Logic'
) AND ExamDate = (
SELECT MAX(ExamDate) FROM Result
WHERE SubjectNo = (
SELECT SubjectNo FROM Subject
WHERE SubjectName='Java Logic'
)
)
)
3.NOT IN子查询
例:查询未参加“Java Logic”课程最近一次考试的在读学生名单
SELECT StudentNo, StudentName FROM Student
WHERE StudentNo NOT IN (
SELECT StudentNo FROM Result
WHERE SubjectNo = (
SELECT SubjectNo FROM Subject
WHERE SubjectName='Java Logic'
) AND ExamDate = (
SELECT MAX(ExamDate) FROM Result
WHERE SubjectNo = (
SELECT SubjectNo FROM Subject
WHERE SubjectName='Java Logic' ) ) )
AND GradeId = (
SELECT GradeId FROM Subject WHERE SubjectName = 'Java Logic'
)
六.总结
查询的方法有三种
联合——合并多个数据集中的行
子查询——将一个查询嵌套在另一个查询中
连接——合并多个数据表中的列
比较运算符后面的子查询只能返回单个数值。
IN子查询后面可跟随返回多条记录的子查询,用于检测某列的值是否存在于某个范围中。
在子查询中使用EXISTS子句,可以对子查询中的行是否存在进行检查。子查询可以出现在表达式出现的任何位置。
第三章 MySQL高级查询(一)的更多相关文章
- 第四章 MySQL高级查询(二)
第四章 MySQL高级查询(二) 一.EXISTS子查询 在执行create 或drop语句之前,可以使用exists语句判断该数据库对像是否存在,返回值是true或false.除此之外,exists ...
- accp8.0转换教材第4章MySQL高级查询(二)理解与练习
知识点:EXISTS子查询.NOT EXISTS子查询.分页查询.UNION联合查询 一.单词部分 ①exist存在②temp临时的③district区域 ④content内容⑤temporary暂时 ...
- accp8.0转换教材第3章MySQL高级查询(一)理解与练习
一.单词部分 ①constraint约束②foreign外键③references参考 ④subquery子查询⑤inner内部的⑥join连接 二.预习部分 1.修改表SQL语句的关键字是什么 RE ...
- MySQL高级查询与编程笔记 • 【目录】
章节 内容 实践练习 MySQL高级查询与编程作业目录(作业笔记) 第1章 MySQL高级查询与编程笔记 • [第1章 数据库设计原理与实战] 第2章 MySQL高级查询与编程笔记 • [第2章 数据 ...
- MySQL 高级查询操作
目录 MySQL 高级查询操作 一.预告 二.简单查询 三.显示筛选 四.存储过程 五.查询语句 1.作为变量 2.函数调用 3.写入数据表 备注 附表一 附表二 相关文献 博客提示 MySQL 高级 ...
- python进阶09 MySQL高级查询
python进阶09 MySQL高级查询 一.筛选条件 # 比较运算符 # 等于:= 不等于:!= 或<> 大于:> 小于:< 大于等于>= 小于等于:<= #空: ...
- 第09章 MySQL子查询
第09章 MySQL子查询 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入. SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要 ...
- MySQL高级查询与编程作业目录 (作业笔记)
MySQL高级查询与编程笔记 • [目录] 第1章 数据库设计原理与实战 >>> 第2章 数据定义和操作 >>> 2.1.4 使用 DDL 语句分别创建仓库表.供应 ...
- 网络安全从入门到精通(第二章-3)后端基础SQL— MySQL高级查询与子查询
本文内容: MySQL的基础查询语句 链接查询 联合查询 子查询 渗透测试常用函数 1,MySQL基础查询语句: select * from 表 order by ASC/DESC; ASC:从小到 ...
随机推荐
- angularjs自定义指令实现分页插件
由于最近的一个项目使用的是angularjs1.0的版本,涉及到分页查询数据的功能,后来自己就用自定义指令实现了该功能.现在单独做了个简易的小demo,主要是为了分享自己写的分页功能.注:本实例调用的 ...
- CCNA+NP学习笔记—交换网络篇
本章关于企业网络的最底层--交换层,难度较低,主要为以后三层的路由做铺垫.所有笔记的分类顺序为:序章→交换层→路由层→运营商,体现了从企业网到互联网的学习顺序. 注:思科设备命令行通常不分大小写!以后 ...
- 【集美大学1411_助教博客】团队作业9——测试与发布(Beta版本)
写在前面的话 已经看到了大家的发布成果,很欣喜,虽然有的团队的产品还是有一点问题,但大家也都发布成功了,这就是软件的魅力.但还是要说一些问题,大家录的视频不是没人讲解就是讲得太快,在我看来这都没有在卖 ...
- 团队作业4——第一次项目冲刺(Alpha版本) Day6
首先和助教及老师表示抱歉,博客确实当时就写了,但是一直不算写好,因为这几天卡住了,预计实现的功能实现不了,进度跟不上,现在也在寻求解决方法. 1.站立式会议: 2. Leangoo任务分解图: 3.任 ...
- 201521123090 《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 继承与多态的概念与实现 父类与之类的关系 解决代码复用的办法 2. 书面作业 注释的应用 使 ...
- 201521123096《Java程序设计》第三周学习总结
1. 本周学习总结 2. 书面作业 (1)代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...
- 201521123032 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
- 201521123053《Java程序设计》第十一周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 我还是比较喜欢XMind思维导图 延续上周对线程的知识点总结,对多线程知识点进行扩充. 知识点: synchron ...
- [03] Servlet继承关系和生命周期
1.Servlet的继承关系 假如现有我们自定义的一个Servlet,继承HttpServlet,那么实际上它的继承链如下图: 可以看到,核心的部分在于: 两个顶级接口 Servlet Servl ...
- 如何使用fiddler抓取https请求(PC和移动端)
最近做一个抓取移动端app接口,并执行评论,收藏的接口功能测试.怎么搞/(ㄒoㄒ)/~~ 按照老思路试一试,第一步还是要用fiddler来帮忙获取接口信息! 一.基本的抓取http请求设置: 1.cm ...