文档章节

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

奔跑的码农
 奔跑的码农
发布于 2016/04/16 22:31
字数 1298
阅读 94
收藏 6

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)
);

然后会建立三个表 :如下

接下来插入数据:

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

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

数据的查询:

查询条件 谓词
比较 =,>,<,<=,!=,!>,<>,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;

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

© 著作权归作者所有

奔跑的码农

奔跑的码农

粉丝 16
博文 33
码字总数 40544
作品 0
海淀
程序员
私信 提问
【Sphinx】MySQL+Sphinx 全文检索的使用和测试

导读:最近在线上由于某些不可名状的原因需要在数据库中过滤一些词语,所以线上比较多的语句都是 select c1,c2 fron tb1 where c1 like '%name%'类似与这个样子的模糊查询。开始想到了全文索引...

liuhuang9496
2017/12/19
0
0
北京[招聘] 互动百科聘Mysql DBA 8k~20k+五险一金+餐补+活动经费+培训+期权

职位名称:MySQL DBA 公司名称:互动百科(www.hudong.com、www.baike.com) 招聘人数:2名 工作地点:北京朝阳区安定门外安苑里1号奇迹财富广场互动百科大厦 岗位职责: 1、建立和完善MySQL数...

Cral
2012/04/10
1K
0
MySQL之delete 忘加where条件误删除恢复方法二

和昨天介绍的MySQL之delete 忘加where条件误删除恢复的mysql的环境条件是一样的: mysql数据库指定字符集位utf8,同时表的字符集也得为utf8,同时mysql要开启row模式的bin-log日志 创建一张测试...

wjw555
2018/07/04
0
0
通过SQL Server 2008 访问MySQL

在公司中经常会遇到部署多种数据库环境的情况,对于开发人员来说经常在不同数据库之间转换确实有些繁琐,本篇将介绍从SQL Server 操作MySQL 数据库的方法。 数据库测试环境 1. SQL Server 20...

junwong
2012/03/09
233
0
史上最简单的 MySQL 教程(三十七)「数据备份与还原(下)」

数据备份与还原 基础概念: 备份,将当前已有的数据或记录另存一份; 还原,将数据恢复到备份时的状态。 为什么要进行数据的备份与还原? 防止数据丢失; 保护数据记录。 数据备份与还原的方...

qq_35246620
2017/10/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数组算法

/*数组的相关的算法操作:1、在数组中找最大值/最小值*/class Test11_FindMax{public static void main(String[] args){int[] array = {4,2,6,8,1};//在数组中找最大...

architect刘源源
29分钟前
1
0
okhttp3 以上版本在安卓9.0无法请求数据的解决方案

应用官方的说明:在 Android 6.0 中,我们取消了对 Apache HTTP 客户端的支持。 从 Android 9 开始,默认情况下该内容库已从 bootclasspath 中移除且不可用于应用。且Android P 限制了明文流量...

chenhongjiang
今天
11
0
简单示例:NodeJs连接mysql数据库

开篇引用网上的说法: 简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。Node.js是一个事件驱动I/O服务端JavaScript环境,基于...

李朝强
今天
8
0
大数据学习路线

年薪30W大数据学习路线图: 一、Hadoop入门,了解什么是Hadoop 1、Hadoop产生背景 2、Hadoop在大数据、云计算中的位置和关系 3、国内外Hadoop应用案例介绍 4、国内Hadoop的就业情况分析及课程...

陈小君
今天
3
0
解读 Kylin 3.0.0 | 更敏捷、更高效的 OLAP 引擎

在近期的 Apache Kylin Meetup 成都站上,我们邀请到 Kyligence 架构师 & Apache Kylin Committer 倪春恩对 Kylin 3.0.0 版本的一些重要功能及改进从使用到原理进行了介绍: Apache Kylin 在...

ApacheKylin
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部