Structured Query language

SQL的特点

  1. 数据定义、操纵、 控制等功能一体化
  2. 两种使用方式, 统一的语法结构
  3. 高度非过程化
  4. 语言简洁,易学 易用 | 功能 | 动词 | | —- | —- | | 数据库查询 | SELECT | | 数据定义 | CREATE
    DROP
    ALTER | | 数据操纵 | INSERT
    UPDATE
    DELETE | | 数据控制 | GRANT
    REVOKE |

关于过程性与非过程性语言

  • 过程性语言——以关系代数为基础设计出 的数据库语言。即用户不但要说明需要什么 数据,而且还要说明获得这些数据的过程。
  • 非过程性语言——用户只要说明需要的数 据,而如何获得这些数据则不必由用户说明, 而由系统来实现。

SQL的定义功能

定义

数据类型

  • 定长和变长字符串CHAR(n) VARCHAR(n)
  • 定长和变长 位串 BIT(n) BITVARING(n)
  • 整型数 INT(32位字长) SMALLINT (16位字长)
  • 定点数 DECIMAL(p,d)
  • 浮点数 FLOAT DOUBLE
  • 日期型 DATE “MM-DD-YYYY ”
  • 时间型 TIME “HH:MM:SS”

    基本表的定义

  • CREATE TABLE <表名>

(<列名1> <类型1> [列级完整性约束条件]
[, <列名2> <类型2> [列级完整性约束条件] ]

[,<表级完整性约束条件>]);

  • 外部关键字
    • 如果外部关键字只有一个属性,可以在它 的属性名和类型后面直接用“REFERENCES” 说明它参照了某个表的某些属性,其格式为: REFERENCES <表名>(<属性>)
    • 在CREATE TABLE语句的属性列表后面增加 一个或几个外部关键字说明,其格式为: FOREIGN KEY (<属性>) REFERENCES <表名> (<属性>)

。。。

数据查询

基本格式

SELECT <属性列表>
FROM <基本表>(或视图)
[WHERE <条件表达式>];

单表查询

  • 选择表中的若干列(投影)
  • 选择表中的若干元组(选择)
  • 对查询分组
  • 使用集函数
  • 对查询结果排序

常用查询条件

