SQL数据库基本操作,mysql为测试环境。

SQL功能极强,由于其巧妙的设计,完成核心功能只需要9个动词。

SQL功能

动词

数据查询

select

数据定义

create(创建,)drop(删除),alter(改变)

数据操纵

insert(插入 )update(更新) delete(删除)

数据控制

grant(授权)revoke(取消授权)

关系数据库系统支持三级模式结构,其模式、外模式和内模式中的基本对象有模式,表,视图和索引等,因此SQL的数据定义功能包括模式定义、表定义、视图和索引定义.SQL数据定义语句如下表:

操作对象/操作方式

创建

删除

修改

模式

create schema

drop schema

create table

drop table

alter table

视图

create view

drop view

索引

create index

drop index

alter index

我们定义三个表 学生表:Student(Sno,Sname,Ssex,Sage,Sdept) 课程表:Course(Cno,Cname,Cpno,Ccredit)

学生选课表:SC(Sno,Cno,Grade)

学生表:Student

1CREATE TABLE Student 2  (Sno CHAR(9) PRIMARY KEY,/*列级完整性约束条件,Sno是主码*/ 3  Sname CHAR(20)UNIQUE,    /*Sname 取唯一的值*/ 4  Ssex CHAR(20), 5 Sage SMALLINT, 6 Sdept CHAR(20) 7 );

课程表:Course

1CREATE TABLE Course 2 (Cno CHAR(4) PRIMARY KEY, 3 Cname CHAR(40) NOT NULL, 4 Cpno CHAR(4), 5 Ccredit SMALLINT, 6 FOREIGN KEY(Cpno) REFERENCES Course(Cno) 7 /*表级完整性约束条件,Cpno是外码,被参照表是Course,被参照表是Cno*/ 8);

选课表SC

1CREATE TABLE SC 2 (Sno CHAR(9), 3 Cno CHAR(4), 4 Grade SMALLINT, 5 PRIMARY KEY(Sno,Cno), 6 FOREIGN KEY(Sno)REFERENCES Student(Sno), 7 FOREIGN KEY(Cno)REFERENCES Course(Cno) 8);

然后会建立三个表 :如下

接下来插入数据:

1 insert 2into Student(Sno,Sname,Ssex,Sage,Sdept) 3values('201215121','李勇','男',20,'CS');

按上述方式插入所有的数据:如下:

数据的查询:

查询条件

谓词

比较

=,>,<,<=,!=,!>,<>,NOT+上述比较运算符

确定范围

beetween and ,not between (上限)and(下线)

确定集合

IN, NOT IN

字符匹配

like,not like

空值

IS NULL,IS NOT NULL

多重条件(逻辑运算)

AND,OR,NOT

列如:查询既不是计算机,数学系,也不是信息系的学生的姓名和性别。

1select Sname,Ssex 2from Student 3where Sdept NOT IN('CS','MA','IS');

order by子句对查询结果按照一个或者多个属性列升序(ASC)降序(DESC)排列,默认为升序。

查询全体学生,查询结果在同一系号升序,同一系按年龄降序。

1select * 2from student 3order by Sdept,Sage DESC;

聚集函数

COUNT(*)

统计元组个数

COUNT([DISTINCT|ALL]<列明>)

统计一列中值的个数

SUM([DISTINCT|ALL]<列明>)

计算一列中的和(必须为数值型)

AVG([DISTINCT|ALL]<列明>)

计算平均值(数值型)

MAX([DISTINCT|ALL]<列明>)

最大

MIN([DISTINCT|ALL]<列明>)

最小

GROUP BY(group by)将查询结果分组。分组后的聚集函数(只能用于select子句或者group by中的having)作用于每个组,每组由一个函数值。

查询成绩大于90分的学号和平均成绩:

1select Sno,AVG(Grade) 2from SC 3group by Sno 4having AVG(Grade)>=90;

连接查询:

查询每门课的间接先修课。要对Course表取两个别名。

1select FIRST.Cno,SECOND.Cpno 2from Course FIRST,Course SECOND 3where First.Cpno=SECOND.Cno;

嵌套查询:

列如:

1select Sname 2from Student 3where Sno IN 4    (select Sno 5    from SC 6    where Cno='2');

子查询select中不能使用order by子句,order by只对最终结果排序。

如果子查询的查询条件依赖于父查询,这类查询称为相关子查询。

找出每个学生中比他选修课平均成绩高的课程号:

1select Sno 2from SC x 3where Grade>=(select AVG(Grade) 4               from SC y 5               where y.Sno=x.Sno 6                );

从外层查询中取出一个元组x,将元组x的Sno值传送给内层查询,执行内层查询得到成绩的平均值,用该值代替内层查询得到外层查询。

列题:查询非计算机科学系中比计算机科学系中任意一个学生小的学生姓名和Sage。

1select Sname,Sage 2from student 3where Sage<any(select Sage 4                        from Student 5                        where Sdept='CS') 6AND Sdept!='CS';

any

大于查询结果中的某个值  >= <= != 等都可以。

all

大于查询结果中的所有值  >= <= != 等都可以。

本查询也可以用聚焦函数实现。首先用子查询查出CS中最大年龄(20),然后在父类查询中查询非CS系小于20的学生。

1select Sname,Sage 2from Student 3where Sage< 4            (select MAX(Sage) 5            from Student 6            where Sdeot='CS') 7AND Sdept!='CS';

带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值true或者假false。

列如:选修了一号课程的学生姓名。

1select Sname 2from Student 3where EXISTS 4            (select * 5            from SC 6            where Sno=Student.Sno AND Cno='1');

集合运算:

并操作UNION 交操作INTERSECT 差操作EXCEPT

列如查询计算机科学系的学生及年龄不大于19岁的学生。

1select * 2from Student 3where Sdept='CS' 4UNION 5select * 6from Student 7where Sage<10;

查询计算机科学系的学生与年龄不大于19岁学生的交集。(也就是查询计算机科学系中年龄不大于19岁的学生。)

1select * 2from Student 3where Sdept='CS' 4INTERSERT 5select* 6FROM Student 7where Sage<=19;

 参考书籍:数据库系统概论

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

sql注入

反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )