zoukankan      html  css  js  c++  java
  • 数据库简单操作以及多表查询操作的一些总结

    student学生数据表

     
    Sno Sname Ssex Sage Sclass
    S101  张三  男 18  1
    S102  李四  男  18  2
    S103  王五  女  18  2
    S104  赵六  男 18  3
    S105 钱七  女 18  1
    S106 孙八  女 18  1

    course课程数据表

    Cno Cname Tno
    C001 大学语文 T01
    C002 高等数学 T02
    C003 大学英语 T03
    C004 java编程 T04

    score成绩数据表

    Sno Cno Degree
    S102 C002 78
    S105 C002 87
    S105 C003 65
    S103 C001 76
    S104 C001 83
    S104 C002 76
    S101 C003 45
    S101 C004 63
    S106 C002 20
    S106 C003 84
    S103 C003 62
    S103 C004 55

    teacher老师数据表

    Tno Tname Tsex Tage Prof Depart
    T01 小布 38 副教授 计算机系
    T02 小贤 52 讲师 电子工程系
    T03 小谷 47 助教 计算机系
    T04 小伟 45 助教 电子工程系

    创建表时的一些约束条件的关键字:

      not null:不能为空;  unique:唯一;  primary key:主键;  foreign key references:外键;  check:查询约束;  default:默认约束;        //注:foreign key(外键字段) references(外键的表)

    1:查询列不重复的数据用 distinct

      查询老师的职位有哪些?

      SELECT DISTINCT Prof FROM teacher;          //结果:副教授 讲师 助教

    2:查询两个数之间的数据   between  and

       查询成绩在70-80之间的数据?

      SELECT Degree FROM score WHERE Degree BETWEEN 70 AND 80          //结果:78 76 76

    3:以排序的形式查询数据 order by desc/asc

      按降序排序显示所有人的成绩?

      SELECT * FROM score ORDER BY Degree DESC;      //desc:降序;asc:升序;都不写的话默认是升序

    4:查询一列的有多少条数据 count() [as]

      查询有多少个学生?

      SELECT COUNT(Sno) as 学生人数 FROM student;          //注:as后面是查询出来的数据显示的列名

    5:查询平均数 avg()与分组查询group by

      查询每门课的平均分与Cno

      SELECT AVG(Degree),Cno FROM score GROUP BY Cno

    6:模糊查询 like              //注:%代表一个或者多个字符,_代表一个字符

      查询名字里有小的教师的信息

      SELECT * FROM teacher WHERE Tname LIKE ‘%小%’;

    7:使用having对结果进行筛选

      查询每科成绩大于80分的人的ID?

      SELECT student.Sname FROM student,score WHERE student.Sno=score.Sno GROUP BY Cno HAVING score.degree>=80

    8:使用limit进行分页查询

      查询student表的第2条到第5条记录。

      SELECT * FROM student LIMIT 1,4

    9:使用in查询包含条件的信息                    //注:除了in,sql中还有any,all,some,其使用方法可见:https://www.cnblogs.com/HDK2016/p/8578587.html

      查询ID=S102和S103的学生信息

      SELECT * FROM student WHERE Sno IN (S102,S103)

    10:使用unionunion all使两个SELECT的结果子集合并        //注:union会排除掉重复的数据,并进行排序,union all则不会

      条件:要有相同的列,列的数据类型和顺序也要一样。

    11:子查询                               

      查询每科成绩大于每科平均成绩的信息

      SELECT * FROM student,score WHERE Degree>(SELECT AVG(Degree) FROM score GROUP BY Cno) GROUP BY Cno

    12:行列转换

      

      SELECT  name,SUM(CASE subject WHEN "语文" THEN grade END) AS "语文",

              SUM(CASE subject WHEN "数学" THEN grade END) AS "数学”,

              SUM(CASE subject WHEN "英语" THEN grade END) AS "英语"

      WHERE student GROUP BY name;

    在进行多表查询的时候可遵循以下一些规则进行查询:

    1、简单嵌套查询   

      子查询:子查询是一个SELECT查询,返回单个值且嵌套在SELECT、INSERT、UPDATE和DELETE语句或其它查询语句中,任何可以使用表达式的地方都可以使用子查询.   

      SELECT id,name,sex,date FROM table1 WHERE id in(SELECT id FROM table2 WHERE id="")

    内连接:把查询结果作为WHERE子句的查询条件即称为内连接

    2、复杂的嵌套查询

      多表之间的嵌套查询可以通过谓词IN实现,语法格式如下:

      test_expression[NOT]

      IN{

        subquery

      }

      参数说明:test_expression指SQL表达式,subquery包含某结果集的子查询

    多表嵌套查询的原理:无论是多少张表进行嵌套,表与表之间一定存在某种关联,通过WHERE子句建立此种关联实现查询

    3、使用子查询作派生的表

      在实际项目开发过程中经常用到从一个信息较为完善的表中派生出一个只含有几个关键字段的信息表,通过子查询就可以来实现这一目标,如

      SELECT people.name,people.chinese,people.math,people.english FROM (SELECT name,chinese,math,english FROM tb_demo071) AS people

      注:子查询应遵循以下规则:

        (1)由比较运算符引入的内层子查询只包含一个表达式或列名,在外层语句中的WHERE子句内命名的列必须与内层子查询命名的列兼容

        (2)由不可更改的比较运算符引入的子查询(比较运算符后面不跟关键字ANY或ALL)不包括GROUP BY 或 HAVING子句,除非预先确定了成组或单个的值

        (3)用EXISTS引入的SELECT列表一般都由*组成,不必指定列名

        (4)子查询不能在内部处理其结果

    4、多表联合查询

      利用SQL语句中的UNION,可以将不同表中符合条件的数据信息显示在同一列中。

      SELECT * FROM tb_demo074_student UNION SELECT * FROM tb_demo074_fasten

      注:使用UNION时应注意以下两点:

        (1)在使用UNION运算符组合的语句中,所有选择列表的表达式数目必须相同,如列名、算术表达式及聚合函数等

        (2)在每个查询表中,对应列的数据结构必须一样。

    5、简单内连接查询

      SELECT filedlist FROM table1 [INNER] JOIN table2 ON table1.column1 = table2.column1

      其中,filedlist是要显示的字段,INNER表示表之间的连接方式为内连接,table1.column1=table2.column1用于指明两表间的连接条件。

    6、利用HAVING语句过滤分组数据

      HAVING子句用于指定组或聚合的搜索条件,HAVING通常与GROUP BY 语句一起使用,如果SQL语句中不含GROUP BY子句,则HAVING的行为与WHERE子句一样。

      SELECT name,math FROM tb_demo083 GROUP BY id HAVING math > '95'

    7、由IN引入的关联子查询

      SELECT * FROM tb_demo083 WHERE code IN(SELECT code FROM tb_demo083 WHERE code = "")

  • 相关阅读:
    几个论坛上看到的2015小米笔试题
    Line(扩展欧几里得)
    MapReduce编程之倒排索引
    annotation(@Retention@Target)详解
    【JEECG技术文档】JEECG平台对外接口JWT应用文档V3.7.2
    jeecg 模糊查询
    jeecg下实现自动默认模糊查询
    The packaging for this project did not assign a file to the build artifact
    Maven添加本地Jar包
    maven 如何引入本地jar包
  • 原文地址:https://www.cnblogs.com/EmilZs/p/9272346.html
Copyright © 2011-2022 走看看