条件 谓词
比较 =,>,<,>=,<=,<>
确定范围 BETWEEN AND,
NOT BETWEEN AND
确定集合 IN , NOT IN
字符匹配 LIKE,NOT LIKE
空值 IS NULL
IS NOT NULL
多重条件 AND,OR

  • 在学生表中找出全体学生的学号 和姓名。
    • SELECT Sno,Sname FROM Student;
  • 在学生表中找出全体学生的所有 信息。
    • SELECT * FROM Student;
  • 在学生表中找出全体学生的姓名 和出生年份。
    • SELECT Sname,2021-Sage FROM Student;
  • 查找有不及格门次的学生学号
    • SELECT DISTINCT Sno
    • FROM SC
    • WHERE Grade< 60
  • 查询年龄在20-22岁(包括20岁和22岁) 之间的学生的姓名、年龄和院系。
    • SELECT Sname,Sage,Sdept
    • FROM Student
    • WHERE Sage BETWEEN 20 AND 22;
  • 查询年龄不在20-22岁之间的学生的姓 名、年龄和院系。
    • SELECT Sname,Sage,Sdept
    • FROM Student
    • WHERE Sage NOT BETWEEN 20 AND 22
  • 在表学生中找出计算机学院或机电学 院的学生信息。
    • SELECT Sname,Sage,Sdept
    • FROM Student
    • WHERE Sdept IN (‘计算机’ , ‘机电’)
  • 查询所有姓李的学生的所有情况。
    • SELECT *
    • FROM Student
    • WHERE Sname like ‘李*’
  • 查询学生总人数。
    • SELECT COUNT(*)
    • FROM Student
  • 查询1号课程的平均成绩。
    • SELECT AVG(Grade)
    • FROM SC
    • WHERE Cno=’1’
  • 查询各门课程的选课人数。
    • SELECT Cno,COUNT(SNO)
    • FROM SC
    • GROUP BY Cno
  • 查询选修了2门以上课程的学生学号。
    • SELECT Sno
    • FROM SC
    • GROUP BY Sno
    • HAVING COUNT(Cno)>1
  • 查询选修了2号课程的学生学号和成绩, 查询结果按成绩从大到小排列。
    • SELECT sno,grade
    • FROM sc
    • WHERE cno=’2’
    • ORDER BY grade DESC
  • 求选修了2号学生选修的课程的学生学号
    • SELECT DISTINCT A.Sno
    • FROM SC A, SC B
    • WHERE A.Cno=B.Cno
    • And B.Sno=’2’
    • and A.Sno<>’2’
  • 求所有学生的选课的课程号和相应成绩

    • SELECT Student.Sno, Sname, Cno, Grade
    • FROM Student LEFT JOIN SC ON
    • Student.Sno = SC.Sno;、

      嵌套查询

      嵌套查询:一个查询块(SELECT—FROM— WHERE)嵌套在另一个查询块的条件中。、
  • 带有IN谓词的子查询

  • 带有比较运算符的子查询
  • 带有ANY或ALL谓词的子查询(使用ANY和 ALL时必须同时使用比较运算符)
  • 带有EXISTS谓词的子查询(查询结果不返回 任何数据,只产生逻辑“真”或“假”)

  • 查询与刘晨在同一个学院学习的学生 ```sql SELECT Student.Sno, Sname FROM Student WHERE Sdept IN(
    1. SELECT Sdept
    2. FROM Student
    3. WHERE Sname=‘刘晨’
    );
  1. - 查询选修了数据库课程的学生学号和姓名
  2. ```sql
  3. SELECT Sno, Sname
  4. FROM Student
  5. WHERE Sno IN(
  6. SELECT Sno
  7. FROM SC
  8. WHERE Cno IN (
  9. SELECT Cno
  10. FROM Course
  11. WHERE Cname=‘数据库’)
  12. );
  • 查询同时选修了1号和2号课程的学生学号 ```sql select Sno from SC where Cno=’1’ and Sno in(
    1. select Sno
    2. from SC
    3. where Cno='2'
    )
  1. - 查询选修了1号课程而没有选修2号课程的学生 学号、
  2. ```sql
  3. select Sno
  4. from SC
  5. where Cno='1'
  6. and Sno NOT IN (
  7. select Sno
  8. from SC
  9. where Cno='2'
  10. )
  • 找出每个学生超过他选修课程平均成绩的课程号

    1. SELECT Sno,Cno
    2. FROM SC x
    3. WHERE Grade >=(
    4. SELECT AVG(Grade)
    5. FROM SC y
    6. WHERE y.Sno=x.Sno
    7. )
  • 查询比计算机学院的学生年龄都小的 学生姓名和年龄 ```sql SELECT Sname, Sage FROM Student WHERE Sage < ALL(

    1. SELECT Sage
    2. FROM Student
    3. WHERE Sdept=‘计算机’

    )

  1. - 查询比计算机学院的学生年龄都小的 学生姓名和年龄
  2. ```sql
  3. SELECT Sname, Sage
  4. FROM Student
  5. WHERE Sage< (
  6. SELECT MIN(Sage)
  7. FROM Student
  8. WHERE Sdept='计算机'
  9. )
  • 查询选修了数据库原理课程的学生学号和姓名 ```sql SELECT Sno, Sname FROM Student WHERE Sno IN(
    1. SELECT Sno
    2. FROM SC
    3. WHERE Cno IN (
    4. SELECT Cno
    5. FROM Course
    6. WHERE Cname=‘数据库’)
    );

SELECT Sname,Student.Sno FROM Student,SC WHERE Student.Sno=SC.Sno AND Exists (SELECT * FROM Course WHERE Cno = SC.Cno AND Cname=’数据库’);

  1. - 查询没有选修2号课程的学生姓名和学号
  2. ```sql
  3. SELECT Sname,Sno
  4. FROM Student
  5. WHERE NOT EXISTS (
  6. SELECT *
  7. FROM SC
  8. WHERE Sno=Student.Sno
  9. AND Cno=‘2’);
  • 查询至少选修了1号学生所选全部课程的学生编号
  • image.png

image.png
image.png
image.png

image.png

image.png

image.png

image.png