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

  • 相关阅读:
    第三周学习进度条
    绘制echarts折线图
    第二周学习进度条
    返回一个整数数组中最大子数组的和
    软件工程第二周开课博客
    第一周学习进度条
    学习进度
    学习进度
    学习进度
    HDU 4906 (dp胡乱搞)
  • 原文地址:https://www.cnblogs.com/zeussbook/p/7580892.html
Copyright © 2011-2022 走看看