第三章 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:从小到 ...
随机推荐
- C# yield return用法
本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解.具体如下: yield关键字用于遍历循环中,yi ...
- Python3 多线程的两种实现方式
最近学习 Python3 ,希望能掌握多线程的使用,在此做个笔记.同时也希望Python 牛人指点错误.关于线程的概念,前面简单总结了一下 java 的多线程,传送门:java 多线程概念,三种创建多 ...
- 浏览器console的用法
Leo_wlCnBlogs 自由.创新.研究.探索 Linux/Windows Mono/DotNet [ Open Source .NET Development/ 使用开源工具进行DotNet软件 ...
- 【集美大学1411_助教博客】alpha阶段后 成绩
团队作业7 成绩(助教对团队排名) 团队名称 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结 全组讨论的照片 团队成员在Alpha阶段的角色和具体贡献 合计 排 ...
- SNS团队Beta阶段第一次站立会议(2017.05.22)
1.立会照片 2.每个人的工作 成员任务分工: 成员 今天已完成的工作 明天计划完成的工作 罗于婕 修改之前的文档 界面优化 龚晓婷 修改之前的文档 界面优化 林仕庄 修复不能发音bug 界面图标 ...
- Swing-JSlider用法-入门
JSlider是Swing中的滑块控件,在交互过程中用户可拖动它来实现数值的调整.它具有3个基本参数,分别为:最小值.最大值和初始值,如果不指定数值,则默认值分别为:0,100,50.滑块的值发生改变 ...
- 201521123093 java 第三周学习总结
1.本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点.截图或者拍照上传. 本周学习总结: ...
- 201521123070 《JAVA程序设计》第2周学习总结
1. 本章学习总结 1.学习了string类: 2.了解了ArrayList的特性和使用方法: 3.学习了类名包名. 2. 书面作业 Q1.使用Eclipse关联jdk源代码(截图),并查看Strin ...
- 201521123042《Java程序》第二周总结
1. 本周学习总结 了解枚举类型的使用方法. 学会使用ArrayList替换数组,并且学会运用相关函数,例如: strList.contains(str)(判断数组中是否包含字符串str,包含则返回t ...
- 201521123008 《Java程序设计》第十四周学习总结
1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 在自己建立的数据库上执行常见SQL语句(截图) - ...