数据库定义语言

{

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

}