zoukankan      html  css  js  c++  java
  • SQL语言概述

    功能概述

    • DDL,数据库定义语言,创建,修改,删除数据库,表,视图,索引,约束条件等
    • DML,数据库操纵语言,对数据库中的数据进行增,删,改,查
    • DCL,数据库定义语言,对数据库总数据的访问设置权限

    SQL语言是集DDL,DML,DCL为一体的数据库语言,学好数据库首先要掌握下面9个引导词

    • DDL语言引导词:CREATE(创建),ALTER(修改),DROP(撤销)
    • DML语言引导词:INSERT(增),DELETE(删),UPDATE(改),SELECT(查)
    • DCL语言引导词:GRANT(授权),REVOKE(调用)

    创建表

    image

    下面来创建多个表

    学生表:学号(sn),姓名(sname),性别(sex),年龄(sage), 所属系(dn),班级(sclass)

    create table student( sn char(8), sname char(10), ssex char(2), sage integer, dn char(2), sclass char(6)) engine=MYISAM character set utf8;

    INSERT INTO student (sn,  sname,  ssex,  sage,  dn,  sclass) VALUES ('98030101',    '张三',    '男',    '20',    '03',    '980301'  ) ;

    院系表:系别(dn),系名(dname),系主任(dean)

    create table dept(dn char(2), dname char(10), dean char(10)) engine=MYISAM character set utf8;

    INSERT INTO dept(dn, dname, dean) VALUES("01", "机电", "李三");

    课程表:课程号(cn),课程名(cname),教师编号(tn),学时(chours),学分(credit)

    create table course(cn char(3), cname char(12), tn char(3), chours integer, credit float(1)) engine=MYISAM character set utf8;

    INSERT INTO course(cn, cname, tn, chours, credit) VALUES("001", "数据库", "001", 40, 6);

    教师表:教师编号(tn),教师名(tname),所属院系(dn),工资(salary)

    create table teacher(tn char(3), tname char(10), dn char(2), salary float(2)) engine=MYISAM character set utf8;

    INSERT INTO teacher(tn, tname, dn, salary) VALUES ("001", "赵三", "01", 1200.00);

    选课表:学号(sn),课程号(cn),成绩(score)

    create table sc(sn char(8), cn char(3), score float(1)) engine=MYISAM character set utf8;

    INSERT INTO sc(sn, cn, score) VALUES ("980230101", "001", 92);

    下面是创建后完整的表

    student

    image

    dept

    image

    teacher

    image

    course

    image

    sc

    image

    简单查询操作

    • 检索学生表中所有年龄小于等于19岁的学生姓名和年龄

    SELECT sname, sage FROM student WHERE sage<=19;

    image

    • 检索教师表中所有工资 少于1500元或者工资大于2000元,并且是03系的教师姓名(注意括号)

    SELECT tname
    FROM teacher
    WHERE (salary<1500 OR salary>2000) AND dn="03";

    image

    • 求既学过001课程又学过002课程的同学学号(错误版)

    SELECT sn
    FROM sc
    WHERE cn="001" AND cn="002";

    上面的语句是错误的,因为WHERE条件是对每条记录进行检查,在一条记录中cn不可能同时为001又为002

    • 在选课表中查询成绩大于80分的学号(结果重复版)

    SELECT sn
    FROM sc
    WHERE score>80;

    image

    • 在选课表中查询成绩大于80分的学号(结果未重复)

    SELECT DISTINCT sn
    FROM sc
    WHERE score>80;

    image

    • 按学号由小到大的顺序显示出所有学生的学号和姓名

    SELECT sn,sname
    FROM student
    ORDER BY sn ASC;

    ORDER是对查询后的结果进行排序

    image

    • 检索002号课大于80分的所有同学学号并按成绩由高到低顺序显示

    SELECT sn
    FROM sc
    WHERE score>80 AND cn="002"
    ORDER BY score DESC;

    image

    模糊查询

    模糊查询是当我们不能精确查询条件时,可以使用的。比如我们想找一个人,但只知道这个人姓张,这时候我们可以通过模糊查询来找出姓张的,然后做具体分析。

    • 检索所有姓张的同学

    SELECT sname
    FROM student
    WHERE sname LIKE "张%";

    %号表示匹配零个或多个字符

    image

    • 检索名为张某某的同学姓名

    SELECT sname
    FROM student
    WHERE sname LIKE "张__";

    注意张后面是两个下划线,一个下划线代表一个字符。

    • 检索不姓张的同学姓名

    SELECT sname
    FROM student
    WHERE sname NOT LIKE "张%";

    image

    多表联合查询

    多表联合查询涉及到表的连接操作,通过通过将多个表连成一张大表,然后做查询操作。前面我们在关系代数中提到表的连接可以通过笛卡尔积+选择来实现,而SQL中也是这样处理的。

    • 按001号课成绩由高到低顺序显示所有学生的姓名

    SELECT DISTINCT sname
    FROM student,sc
    WHERE student.sn=sc.sn AND sc.cn="001"
    ORDER BY score DESC;

    先将student和sc表进行笛卡尔积运算形成一张大表,然后执行WHERE条件判断进行选择,接着执行排序操作,最后将需要的属性值投影出来。

    image

    • 按数据库课成绩从高到底显示同学姓名

    SELECT DISTINCT sname
    FROM student,sc,course
    WHERE student.sn=sc.sn AND sc.cn=course.cn AND course.cname="数据库"
    ORDER BY score DESC;

    image

    重名操作

    当表自连接时需要对表进行重名操作,不仅对表起别名而且需要对投影的列也要进行别名处理。

    image

    as是可以省略的

    • 查询薪水有差额的老师姓名

    SELECT T1.tname AS teacher1,T2.tname AS teacher2
    FROM teacher AS T1,teacher AS T2
    WHERE T1.salary > T2.salary;

    注意:查询后列名发生了变化

    image

    • 查询既学过001课程又学过002课程的学生学号

    SELECT sc1.sn
    FROM sc AS sc1, sc AS sc2
    WHERE sc1.cn="001" AND sc2.cn="002" AND sc1.sn=sc2.sn;

    image

    我们可以看到上面的操作中未对属性名进行别名处理,是因为查询的结果集中属性名不冲突。

    插入操作

    简单的插入操作我们在创建表的时候已经介绍过了,下面介绍一下更为复杂操作。

    下图中是将从student表中找到的数据直接插入到st(sn,sname)当中去。由此可看出,insert语句后面是可以跟子查询的。

    image

    删除操作

    • 删除98030101号同学所选的课程

    DELETE FROM sc WHERE sn="98030101";

    更新操作

    语法格式

    image

    • 将所有教师工资上调5%

    UPDATE teacher SET salary=salary*1.05;

    修改表的定义

    image

  • 相关阅读:
    EXT今日笔记自定义vtype
    游标的原理
    调用Excle组件导出,解决权限问题
    解决EntityFramework数据库无法自动迁移解决方法
    初涉AJAX
    20151015_系统分析阶段分析类的三种类型
    20151007_手动刷新Android系统SD卡
    20151014_基于距离的分类算法之KNN
    20151008_Android Application类
    20150919_获取Android唯一标识码
  • 原文地址:https://www.cnblogs.com/xidongyu/p/5988549.html
Copyright © 2011-2022 走看看