Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

基本SQL语句

Posted on 2008-08-12 15:54 Prayer 阅读(275) 评论(0)  编辑 收藏 引用 所属分类: 数据库,SQL
有关数据库的一写操作:
创建表项就不说了.
CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE,
Sname CHAR(20),
Ssex CHAR(1),
Sage INT,
Sdept CHAR(15));
插入记录:
insert into Student (Sno,Sname,Ssex,Sdept) values('aaa','mary','f','172');
删除记录:
delete from Student where Sno = 'aaa';
注:只需要删除一个主键就可以了。其他的记录会相应的删除掉。
删除表中一个字段:
ALTER TABLE Student DROP column Ssex; 列名;
修改表中的那一行数据:
原来的记录:
Sno Sname Ssex Sdept
aaa mary f 172
update Student set Sname='mary1', Ssex='m' where Sno='aaa';
修改后:
Sno Sname Ssex Sdept
aaa mary1 m 172


desc倒叙排列:
建立索引:
create unique index Sno on Student(Sno);
索引的一点好处:在查询时候比较方便,在存在的所有记录中查找一个Sno=1的时候!建立索引的表中就直接查找Sno项比较它是否=1找到后查相关的记录就比较快。没有建立索引的需要把所有信息都查找一遍,再在其中找Sno字段,再比较其值=1的相关记录。

默认是ASC。
按表中哪个字段倒叙排序:
select * from Student order by Sno desc;
注意:要排序的字段必须是int型。

设置成自增长的字段在插入数据的时候不需要插入该字段的值:
select * from Student order by Sno desc;
原来没有设置成自增长插入数据命令:
insert into Student (Sno,Sname,Ssex,Sdept) values('aaa','mary','f','172');
将int型的Sno字段设置成自增长后
insert into Student (Sname,Ssex,Sdept) values('mary1','f','172');
insert into Student (Sname,Ssex,Sdept) values('mar1y','f','172');
insert into Student (Sname,Ssex,Sdept) values('ma1ry','f','172');
insert into Student (Sname,Ssex,Sdept) values('m1ary','f','172');

在表中的排序如下:
Sno Sname Ssex Sdept
1 mary1 f 172
2 mar1y f 172
3 ma1ry f 172
4 m1ary f 172
/*********************************************************************************
2006.7.20
*********************************************************************************/
查询表中记录总数:(无字段名字)
select count() from usertable;
或:(userid 为字段名字,结果是字段的总行数)
select count(*) userid from Student;

查询字段的平均值:
selecet avg(Sno) from Student;
select avg(字段名)from 表名;

给出查询的字段的平均值取别名:
select avg(字段名) as (别名) from (表名);

查找指定的字段的其他字段
select Sdept,Ssex,Sname
from Student
where Sno=3;
(where Sname='mary1';或则where Sname like 'mary1';)

在between语句查询的都是在and之间的所有值而IN语句则必须是in括号里面的值.
select Sno,Ssex,Sname from Student where Sdept between 180 and 190;

select Sno,Ssex,Sname from Student where Sdept in (172,190);


查询Student表中的所有的名字中的Sno和Ssex值.
select Sno,Ssex from Student where Sdept >= 170 and Sname like '%%';
注:%%之间是把所有的String类型的值




like和where条件查询
select last_name,salsry,department_id from employees where last_name like 'G%' and salary>3000;

查询Student表中的所有的名字中间有mary的所有名字对应的的Sno和Ssex值.
select Sno,Ssex from Student where Sdept >= 170 and Sname like '%mary%';
注:mary1,1mary,marydsajdh,等.

注意:and or not 用的时候,and是用在连接并列条件的2个不同的字段
or是用在选择的2个不同的字段之间,not一般用于not in(180,190)之间.
order by 和asc|desc的一点不同:
order by是按先进先排,desc是先进后排,asc和desc是排列顺序不一样.




disctinct条件查询
distinct 这个关键字来过滤掉多余的重复记录只保留一条,

select distinct name from table 表示将返回table表中name字段不重复的所有字段的集合。

注:distinct必须放在开头,select id distinct name from table 是错误的!

-------------------------------------------------------------------------------------
表TEST_1:
id name1 name2
9 aaa 11
8 bbb 22
3 ccc 33
4 ccc 44
5 bbb 55
6 ddd 66
7 eee 77
-------------------------------------------------------------------------------------

select distinct(name1) from test_1

结果:
name1
aaa
bbb
ccc
ddd
eee
distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的集合,而不是用它来返回不重记录的所有值。其原因是distinct只能返回它的目标字段,而无法返回其它字段,即上表中只能返回name1字段的所有不重复记录集合。

-------------------------------------------------------------------------------------
如果现在想查询出表test_1中所有name1不重复的id和name1字段的记录呢?

select distinct name, id from table

结果:
name1 id
aaa 9
bbb 5
bbb 8
ccc 3
ccc 4
ddd 6
eee 7

并不是我们所想要的结果

select distinct name,id from table 作用了两个字段,也就是必须得id与name都相同的才会被排除,即返回去除table表中id和name两个字段同时相同情况下所有集合。
-------------------------------------------------------------------------------------

如果现在想查询出表test_1中所有name1不重复的所有字段的记录呢?

对于
select * from test_1 where name1 in (select distinct name1 from tablename)
等价于
select * from test_1 where name1 in ('aaa','bbb','ccc','ddd','eee')
我们很可能认为它是可行的,但实际上结果却是:

id name1 name2
9 aaa 11
8 bbb 22
3 ccc 33
4 ccc 44
5 bbb 55
6 ddd 66
7 eee 77

正确sql应该是:
select * from test_1 inner join (select min(id) as id from test_1 group by name1 order by id ) T on test_1.id = T.id

min(id)或max(id)都行,order by id 可要可不要.这里用内连接实现联合查询,也可以用where语句

select * from test_1 ,(select min(id) as id from test_1 group by name1 order by id ) where test_1.id = T.id


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理