第三章 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:从小到 ...
随机推荐
- 【★】深入BGP原理和思想【第…
前言:学思科技术我想说,浅尝辄止,不是天才千万别深钻.和我研究高等数学一样,越深入就会发现越多的问题与不合理之处.尤其对于IT界,算法的最终解释权还是掌握在老外手中,所以对于有些细节,我们" ...
- 测试与发布(Alpha版本)
[Alpha阶段]测试报告 1.测试找出的BUG (1).这种情况刷新就好 (2).文件必须10个才行,多余10个的部分不会进入查重的部分,少于会出错: (3).文件保存在d:\files,由于有些原 ...
- 201521123040《Java程序设计》第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 我们每次删除元 ...
- 201521123011 《java程序设计》 第7周学习总结
1. 本周学习总结 参考资料: XMind 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 1.2 解释E remove(int index)源 ...
- 201521123100 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
- 201521123087《java程序设计》第13周学习总结
1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 答: 往返行 ...
- 201521123101 《Java程序设计》第10周学习总结
1.本周学习总结 2.书面作业 1.finally,题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? finally不管是否捕获到异常,始终会被 ...
- 【干货】教你如何利用fullPage.js以及move.js插件打造高端大气的网站效果!
前言: 如今我们经常能见到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容,显得格外的高端大气上档次. 在学习过jQuery插件之后,才发现之前的很多网站特效完全可 ...
- 理解 IntelliJ IDEA 的项目配置和Web部署
1.项目配置的理解 IDEA 中最重要的各种设置项,就是这个 Project Structre 了,关乎你的项目运行,缺胳膊少腿都不行.最近公司正好也是用之前自己比较熟悉的IDEA而不是Eclipse ...
- Java 网络 IO 模型
在进入主题之前先看个 Java 网络编程的一个简单例子:代码很简单,客户端和服务端进行通信,对于客户端的每次输入,服务端回复 get.注意,服务端可以同时允许多个客户端连接. 服务端端代码: // 创 ...