一、数据库的发展史
(1)手工管理:藏书阁,图书馆。
优点:分类管理,直观性强
缺点:信息流动慢,不方便
(2)文件管理:计算机文件系统,图书管理系统
优点:分类管理,层次分明
缺点: 查找不方便
(3)数据库管理:
优点:存取数据非常方便.
缺点:有数据的安全隐患。
二、数据库包含两部分概念
数据库(DataBase),简称DB,按照某一特定数据结构来组织,存储
数据的仓库。
数据库管理系统(DataBase Management System),简称DBMS.
是为了建立,操作和维护数据库
而设计的一个程序。介于用户和数据库之间。
PS: 使用SQL语言,通过DBMS来管理DB。
三、关系型数据库
(1)所谓的关系,指的就是表,或者表与表之间。关系模型,就是表的
行与列。比如 教师(教师编号,姓名,年龄,性别,科目)。
(2)常用的关系型数据库:
大型:Oracle--甲骨文(Oracle)公司的产品
SqlServer--Microsoft旗下的产品
DB2--IBM旗下的产品
小型:Access--MicroSoft旗下的产品
Mysql--目前是甲骨文旗下的产品
四、Mysql
1)Mysql是一个关系型数据库,最开始是瑞典的MysqlAB公司的产品,后
来被Sun公司收购,在2009年4月20号Sun公司被Oracle收购.
2)Mysql特点
--mysql是开源的,不会产生额外的费用。
--mysql支持大型数据库,比如可以管理上千万条记录的数据库。
--mysql支持多操作系统,支持多语言连接:C,C++,java,PHP....
--mysql成本比较小,相比较Oracle和DB2。
3)Mysql的安装(略)
服务端的安装:DB和DBMS的安装
客户端的安装:自带的客户端
第三方客户端
4)Mysql的连接和使用
连接方式:
(1)使用命令提示符界面(保证环境变量配置成功)
第一步:输入命令+参数,发送请求连接
mysql -u username -p 回车
enter password: ......
第二步:创建数据库
create database bd1802 default character set utf8;
第三步:选择数据库
use bd1802
(2)使用客户端连接:(选择sqldeveloper).
第一步:配置第三方jdbc驱动程序
工具->首选项->数据库->第三方驱动程序->
添加条目->选中你的jar包->确定
第二步:新建连接
连接名:随便起,就是一个连接昵称而已
用户名:使用什么用户进行连接
密码:.....
主机名: 数据库所在的主机IP
端口号:3306
选择数据库:如 bd1802
五、表(Table)
表是关系型数据库的基本存储结构。
1)表是二维数据结构,有行和列
2)行(Row)是横排数据,也叫记录(Recond)
3)列(Column)是竖排数据,也叫字段(Field)
4)行与列的交叉点是 字段值
5)表与表之间也存在关系
六、数据库支持的数据类型
MySQL支持多种类型,大致可以分为三类:
数值、日期/时间和字符串(字符)类型。
数值类型:
类型 大小 范围(有符号) 用途
TINYINT 1 字节 (-128,127) 小整数值
SMALLINT 2 字节 (-32 768,32 767) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) 极大整数值
FLOAT 4 字节 单精度
浮点数值
DOUBLE 8 字节 双精度
浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值
日期和时间类型:
类型 大小(字节) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 8 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS 混合日期和时间值,时间戳
字符串类型:
类型 大小 用途
CHAR 0-255字节 定长字符串 char(10)
VARCHAR 0-65535 字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LOGNGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据
七、结构化查询语言(SQL)
结构化查询语言(Structured Query Language),简称SQL,是数据库
的标准查询语言。可以通过DBMS对数据库进行定义数据,操纵数据
查询数据,数据控制等
SQL可以分为:
1)数据定义语言(DDL):Data dafinitaon Language
如创建表create
删除表drop
修改表alter
清空表truncate,彻底清空,无法找回。
2)数据操纵语言(DML):Data Manipulate Language
如插入数据insert
删除数据delete
修改数据update
3)事务控制语言(TCL):Transation Control Language
4)数据查询语言(DQL):Data Query Language
select:
select * from tableName;
5)数据控制语言(DCL):Data Control Language
小知识:
修改命令提示符界面显示编码集:set names GBK;
添加表字段语句格式:alter table tableName add (colName Type).
删除表字段语句:alter table tableName drop colName
修改表字段类型:alter table tableName modify colName newType
修改表字段名称:alter table tableName change oldColName newColName newType
修改表名:alter table oldName rename newName
清空表结构:truncate table tableName
创建数据库:create database dataName default character set characterName
删除数据库:drop database databaseName
数据操纵语言DML
插入数据:
insert into tableName values (val1,val2..);
insert into tableName(colName1,colName2,colName3) values(val1,val2,val3);
结构化查询语言(SQL)
是数据库管理系统用于管理数据库的标准查询语言。
用于对数据库进行定义数据,操纵数据,事物管理等
细分五种语言:
DDL:数据定义语言,里面有
create:创建表结构
drop: 删除表
alter: 修改表结构
truncate: 清空表结构,即清空表数据,不能回滚。
DML:数据操纵语言,里面有
insert:向表中插入数据
delete:删除表中的数据
update:修改表中的数据
where 条件: 对表中的数据加条件进行限制,
起到过滤的作用。
格式: where colName 关系运算符 value
[or|and 条件2]
关系运算符:
>,>=,<,<=,
等于:=,
不等于:!= 或 <>
null值操作:
1:在条件中,不能使用=或者!= 或者<>,而是使用
is或者is not
2:在select子句中,使用关系运算符
DQL:数据查询语言。
--select:选择
一、基本查询语句:至少要有两个子句。
1、
select子句和from子句。
格式1:可以指定字段进行查询
select colName[,colName.....] from tableName
格式2:查询整张表:
select * from tableName;
通配符*:如果是在select字句中,代替的是所有的字段。
2、给查询显示的列,起别名。
格式:
select ename [as] "员工姓名"[,colName as nickName....] from tableName tableNickName
3、where子句:
作用:起到条件限制约束等操作。有过滤的作用。
位置:放在 from子句后。
格式:
select colName from tableName where 条件。
条件:关系运算符:
>,>=,<,<=,=,!=,<>。
(1)null在条件中,应该使用is 或者is not
(2)范围查询:针对于某一个字段来说。
1:可以使用>,>=和<,<=来进行范围限制
2: 还可以使用between and来限制。
格式:
colName [not] between val1 and val2;
注意: between val1 and val2 相当于
闭区间[val1,val2]
(3)集合作为条件写法:同一个字段有多个值的情况下使用。
使用:in|not in
格式: colName [not] in (元素1,元素2,....);
注意:in 相当于 or
not in 相当于 and
集合的其他用法:
注意:mysql数据库中,集合元素的来源
只能基于一张表的查询。不能写定值。
all与any
格式:
>all(元素1,元素2,元素3......)
:大于集合中最大的元素。
<all(元素1,元素2,元素3......)
:小于集合中最小的元素。
>any(元素1,元素2,元素3......)
:大于集合中最小的元素。
<any(元素1,元素2,元素3......)
:小于集合中最大的元素。
(4)模糊查询:like关键字
格式: colName like value。
通常与通配符%连用
%:0或0个以上的字符
_:匹配一个字符。
reg: 查询员工姓名第二字母是s的信息
ename like '_s%'
结构化查询语言:简称SQL.
包含了五种:
DDL:数据定义语言。当创建表结构,修改表结构
删除表,清空表。
DML:数据操纵语言。当对表中的数据进行增删改。
DQL:数据查询语言:对表进行查询(搜索)时使用。
基本查询语句:至少包含两个子句。
select子句和from子句。
还可以添加where子句:条件限制,过滤的作用。
条件:可以使用关系运算符,
多条件时,有同一字段时,还可以使用
集合(in|not in)
范围条件: between.. and..
模糊查询: like
============================================
1、排序:
当在查询表中数据时,记录比较多,有可能需要
进行排序,此时我们可以使用order by子句。
位置语法:
select..from tableName [where 子句][order by 子句]
注意: 可以通过一个或多个字段排序。
格式:
order by colName [ASC|DESC][,colName1....[ASC|DESC]];
排序规则:
ASC:升序
DESC:降序
默认是升序排序。
2、去重:有的时候我们可以需要对重复的记录进行去重操作
比如,查询表中有哪些职位,此时,一种职位只需要
显示一条记录就够。
关键字:distinct
位置: 必须写在select关键字后。
3、分组查询与分组函数(聚合函数)
有的时候,我们可能需要查询表中的记录总数,或者
查询表中每个部门的总工资,平均工资,总人数。
这种情况需要对表中的数据进行分组统计。
需要group by子句。
位置:
select..from tName [where 条件] [group by子句] [order by子句]
用法:
group by Field1[,Field2]。
注意:在分组查询时,select子句中的字段,除了聚合
函数外,只能写分组字段。
聚合函数:
count(Filed):统计指定字段的记录数。
sum(Filed):统计指定字段的和。
avg(Filed):统计指定字段的平均值
max(Filed):返回指定字段中的最大值。
min(Filed):返回指定字段中的最小值。
PS:聚合函数会忽略null值。
因此有时候需要使用函数:ifnull()
函数ifnull(field,value)
逻辑:如果field字段对应的值不是null,就使用
field的值,如果是null,就使用value.
多字段分组时:
field1, field2
10 500
20 600
30 700
注意:多字段分组时,最多分组的数目为Filed1*Field2[*Filed3....]
4、having子句:
在分组查询时,有的时候可能需要再次
使用条件进行过滤,这个时候不能where子句,
应该使用having子句。
having子句后可以使用聚合函数。
位置:位于group by子句后
==========================================
5、子句总结:
一个基本的查询语句包含的子句有:
select子句
from子句
where子句
group by子句
having子句
order by子句
一个完整的查询语句:
select..from..[where..][group by..][having..][order by..]
执行顺序:
先执行from子句。
再执行where子句
然后group by子句
再次having子句
之后select子句
最后order by子句
==============================
6、SQL语言之TCL:事务控制语言.
有时我们可能需要使用DML进行批量数据的删除,修改,
增加。比如,在一个员工系统中,我们想删除一个人的信息。
除了删除这个人的基本信息外,还应该删除与此人有关的
其他信息,如邮箱,地址等等。那么从开始执行到结束
就会构成一个事务。
对于事务,我们要保证事务的完整性。要么成功。
要么撤回。
一般情况下事务要符合四个条件(ACID):
原子性(Atomicity):
事务要么成功,要么撤回。不可切割性。
一致性(Consistency):
事务开始前和结束后,要保证数据的一致性。
转账前账号A和账号B的钱的总数为10000;
转账后账号A和账号B的前的总数应该还是10000;
隔离性(Isolation):
当涉及到多用户操作同一张表时,数据库为会
每一个用户开启一个事务。那么当其中一个事务正在
进行时,其他事务应该处于等待状态。保证事务之间
不会受影响。
持久性(Durability):
当一个事务被提交后,我们要保证数据库里的
数据是永久改变的。即使数据库崩溃了,我们也要
保证事务的完整性。
commit:提交
rollback:撤回,回滚。
savepoint:保存点
事务:只有DML操作会触发一个事务。
存储引擎(ENGINE):就是指表类型.
当存储引擎为innodb时,才支持事务。
有一个默认的存储引擎为Myisam。不支持事务。
事务的验证:
第一步:start transaction
第二步:savepoint 保存点名称。
第三步:DML
第四步:commit/rollback;
=================================
SQL之DCL:数据控制语言
作用是用来创建用户,给用户授权,撤销权限,删除用户。
create user
grant
revoke
drop user
格式:
1:创建用户
create user username@ip identified by newPwd;
2: 显示用户的权限
show grants for username@ip;
3:授权
grant 权限1,权限2... on 数据库名.* to username@ip;
DML权限:insert,delete,update
DQL权限:select
DDL权限:create,alter,drop...
4:撤销权限:
revoke 权限1,权限2..on 数据库名.* from username@ip;
5: 删除用户
drop user username;
使权限立即生效:
flush privileges;
======================================
关联查询:
有的时候,我们查询的数据不在一张表中,可能
会涉及两张表,或多张表,此时我们使用关联查询。
格式:
select * from tname1,tname2;
笛卡尔积:在做多张表查询时,出现的记录数目为
这些表的记录数的乘积。
通常,笛卡尔积没有价值(数据冗余)。不需要。
t1 有10条记录
t2 有20条记录
查询的数目为:10*20;
等值查询:两张表的字段有关系的查询,做等值连接
需要使用where条件。
使用表别名:
select e.ename "员工姓名",e.deptno "部门号" from emp e,dept d where e.deptno=d.deptno;
DQL的基本查询语句
select..from..where..group by..having..order by..
执行逻辑:
1.from
2.where
3.group by
4.having
5.select
6.order by
分组查询:当统计一张表或者按照表内某些字段再进行分组时。
总记录数,或者是最大值,最小值,
平均值,总和等.
一定会与分组函数(聚合函数)连用.
count(field),
sum(field)
max(field)
min(field)
avg(field)--ifnull(field,value)
=========================================
关联查询的基础
1、概念:
当在查询时,我们所需要的数据不在一张表中,可能在
两张表或多张表中。此时我们需要同时操作这些表。即
关联查询。
2、等值连接:
在做多张表查询时,这些表中应该存在着有关联的两个字段。
我们使用某一张表中的一条记录与另外一张表通过相关联
的两个字段进行匹配,组合成一条记录。
3、笛卡尔积:
在做多张表查询时,我们使用某一张表中的每一条记录都与
另外一张表的所有记录进行组合。比如表A有x条,表B
有y条件,最终组合数为x*y,这个值就是笛卡尔积,通常
没有意义。
4、内连接
只要使用了join on。就是内连接。查询效果与等值连接一样。
用法:
表A [inner] join 表B on 关联条件
5、外连接:
在做多张表查询时,我们所需要的数据,除了满足关联条件
的数据外,还有不满足关联条件的数据。此时需要使
用外连接。会涉及到两个概念:
驱动表(主表):
除了显示满足条件的数据,还需要显示不满足条件
的数据的表
从表(副表):只显示满足关联条件的数据的表
外连接分为三种:
左外连接:
表A left [outer] join 表B on 关联条件。
表A是驱动表,表B是从表
右外连接
表A right [outer] join 表B on 关联条件
表B是驱动表,表A是从表
全外连接:
两张表的数据不管满不满足条件,都做显示。
表A full [outer] join 表B on 关联条件
PS:mysql 不支持全外连接
6、自连接:
在多张表进行关联查询时,这些表的表名是同一个。
即自连接。
高级关联查询:
有的时候,我们要查询的数据, 一个简单的查询语句
满足不了,并且我们使用的数据,表中不能直观体现出来。
而是预先经过一次查询才会有所体现。那么先执行的
查询,我们称之子查询。被子查询嵌入的查询语句称之
为父查询。
比如需求:查询工资大于员工JONES工资的员工的信息。
子查询返回的数据特点:
(1) 可能是单行单列的数据。
(2) 可能是多行单列的数据
(3) 可能是单行多列的数据
(4) 可能是多行多列的数据
1)子查询可以在where子句中
2)子查询可以在from子句中
3)子查询可以在having子句中
4)子查询可以在select字句中,相当于外连接的另外一种写法。
约束Constraint:
对插入表中字段的数据起到一定的条件限制。
约束分五种:
主键约束:primary key
要求作为主键的字段的字段值非空且唯一
非空约束: not null
要求:有非空约束的字段不可以为null值。
唯一性约束:unique
要求有唯一性约束的字段不可以重复,但是可以为null.
检查性约束: check(条件)--- check(gender in('f','m'))
要求在插入数据时必须符合字段的检查条件,但是可以为null
外键约束: foreign key
要求:有外键约束的字段A必须依赖于另外一个字段B,
字段B要有主键约束。
字段A的值,要么是null,
要么必须是字段B里的值。
序列:作为主键的字段,通常不是表中的主要信息,可以用来
当成信息记录的序号。序号最好是有序的序列。
作用用来给作为主键约束的字段进行有序的自增。
auto_increment 关键字,用来对有主键约束的字段
做自增操作。
注意:如果插入的第一天数据中指定了固定值,那么下次就会从此固定值开始增加
用法:
create table tname(
tid int primary key auto_increment,
......
);
函数:last_insert_id();
作用:获取序列最后一次的值。
select last_insert_id();
create table temp_001(
tid int primary key auto_increment,
tname varchar(20),
tage int);
create procedure proc5()
begin
declare var int;
set var=0;
while var<50000 do
insert into temp_001 values (null,'zs',12);
set var=var+1;
end while ;
end;
call proc5();
--==============================================================
--复习:关联查询
-- 1、概念: 多张表查询.....
-- 2、等值连接:
--- 3、笛卡尔积:
-- 4、内连接: 表A [inner] join 表B on
-- 5、外连接: 表A left [outer] join 表B on
-- 表A right [outer] join 表B on
-- 驱动表(主表),从动表(副表)
-- 6、自连接: 多张表的表名都是同一张表。
-- 高级关联查询:
-- 子查询与父查询的概念:
-- 子查询的位置: 在where子句,from子句,having子句,select子句
-- 7、约束: 5种
-- (1)主键约束,一张表中,只能有一个主键约束,但是一个主键约束可以对多个字段进行约束。
-- (2)非空约束,
-- (3)唯一约束,
-- (4)检查约束, 要么符合检查约束的条件,要么可以为null.
-- (5)外键约束, 字段B 设置外键约束,依赖于字段A,字段B的值要么是A里的值。
-- 或者可以为null,字段A必须是有主键约束。
-- 8、序列: 作用用来给作为主键约束的字段进行有序的自增。
-- auto_increment
-- 默认序列是从1开始,每次自增+1;
-- reg:create table tname(tid int primary key auto_increment);
-- 注意: 如果插入的第一条数据中指定了固定值,那么下次就会从此固定值开始增加。
--=========================================================================
-- 分页查询:
-- 需求:当每次查询的记录数比较大,通常一页显示不下,此时我们可以进行分页查询。
-- 关键字limit
-- 用法: limit begin,size;
-- begin:记录的开始行数. 偏移量
-- size:每页的最大记录数。
-- 注意:limit后可以是一个参数,
-- 一个参数时,是指每次最大的查询记录数,limit size;
-- 默认记录数从0开始,而不是1.
--练习1:查询员工表,查询第一页的数据,每页10条。
select * from emp limit 0,10;
--练习2:查询员工表,查询第二页的数据,每页5条。
select * from emp limit 5,5;
--练习3:按照部门号升序排序,查询第二页的数据,每页5条
select * from emp order by deptno limit 5,5;
--练习4:按照员工编号降序排序,查询第二页的数据,每页5条。
select * from emp order by empno desc limit 5,5;
--练习5:使用子查询,先排序,再查询每页的数据。
-- 按照员工工资降序排序,查询第二页的数据,每页6条。
select e.* from (select * from emp order by sal desc) e limit 6,6;
-- 执行效率与优化
--- 创建了一张表temp_001,插入了10w条的数据。
-- 需求: 每页100条记录,查询第1页的数据
-- 查询第11页的数据
-- 查询第101页的数据
-- 查询第1001页的数据
--select * from temp_001 limit 100;
--select * from temp_001 limit 1000,100;
--select * from temp_001 limit 10000,100;
--select * from temp_001 limit 143000,100;
-- 当我们在做分页查询的时候,查询的效率与偏移量有关系,偏移量越大,
-- 效率越低,消耗的时间就会越多。 如上述分页查询
-- 如何优化分页查询
-- (1)我们可以使用子查询先确定作为tid偏移量的位置。
-- select tid from temp_001 limit 100000,1
-- (2)再进行分页查询
-- select * from where tid>=(查出id的值) limit 100;
--练习:
select * from temp_001 where tid>=
(select tid from temp_001 limit 144000,1) limit 100;
-- 还有一种优化:首先确定tid必须是连续的数据。
-- 使用 between and
select * from temp_001
where
tid between 145000 and 145200 limit 100;
--=================================================
--视图:VIEW,表的一部分投影。也是数据库里一个对象。(表的虚拟部分)
-- 视图的作用: 因为视图中含有某表中的部分数据,不在视图中的字段有隐藏效果。
-- 相对来说,安全。
--如何操作视图呢?视图可以像表一样,进行增删改查。
--如何创建视图呢?
--格式: create view ViewName as subQuery
--练习1: 将员工表中的10部门的数据封装到一个视图view_emp_deptno_10
create view view_emp_deptno_10 as select * from emp where deptno=10;
-- 通过视图进行DML操作,一定会对表有影响。
-- 通过表进行DML操作,可能会对视图有影响。
--练习2:通过视图,插入数据 empno:9001,ename:'zs',部门号:10
-- 插入数据 empno:9002,ename:'ls',部门号:20
-- 查询表emp,查询视图view_emp_deptno_10
insert into view_emp_deptno_10 values (9001,'zs',null,null,null,null,null,10);
insert into view_emp_deptno_10 (empno,ename,deptno)values (9002,'ls',20);
select * from view_emp_deptno_10;
--with check option:对视图的一种检查约束选项,
-- 如果在创建视图有此选项时,表示,只能对视图DML操作可见数据。
-- 反之,对视图不可见的数据,是不可以通过视图进行DML操作的。
--练习2:创建一个视图view_emp_deptno_20,
-- 投影20号部门的 员工编号,员工姓名,职位,工资,部门号。
--练习3:通过视图view_emp_deptno_20插入数据
-- empno:9003,ename:'ww',job:manager,sal:5000,20
-- empno:9004,ename:'zl',job:manager,comm:500,20
-- empno:9005,ename:'qq',job:manager,sal:500,10
create view view_emp_deptno_20 as select empno,ename,job,sal,deptno
from emp where deptno = 20 with check option;
select * from view_emp_deptno_20;
insert into view_emp_deptno_20 values(9003,'ww','manager',5000.0,20);
insert into view_emp_deptno_20 (empno,ename,job,comm,deptno)values(9004,'zl','manager',500.0,20);
insert into view_emp_deptno_20 values(9005,'qq','manager',5000.0,10);
--视图的分类:
-- 简单视图:subQuery是一个表中的普通查询语句
-- 复杂视图:subQuery是一个可以带有分组函数的,或者关联查询的语句。
-- 复杂视图不能对视图进行DML操作,只能进行DQL操作
--练习:创建一个复杂视图view_emp_100,是每个部门的平均工资,最高工资,最低工资,及其部门号。
create view view_emp_100 as select avg(ifnull(sal,0)) avg_sal,max(sal) max_sal,
min(sal) min_sal,deptno from emp group by deptno;
select * from view_emp_100;
--===================================================
-- 索引(Index):目的是为了提高查询速度。相当于一本书的目录。
-- 索引也是数据库的对象,占空间。每张表每个字段都可以设置相应的
-- 索引
-- 优点: 提高查询速度。
-- 缺点: 占空间, 每次进行DML操作时,数据库都要(自动)重新维护索引,
-- 降低效率.
-- 总体来说:表中有索引可以提高效率,但不是索引越多越好。当表中的数据量
-- 比较小时,无需索引(因为直接查询可以比使用索引更快),当某个字段的值
-- 比较少时,也不需要索引,如性别字段只有'f','m'.只有当数据量比较大,
-- 和字段值多时,可以使用索引。
--练习1:给emp表中的empno创建索引。
create index index_emp_empno on emp(empno);
--练习2:查询empno为9003的数据。
select * from emp where empno=9003;
--删除索引,删除视图都是用drop
--drop index indexName
--drop view viewName
--可以自学: PLSQL(数据库编程语言)--触发器,存储过程
--数据库中现有以下学生信息表:
--Student学生表(SNO学号,SNAME姓名,SEX性别,BIRTHDAY出生年月,DEP院系)
--Course课程表(CNO编号,CNAME课程名称,CVAL学分)
--SC选课表(SNO学号,CNO课程编号,SCORE成绩)
--练习1:查询选修了'数据结构'的总人数
--练习2:查询'张宇'同学选修了的课程和成绩
--练习3:查询挂科学分最多的同学姓名和院系
select count(*) from sc where cno =
(select cno from Course where cname='数据结构');
---
select cname,score
from Student s,Sc,Course c
where s.sno=sc.sno and c.cno = sc.cno and sname='张宇';
--张宇同学的编号:
select sno from student where sname='张宇';
;
select c.cname,a.score
from Course c join
(select cno,score from sc where sno =
(select sno from student where sname='张宇')
) a
on c.cno = a.cno
每个人都挂了多少学分
select sname,dep from student where
sno in(
select sno from Course,SC
where Course.cno = sc.cno and sc.score<60
group by sc.sno having sum(cval)=
(select sum(cval) sum_ from Course,SC
where Course.cno = sc.cno and sc.score<60
group by sc.sno order by sum_ desc limit 1
)
);
select sname,dep from student where
sno in(
select sno from Course,SC
where Course.cno = sc.cno and sc.score<60
group by sc.sno having sum(cval)=
(select sum(cval) sum_ from Course,SC
where Course.cno = sc.cno and sc.score<60
group by sc.sno order by sum_ desc limit 1
)
);
-- size:每页的最大记录数。
-- 注意:limit后可以是一个参数,
-- 一个参数时,是指每次最大的查询记录数,limit size;
-- 默认记录数从0开始,而不是1.
--练习1:查询员工表,查询第一页的数据,每页10条。
select * from emp limit 0,10;
--练习2:查询员工表,查询第二页的数据,每页5条。
select * from emp limit 5,5;