第三章 MySQL高级查询

Posted 别动我的猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三章 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子句,可以对子查询中的行是否存在进行检查。子查询可以出现在表达式出现的任何位置。

以上是关于第三章 MySQL高级查询的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 基础 高级查询

mysql高级查询

SQL——MySQL高级查询2

mysql-高级查询

mysql高级排序&高级匹配查询示例

MySQL数据库 高级查询