第三章 MySQL高级查询(一)

一.SQL语言的四个分类

  1. 1.       DML(Data Manipulation Language)(数据操作语言):用来插入,修改和删除表中的数据,如INSERT,UPDATE,DELECT
  2. 2.       DDLData Definition Language(数据定义语言):创建或删除数据库对象操作,有CREATE,DROP,ALTER三个语法组成。
  3. 3.       DQL (STructured Query Language)(数据查询语言):用来对数据库中的语言进行查询,指SELECT语句。
  4. 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高级查询(一)的更多相关文章

  1. 第四章 MySQL高级查询(二)

    第四章 MySQL高级查询(二) 一.EXISTS子查询 在执行create 或drop语句之前,可以使用exists语句判断该数据库对像是否存在,返回值是true或false.除此之外,exists ...

  2. accp8.0转换教材第4章MySQL高级查询(二)理解与练习

    知识点:EXISTS子查询.NOT EXISTS子查询.分页查询.UNION联合查询 一.单词部分 ①exist存在②temp临时的③district区域 ④content内容⑤temporary暂时 ...

  3. accp8.0转换教材第3章MySQL高级查询(一)理解与练习

    一.单词部分 ①constraint约束②foreign外键③references参考 ④subquery子查询⑤inner内部的⑥join连接 二.预习部分 1.修改表SQL语句的关键字是什么 RE ...

  4. MySQL高级查询与编程笔记 • 【目录】

    章节 内容 实践练习 MySQL高级查询与编程作业目录(作业笔记) 第1章 MySQL高级查询与编程笔记 • [第1章 数据库设计原理与实战] 第2章 MySQL高级查询与编程笔记 • [第2章 数据 ...

  5. MySQL 高级查询操作

    目录 MySQL 高级查询操作 一.预告 二.简单查询 三.显示筛选 四.存储过程 五.查询语句 1.作为变量 2.函数调用 3.写入数据表 备注 附表一 附表二 相关文献 博客提示 MySQL 高级 ...

  6. python进阶09 MySQL高级查询

    python进阶09 MySQL高级查询 一.筛选条件 # 比较运算符 # 等于:= 不等于:!= 或<> 大于:> 小于:< 大于等于>= 小于等于:<= #空: ...

  7. 第09章 MySQL子查询

    第09章 MySQL子查询 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入. SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要 ...

  8. MySQL高级查询与编程作业目录 (作业笔记)

    MySQL高级查询与编程笔记 • [目录] 第1章 数据库设计原理与实战 >>> 第2章 数据定义和操作 >>> 2.1.4 使用 DDL 语句分别创建仓库表.供应 ...

  9. 网络安全从入门到精通(第二章-3)后端基础SQL— MySQL高级查询与子查询

    本文内容: MySQL的基础查询语句 链接查询 联合查询 子查询 渗透测试常用函数 1,MySQL基础查询语句: select * from 表 order  by ASC/DESC; ASC:从小到 ...

随机推荐

  1. grunt对象之api

    grunt已经扯了七篇了,殊为不易.最后一篇扯点早应该提及的东西,就是module.exports = function(grunt) {}传入的这个grunt.之前的代码grunt一般只出现在Gru ...

  2. 英语app分析

    Andorid 版本 第一部分 调研, 评测 搜索了一下必应跑出来的是微软必应,在印象中微软的产品都是很可靠地.安装之后对它的 排版字体图片等不是很喜欢,感觉有道词典会更亲切一点. 必应       ...

  3. 团队作业8——第二次项目冲刺(Beta阶段)--5.26 sixth day

    团队作业8--第二次项目冲刺(Beta阶段)--5.26 sixth day Day six: 会议照片 项目进展 Beta冲刺的第四天,以下是今天具体任务安排: 队员 昨天已完成的任务 今日计划完成 ...

  4. 201521123061 《Java程序设计》第十二周学习总结

    201521123061 <Java程序设计>第十二周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对 ...

  5. 201521123089《Java程序设计》第6周学习总结

    1. 本周学习总结 2. 书面作业 clone方法1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么?                 ...

  6. 201521123035《Java程序设计》第五周学习总结

    1. 本章学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 接口是一种特殊的抽象类,是对行为的抽象,它不能使用new进行实例化,接口中可以包 ...

  7. #黑客攻防实战详解#[Chapter 1]

    1.1 ①配置模拟入侵环境 ②配置网络拓扑   

  8. 201521123071 《JAVA程序设计》第九周学习总结

    第九周-异常 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 此处仅部分知识点归纳 2. 书面作业 1. 常用异常,题目5-1 1.1 截图你的提交结果(出现学号) ...

  9. es6中对象的类与继承方法

    对于对象,我一直搞不清楚到底是该如何去继承,如何去书写.在熟练es6之后,终于会尝试写出来了. 代码如下: //我们假定父类为person,子类为man class person{ construct ...

  10. 用List传递学生信息

    集合在程序开发中经常用到,例如,在业务方法中将学生信息.商品信息等存储到集合中,然后作为方法的返回值返回给调用者,以此传递大量的有序数据. 本实例将使用List集合在方法之间传递学生的信息.实例效果如 ...