[关闭]
@linux1s1s 2018-02-08T06:28:13.000000Z 字数 2029 阅读 557

SQL 基础

Big-Data-Base 2018-02


数据准备

  1. # 创建数据库STUDENT
  2. CREATE DATABASE STUDENT;
  3. # 创建表STUDENT
  4. CREATE TABLE STUDENT
  5. (SNO VARCHAR(3) NOT NULL,
  6. SNAME VARCHAR(4) NOT NULL,
  7. SSEX VARCHAR(2) NOT NULL,
  8. SBIRTHDAY DATETIME,
  9. CLASS VARCHAR(5));
  10. # 创建表COURSE
  11. CREATE TABLE COURSE
  12. (CNO VARCHAR(5) NOT NULL,
  13. CNAME VARCHAR(10) NOT NULL,
  14. TNO VARCHAR(10) NOT NULL);
  15. # 创建表SCORE
  16. CREATE TABLE SCORE
  17. (SNO VARCHAR(3) NOT NULL,
  18. CNO VARCHAR(5) NOT NULL,
  19. DEGREE NUMERIC(10, 1) NOT NULL);
  1. # 向各表导入数据
  2. INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES
  3. (108 ,'曾华' ,'男' ,'1977-09-01',95033),
  4. (105 ,'匡明' ,'男' ,'1975-10-02',95031),
  5. (107 ,'王丽' ,'女' ,'1976-01-23',95033),
  6. (101 ,'李军' ,'男' ,'1976-02-20',95033),
  7. (109 ,'王芳' ,'女' ,'1975-02-10',95031),
  8. (103 ,'陆君' ,'男' ,'1974-06-03',95031);
  9. (102 ,'汪洋' ,'男' ,'1975-06-03',95032);
  10. INSERT INTO COURSE(CNO,CNAME,TNO) VALUES
  11. ('3-105' ,'计算机导论',825),
  12. ('3-245' ,'操作系统' ,804),
  13. ('6-166' ,'数据电路' ,856),
  14. ('9-888' ,'高等数学' ,100);
  15. INSERT INTO SCORE(SNO,CNO,DEGREE) VALUES
  16. (103,'3-245',86),
  17. (105,'3-245',75),
  18. (109,'3-245',68),
  19. (103,'3-105',92),
  20. (105,'3-105',88),
  21. (109,'3-105',76),
  22. (101,'3-105',64),

数据展现

经过以上简单的数据准备(以上数据会有部分修改,所以和下面展现的表格不一样,但是字段一致),分别有三个表格,score,student,course,现将数据表展现如下:

此处输入图片的描述

数据操作

如何解决上面的问题,一个思路应该是将三张表联系起来,很明显应该将上面的三个表格关联起来,我们看一下不同关联下的数据如何.

上面不同的关联方式,可以参看下面列举的参考文章, 上面提及的问题,用join或innerjoin on xxx 比较合适,然后再加上相应的条件即可.

  1. select score.* from score join(student, course) on score.sno=student.sno and score.cno=course.cno where student.ssex='男' and course.cname='计算机导论';

如果觉得上面太长,可以将表名称用简写作为别名,比如

  1. select A.* from score A join(student B, course C) on A.sno=B.sno and A.cno=C.cno where B.ssex='男' and C.cname='计算机导论';

结果:
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 105 | 3-245 | 75.0 |
+-----+-------+--------+
1 row in set (0.00 sec)

  1. select A.* from score A inner join (select cno, AVG(degree) C from score group by cno) B on A.cno=B.cno where degree<C

上面
- A 是score表的别名,
- C 是 degree的别名,作为表B的列名称
- B 是 以cno 和 C 为列名的表, A表和B表以cno列名为关联

结果:
+-----+-------+--------+
| sno | cno | degree |
+-----+-------+--------+
| 105 | 3-245 | 75.0 |
| 106 | 3-105 | 86.0 |
| 109 | 3-166 | 69.0 |
+-----+-------+--------+
3 rows in set (0.01 sec)

附注: 参考

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注