1.有表user和数据以下:
+------+------+
| id | name |
+------+------+
| 1 | A |
| 2 | B |
| 3 | B |
| 4 | A |
| 5 | C |
| 6 | C |
+------+------+
要求当Name列上有相同的值时,只保留最小的那一行,结果以下:
+---------+------+
| min(id) | name |
+---------+------+
| 1 | A |
| 2 | B |
| 5 | C |
+---------+------+
写出用以实现上述要求的一条sql语句:
答案:select min(id),name from user group by name;
若是要保留最大的那一行,并按id的大小排列,结果以下:
+---------+------+
| max(id) | name |
+---------+------+
| 3 | B |
| 4 | A |
| 6 | C |
+---------+------+
答案:select max(id),name from user group by name order by max(id);
2.aa,bb 表都有20个字段,且记录量都很大,aa,bb表的X字段(非空)上有索引,请用sql列出aa表里存在的X在bb表不存在的X的值,
请写出你认为最快的语句,并解释缘由。
答案以下:
1:创建表A
create table A(id integer primary key auto_increment, name varchar(20));
2:创建表B
create table B(id integer primary key auto_increment, AID integer, name varchar(20), foreign key (AID) references A(id));
3: A,B表以下:
+----+------+
| id | name |
+----+------+
| 1 | A1 |
| 2 | A2 |
| 3 | A3 |
+----+------+
+----+------+------+
| id | AID | name |
+----+------+------+
| 1 | 1 | B1 |
| 2 | 2 | B2 |
| 3 | 2 | B3 |
+----+------+------+
4:用exists
select id,name from A where exists (select * from B where A.id=B.AID);
+----+------+
| id | name |
+----+------+
| 1 | A1 |
| 2 | A2 |
+----+------+
5:用 in
select id,name from A where id in (select AID from B );
+----+------+
| id | name |
+----+------+
| 1 | A1 |
| 2 | A2 |
+----+------+
sql