第三章 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:从小到 ...
随机推荐
-
[New Portal]Windows Azure Storage (14) 使用Azure Blob的PutBlock方法,实现文件的分块、离线上传
<Windows Azure Platform 系列文章目录> 相关内容 Windows Azure Platform (二十二) Windows Azure Storage Servic ...
-
JavaScript中作用域和作用域链解析
学习js,肯定要学习作用域,js作用域和其他的主流语言的作用域还存在很大的区别. 一.js没有块级作用域. js没有块级作用域,就像这样: if(){ : console.log(a) //输出100 ...
-
DOM何时Ready
由于script标签在被加载完成后会立即执行其中代码,如果在代码中要访问HTMLElement,可是这时候元素还没有加载进来,所以对元素的操作统统无效. 最早的时候使用window.onload = ...
-
关于java 中文乱码问题 自己的一点解决方案
早上做导出的时候,url拼接参数中文出现了乱码.查了半天.终于中午搞定了. 在web.xml中加了转码过滤器,tomcat的server.xml中也加入URIEncoding="UTF-8& ...
-
linux---文本编辑vi
本文摘自:鸟哥的linux私房菜
-
hdu 2629 Identity Card (字符串解析模拟题)
这题是一个字符串模拟水题,给12级学弟学妹们找找自信的,嘿嘿; 题目意思就是要你讲身份证的上的省份和生日解析出来输出就可以了: http://acm.hdu.edu.cn/showproblem.ph ...
-
容斥原理算法总结(bzoj 2986 2839)
容斥原理是一个从小学就开始学习的算法.但是很多难题现在都觉得做的十分吃力. 容斥原理大概有两种表现形式,一种是按照倍数进行容斥,这个东西直接用莫比乌斯函数就可以了. #include<iostr ...
-
Python爬虫入门教程 9-100 河北阳光理政投诉板块
河北阳光理政投诉板块-写在前面 之前几篇文章都是在写图片相关的爬虫,今天写个留言板爬出,为另一套数据分析案例的教程做做准备,作为一个河北人,遵纪守法,有事投诉是必备的技能,那么咱看看我们大河北人都因为 ...
-
tomcat中显示本地图片①(已解决)
解决方案 我直接放源码了. 原理就是:我虽然调用的是虚拟目录,但是会映射到对应路径的实际 第一步:(在tomcat的 server.xml中创建一个虚拟目录) 虚拟目录创建方式: <Contex ...
-
mysql 单表卡死
由于单表数据量过大导致的更新操作处于卡死状态,无法打开也无法修改. 此时需要命令行模式连接数据库,注意点:此处连接需要相同的账号 1. $ SHOW PROCESSLIST; 2. $ kill 37 ...