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

Stella981
• 阅读 551

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

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

课程表:Course

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

选课表SC

CREATE TABLE SC
 (Sno CHAR(9),
 Cno CHAR(4),
 Grade SMALLINT,
 PRIMARY KEY(Sno,Cno),
 FOREIGN KEY(Sno)REFERENCES Student(Sno),
 FOREIGN KEY(Cno)REFERENCES Course(Cno)
);

然后会建立三个表 :如下

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

接下来插入数据:

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

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

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

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

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

数据的查询:

查询条件

谓词

比较

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

确定范围

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

确定集合

IN, NOT IN

字符匹配

like,not like

空值

IS NULL,IS NOT NULL

多重条件(逻辑运算)

AND,OR,NOT

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

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

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

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

select *
from student
order 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分的学号和平均成绩:

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

连接查询:

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

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

嵌套查询:

列如:

select Sname
from Student
where Sno IN
    (select Sno
    from SC
    where Cno='2');

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

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

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

select Sno
from SC x
where Grade>=(select AVG(Grade)
               from SC y
               where y.Sno=x.Sno
                );

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

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

select Sname,Sage
from student
where Sage<any(select Sage
                        from Student
                        where Sdept='CS')
AND Sdept!='CS';

any

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

all

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

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

select Sname,Sage
from Student
where Sage<
            (select MAX(Sage)
            from Student
            where Sdeot='CS')
AND Sdept!='CS';

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

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

select Sname
from Student
where EXISTS
            (select *
            from SC
            where Sno=Student.Sno AND Cno='1');

集合运算:

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

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

select *
from Student
where Sdept='CS'
UNION
select *
from Student
where Sage<10;

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

select *
from Student
where Sdept='CS'
INTERSERT
select*
FROM Student
where Sage<=19;

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
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
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
Oracle一张表中实现对一个字段不同值和总值的统计(多个count)
需求:统计WAIT\_ORDER表中的工单总数、未处理工单总数、已完成工单总数、未完成工单总数。表结构:为了举例子方便,WAIT\_ORDER表只有两个字段,分别是ID、STATUS,其中STATUS为工单的状态。1表示未处理,2表示已完成,3表示未完成总数。 SQL:  1.SELECT   2
Easter79 Easter79
2年前
SQL数据库基本操作,mysql为测试环境。
SQL功能极强,由于其巧妙的设计,完成核心功能只需要9个动词。SQL功能动词数据查询select数据定义create(创建,)drop(删除),alter(改变)数据操纵insert(插入)update(更新)delete(删除)数据控制grant(授权)revoke(取消授权)关系数据库系统支持三级模式结构
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这