数据库定义语言
{
DDL(Data Definition Language)
用户需要修改视图或索引定义,只能先把它们删除,然后再重建。
所有的SQL语句在结尾处都要使用";"符号。
create table <表名>(
<列名><数据类型>[限制条件]
[,<列名><数据类型>[限制条件]]...);
create table student(
sno char(6) not null unique,
sname char(8) not null,
age smallint,
sex char(1),
address char(20)
);
alter table进行两种修改:增加列以及修改原有列的定义。
alter table <tablename> add (
<列名><数据类型>[限制条件]...
);
alter table students add telenum char(8);
新增加的列一律为空值。
alter table <tablename> modify (
<列名><数据类型>...
);
alter table students modify address char(30);
如果列中已经存在数据,则不能改变数据类型,只可以增大列宽。
drop table students;
create view <viewname> [(col1)...] as <查询子句>;
create index <indexname> on <tablename>(<col1>[asc|desc],...);
create index age-index on students (age asc);
drop index age-index;
}
数据库查询语言
{
查询语言(Query Language),单表查询,连接查询,嵌套查询,集合查询等。
select子句和from子句是每个查询语句所必须的,其它子句人选。
where子句说明查询的条件。
group by子句用来将结果分组,记住,是结果。
order by子句将结果排序,记住,是结果。
select sno,sdept from students;
select * from courses;
select sname,2005-sage from students;
select distinct cno from sc;默认为all
select sname,sdept from students where sage>20;
select sno,grade from sc where grade between 80 and 90;包括80和90
select sname,sdept from students where sdept in('english','maths');
下划线"_"表示任意单字符,和linux的"?"类似吧(当然啦,如果是汉字,那么就要两个__鸟)
百分号"%"表示包括长为零的任意长的字符串,和linux的"*"类似吧
如果是完整的字符串,则可以使用比较符号的等号"="取代like
select * from course where cno like 'cool';
<=>select * from course where cno='cool';
select * from students where sname like '李%';
select sno,cno from sc where grade is null;
select * from students where sage>20 and ssex='男';
group by <colname>
{
聚集函数:AVG MAX MIN SUM COUNT
select AVG(grade) from sc;作用于整个结果
select cno,AVG(grade) from sc group by cno;以cno相同为一组,聚集函数作用于每个分组
}
order by <colname>/<num>
{
列可以用列名表示,也可以用在select子句出现的序号表示。特别当选择的列是聚集函数或表达式时,
由于没有列名,只能用序号表示。
select sno,grade from sc where cno='c001' order by grade asc;
}
集合查询
select sno from students where sage<22
union select sno from sc where cno='c001';
连接查询
也叫多表查询,通过连接运算符可以实现多个表查询。
连接是关系数据库模型的主要特点,也是区别其他类型数据库管理系统的一个标志。
>>>>等值和非等值查询
select student.*,sc.*
from students,sc
where students.sno=sc.sno;
>>>>自身连接查询(典型例子:先修课程,为表设置别名)
select cr1.cno,cr2.cpre
from course cr1,course cr2
where cr1.cpre=cr2.cno
>>>>外连接查询
外连接类似于给添加*的表添加了一个任意匹配行,该行记录能够和另一边的表中所有没有符合连接条件的记录匹配。
右边加*,表示左外连接,左边则是右外连接。
select students.sno,sname,ssex,sdept,cno,grade
from students,sc
where students.sno=sc.sno(*);
<=>select students.sno,sname,ssex,sdept,cno,grade
from students left out join sc on(students.sno=sc.sno);
>>>>复合查询
嵌套查询
子查询形成的结果又成为父查询的条件。
子查询不能有order by子句,order by子句只能对最终查询结果排序。
select sname,sdept
from students
where sno in (select sno from sc where cno='c002');
select sname,sdept
from students
where sno in (select sno from sc where cno in
(select cno from course where cname='C++'));
select sname,sage
from students
where sdept in (select sdept from students where sname='王雪');
select sname,sage
from students
where sage <ANY (select sage
from student
where sdept='CS')
and sdept <>(or !=) 'CS';
<=>
select sname,sage
from student
where sage <
(select MAX(sage)
from students
where sdept='CS')
and sdept <> 'CS';
=ANY等价IN,<ANY等价<MAX,<>ALL等价NOT IN,<ALL等价<MIN
select sname,sdept
from student
where exists
(select *
from sc
where sno=student.sno and cno='c001');
}