第三章 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:从小到 ...
随机推荐
- 阿里云Maven地址
GFW 呵呵呵 下载几个jar要几个小时.....伤透了 直接替换国内阿里云的maven镜像地址 速度嗖嗖嗖的.... 配置 修改maven根目录下的conf文件夹中的setting.xml文件,内 ...
- NHibernate教程(8)--巧用组件
本节内容 引入 方案1:直接添加 方案2:巧用组件 实例分析 结语 引入 通过前面7篇的学习,有点乏味了~~~这篇来学习一个技巧,大家一起想想如果我要在Customer类中实现一个Fullname属性 ...
- 团队项目beta 汇总
一.冲刺计划安排 http://www.cnblogs.com/KKlist/p/6864124.html 二.七天的敏捷冲刺 第一天(2017.05.19) http://www.cnblogs.c ...
- 团队作业八——第二次团队冲刺(Beta版本)第6天
团队作业八--第二次团队冲刺(Beta版本)第6天 一.每个人的工作 (1) 昨天已完成的工作 简单模式逻辑代码涉及与相关功能的具体实现 (2) 今天计划完成的工作 修改完善注册登录内容界面,编辑错题 ...
- 读Zepto源码之Selector模块
Selector 模块是对 Zepto 选择器的扩展,使得 Zepto 选择器也可以支持部分 CSS3 选择器和 eq 等 Zepto 定义的选择器. 在阅读本篇文章之前,最好先阅读<读Zept ...
- Linux的诞生史
Linux的诞生史 目录 Multics计划--开始 自由的产物-BSD GUN计划的产生 导火索MINIX Linux的诞生 Linux的标志物 Linux的现状 Multics计划--开始. 这是 ...
- linux(3)磁盘与文件系统管理/查看硬盘、内存空间/文件系统的操作/ 文件的压缩和打包
一.磁盘与文件系统管理 1.分区与文件系统分区:记录每一个分区的开始柱面和结束柱面主引导区(master boot recorder):记录分区的数据,记录硬盘里所有的分区信息分区划分好后,要将分区格 ...
- [python学习笔记] 开篇
今天开始学习markdown,立贴为证. 平均一天一小时.两个月先学完基础. 所有的帖子只为了学习记录,有不对的请提出,轻吐槽
- RabbitMQ消息队列之一:RabbitMQ的环境安装及配置
RabbitMQ简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们 ...
- 利用原生js做数据管理平台
摘要:数据管理平台在当今社会中运用十分广泛,我们在应用过程中,要对数据进行存储,管理,以及删除查询等操作,而我们在实际设计的时候,大牛们大多用到的是JQuery,而小白对jq理解也较困难,为了让大家回 ...