• MySQL中的DML、DQL和子查询


      一、MySQL中的DML语句

      1、使用insert插入数据记录:

    INSERT INTO `myschool`.`student`
     (`studentNo`, `loginPwd`, `studentName`, `sex`, `gradeId`, `phone`, `address`, `birthday`) 
        VALUES ('2', '1234', '唐川普', '', '2', '18266668888', '美国纽约', '1900-01-01');
    
    INSERT INTO student (studentNo,loginPwd,studentName,sex,gradeId,phone,address,birthday)
      VALUES ('3', '1234', '江长者', '', '2', '18266668888', '中国上海', '1900-01-01');
    
    /*数据库名、表名、字段名都可以不用``标识*/
    /*varchar、data型字段,必须用''单引号标识*/
    /*int型字段,加不加单引号都没关系*/
    
    /*插入多行数据*/
    INSERT INTO student (studentNo,loginPwd,studentName,sex,gradeId,phone,address,birthday)
      VALUES 
        ('3', '1234', '江长者', '', '2', '18266668888', '中国上海', '1900-01-01'),
        ('2', '1234', '唐川普', '', '2', '18266668888', '美国纽约', '1900-01-01');
    
    /*推荐在插入数据时指定具体的字段名,更稳定安全*/
    /*也可以把查询结果直接用来创建新表*/
    create table phoneList(select studentName,phone from student);

       2、使用update更新数据记录

    /*语法*/
    update tableName set colum1=xxx,colum2=xxx [where ...]
    
    /*例子*/
    /*set用来筛选列,where用来筛选行*/
    update student set loginPwd='0704',address='湖南邵阳' where studentName='李酸村';

      3、使用delete、truncate table删除数据记录

    /*使用delete,它后面不跟列名*/
    /*注意约束*/
    delete from student where studentNo=10;
    
    /*使用truncate table删除所有行*/
    /*执行速度更快,使用的系统资源和事务日志资源更少,不能用于有外键约束的表*/
    /*实际工作中,不推荐此方式,因为不能恢复*/
    truncate table student;

      4、select语句

      SELECT——筛选列;WHERE——筛选行;

      DISTINCT,让单个列下的不同记录只出现一次。

      查询使用别名(select colum as xxx):

    select [DISTINCT]studentNo as 学生编号 from student where address='湖南';

      查询空值(is null、is not null):

    select studentName where email is null;

      查询中使用常量列:在select后面跟一个常量,对列进行筛选。  

      5、LIMIT子句:

    /*语法*/
    /*显示结果集中指定位置的指定行数*/
    select  * from student [limit [位置偏移量],行数];
    
    /*从结果中的第5条开始显示,每次显示4条*/
    select  * from student limit 44

      6、对查询结果排序

      6.1 对单列排序

      在select语句后添加“order by <colum_name>”,就可以以该列的排序结果,显示整个查询结果,默认是升序,即“ASC”(此时null值最前)。若要降序排列,添加关键字“DESC”就好(此时null值最后)。

    /*以宠物的出生日期排序*/
    select name,owner,birth from pet order by birth desc;

      对字符类型的列排序,MySQL默认是忽略大小写的。如果需要区分大小写,在选择的列名面前添加“BINARY”:

    /*以宠物的名字排序,比较时区分大小写(这里并无意义),升序排列*/
    select name,birth from pet order by binary name ASC;

      6.2 对多列排序

    /*对整个结果先以species升序(默认)排序*/
    /*相同的species结果中,以birth降序排列*/
    /*值得注意的是,DESC只影响到birth*/
    SELECT name, species, birth FROM pet ORDER BY species, birth DESC;

      7、总结select的模式:

    select <字段列表> from <表名或者视图>
        [where <查询条件>]
        [group by <分组的字段名>]
        [order by [binary] <排序的列名>] [ASC|DESC]
        [limit [位置偏移量],行数]

      8、常用函数分类:聚合函数、字符串函数、时间日期函数、数学函数

      日期计算:

    /*根据宠物的出生日期(birth)计算年龄*/
    /*timestampdiff()函数需要两个date类型的数据作为参数*/
    SELECT name, birth, CURDATE(),
        TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM pet;

      结果:

      假如,有一列记录宠物的死亡日期,death,那我们可以根据这一列是否为null,列出已经死亡的宠物,以及年龄:

    /*null是一个特别的值,无法用算术比较符进行比较*/
    SELECT name, birth, death,
        TIMESTAMPDIFF(YEAR,birth,death) AS age
            FROM pet WHERE death IS NOT NULL ORDER BY age;

      结果如下:

     

      二、子查询——将一个查询嵌套在另一个查询中。

      1、简单子查询

      例如,查看年龄比“李斯文”小的学生。

      分析:先查出“李斯文”的出生日期;然后,利用where语句筛选出生日期比“李斯文”大的学生

    SELECT studentNo,studentName,sex,birthday,address FROM student
      WHERE birthday>(SELECT birthday FROM student WHERE studentName='李斯文');

      这里,括号内的子查询返回的是李斯文的生日:1993-07-23——一个DATA类型的数据。

      子查询使用的比较运算符有>、=、<、>=、<=,执行时,先执行子查询,返回值;再执行整个父查询,返回最后结果。(比较运算符后面的子查询只能返回单个数值)

      子查询作为WHERE条件的一部分,还可以和UPDATE、INSERT、DELETE一起使用。

      建议在编写查询语句时,直接指定要显示的列名,而不是用*,因为后者占用的资源大,可维护性低。

     

      2、使用子查询在多表间查询符合条件的数据

      例如,查询Logic Java课程至少一次考试刚好等于60分的学生名单。

      分析:

      (1)查询subject表,获得课程的课程ID;

      (2)根据课程ID,查询result表中成绩是60分的学生的编号;

      (3)根据,学号,查询student表得到学生姓名;

    select studentName from student where studentNo=
        (select studentNo from result
            inner join Subject on result.subjectNo=subject.subjectNo
                where studentResult=60 and subjectName='Logic Java');

       3、IN和NOT IN子查询:后面可跟随返回多条记录的子查询,用于检测某字段的值是否存在于某个范围中。

      现在,有多个学生的Logic Java课程考试成绩为60分,采用简单的子查询就会出现编译错误“Subquery returns more than 1 row”,即子查询返回值不唯一。

      现在使用IN子查询:

    select studentName from student
        where studentNo IN
        (select studentNo from result where subjectNo =
            (select subjectNo from subject where subjectName ='Logic Java')
                AND studentResult = 60);

      另一个梨例子,查询参加Logic Java课程最近一次考试的在读学生名单(四层嵌套):

      (1)获得课程编号;

      (2)根据课程编号得到最近的一次课程考试日期;

      (3)根据课程编号和最近一次的考试日期查询学生信息;

    SELECT studentNo,studentName FROM student where studentNo
        IN(
            select studentNo from result where subjectNo=
                (select subjectNo from subject where subjectName='Logic Java')
                AND examDate=
                     (select MAX(examDate) from result where subjectNo=
                        (select subjectNo from subject where subjectName='Logic Java')
                      )
            );

       4、NOT IN查询

      如何查询得到没有参加Logic Java课程最近一次考试的在读学生名单?

    SELECT studentNo,studentName FROM student where studentNo
        NOT IN(
            select studentNo from result where subjectNo=
                (select subjectNo from subject where subjectName='Logic Java')
                AND examDate=
                     (select MAX(examDate) from result where subjectNo=
                        (select subjectNo from subject where subjectName='Logic Java')
                      )
            )AND gradeID=(...);

      还可以在NOT IN的条件外继续AND() 添加条件~~

      5、NULL值的使用

      上面提到了NULL值在升序和降序排列中的表现。但是是group by语句下,NULL值则被视为相等。

      而且对于一个NOT NULL限制下的列,是可以插入“0”或者空字符的。

     

     

  • 相关阅读:
    数据库基础(2)
    数据库基础
    多线程(3)
    多线程(2)
    多线程(1)
    并发编程(3)
    软件工程——个人总结
    软件工程第二次作业-结对编程
    软件工程第二次作业——结对编程心得体会
    软件工程第一次作业补充
  • 原文地址:https://www.cnblogs.com/bigbigbigo/p/8403334.html
Copyright © 2020-2023  润新知