第三章 MySQL高级查询(一)

第三章 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子句,可以对子查询中的行是否存在进行检查。子查询可以出现在表达式出现的任何位置。

时间: 2024-10-25 19:59:48

第三章 MySQL高级查询(一)的相关文章

第四章 MySQL高级查询(二)

第四章 MySQL高级查询(二) 一.EXISTS子查询 在执行create 或drop语句之前,可以使用exists语句判断该数据库对像是否存在,返回值是true或false.除此之外,exists也可以作为where语句的子查询,语法如下: SELECT --FROM 表名 WHERE  EXISTS(子查询): EXISTS关键字后面的参数是一个任意的子查询,如果该子查询没有返回行,则EXISTS子查询的结果为true,此时再执行外层查询语句.如果EXISTS子查询结果为false,此时外

第二部分 应用篇 第五章 MongoDB高级查询

声明:该文章主要来自<MongoDB实战>一书内容,主要想通过该书学习MongoDB的相应知识,加深理解,故写在自己的博文当中,作为记录,在最后的章节中,会有一个自己集合MongoDB数据库应用的JavaEE的web应用. 本章将结合实际应用,重点阐述一些实际工作中最常用的方法. 面向文档的NoSQL数据库主要解决的问题不是高性能的并发读写,而是保证海量数据存储的同时,具有良好的查询性能. MongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似

MySQL高级查询和编程基础

第一章 数据库设计 一.数据需求分析: 数据需求分析是为后续概念设计和逻辑结构设计做准备. 结构:(1)对现实世界要处理的对象进行详细的调查. (2)收集基础数.据. (3)对所收集的数据进行处理. (4)确定新的功能. 二.概念结构设计: 主要的五项概念:实体.属性.域.码.实体间联系. 实体之间的联系:(1)1:1 在任意一方建立另外一方的外键. (2)1:m 在多的一方建立一的外键. (3)m:n 建立第三张表,双方的主键在第三张表中作为外键. 三.使用E-R模型进行概念结构设计: E-R

第三章 MySQL数据库系统

防伪码:锲而舍之,朽木不折:锲而不舍,金石可镂 第三章.MySQL数据库系统    目前,比较主流的网站构架方式是LAMP(Linux+Apache+MySQL+PHP),即使用Linux作为操作系统,Apache作为Web服务器,MySQL作为数据库,PHP作为服务器端脚本解释器.由于这四个软件都是自由或开放源码软件(FLOSS),因此使用这种方式不用花一分钱就可以建立起一个稳定.免费的网站系统.    为方便演示,我们将使用图形化界面讲解MySQL基本操作.备份恢复以及用户授权 一.起源 a

MySql高级查询--连接查询

前言 我们使用SQL查询不能只使用很简单.最基础的SELECT语句查询.如果想从多个表查询比较复杂的信息,就会使用高级查询实现. 常见的高级查询包括多表连接查询.内连接查询.外连接查询与组合查询等,今天我们先来学习最常用.面试也很容易被问到的连接查询. 我们今天以一个简单的学生信息表(学生ID.学生姓名.学生性别)与一个学生成绩表(学生ID.学生成绩.成绩等级)作演示: student_info表: student_score表: 一.内连接(INNER JOIN) 1.等值连接 概述:指使用等

数据库---查询语句(三):高级查询

高级查询 一.多表连接(连接的是两个表中的列) 1.select * from Info,Nation where Info.Nation=Nation.Code select  Info.Code,Info.Name,Nation.Name  from Info ,Nation where Info.Nation=Nation.Code    //where 后面是一个外键关系 select * from Info      出现的现象,形成的表叫做笛卡尔积 2. join 连接 select

搞定linux上MySQL编程(三):MySQL高级语法

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 本节介绍Mysql高级语法,包括试图.存储过程.索引等,通过使用试图.触发器等来优化数据库设计和查询技术,提高数据处理能力与效率. 视图操作: 视图是一个虚拟表,内容由查询定义.视图并不在数据库中以存储的数据值集形式存在,行和列数据来源于定义视图的查询所引用的表,且在引用试图时动态生成.从数据库系统外部来看,视图就如同一张表一样,对表能够进行的一般操作的哦可以应用于视图,例如

《高性能MySQL》第三章MySQL服务器性能剖析学习笔记

MySQL性能优化介绍 什么是性能优化呢?其实我们往往从广义的定义是觉得一个MySQL系统的非功能性的优化都会看作是性能优化,比如我们会将数据库服务器的稳定性.每秒执行的SQL查询数目.系统的可扩展性.cpu利用率等等特性的优化都会看成是MySQL的性能优化. 我个人比较赞同本书的观点是MySQL性能优化应该就是指MySQL的查询响应时间的优化,MySQL性能优化就是将查询响应时间优化到一个客户或者用户体验能够接受的一个程度.

mysql 高级查询

高级查询:1.连接查询select * from Info,Nation #这是两个表名,中间用逗号隔开形成笛卡尔积select * from Info,Nation where Info.nation=Nation.code select Info.code,Info.name,Info.sex,Nation.name as '民族',Info.birthday from Info,Nation where Info.nation=Nation.code select * from Info