收集的一些SQL题目。。。
1.
+------------+------+
| time | win |
+------------+------+
| 2005-05-09 | 胜 |
| 2005-05-09 | 胜 |
| 2005-05-10 | 胜 |
| 2005-05-10 | 负 |
| 2005-05-10 | 负 |
| 2005-05-10 | 负 |
| 2005-05-09 | 负 |
| 2005-05-09 | 负 |
+------------+------+
输出为
+------------+------+------+
| time | 胜 | 负 |
+------------+------+------+
| 2005-05-09 | 2 | 2 |
| 2005-05-10 | 1 | 3 |
+------------+------+------+
select time,
sum(case when win='胜' then 1 else 0 end)'胜',
sum(case when win='负' then 1 else 0 end)'负'
from game
group by time;
2.
+---------+------+---------+
| chinese | math | english |
+---------+------+---------+
| 85 | 67 | 76 |
| 58 | 79 | 62 |
| 66 | 60 | 96 |
+---------+------+---------+
输出为
+--------+------+------+
| 语文 | 数学 | 英语 |
+--------+------+------+
| 优秀 | 优秀 | 优秀 |
| 优秀 | 良好 | 优秀 |
| 及格 | 及格 | 及格 |
| 不及格 | 及格 | 及格 |
+--------+------+------+
约定:
>=85 优秀
>=75 良好
>=60 及格
<60 不及格
select
( case when chinese>=85 then '优秀'
when chinese>=75 then '良好'
when chinese>=60 then '及格'
else '不及格' end
) '语文',
( case when math>=85 then '优秀'
when math>=75 then '良好'
when math>=60 then '及格'
else '不及格' end
) '数学',
( case when english>=85 then '优秀'
when english>=75 then '良好'
when english>=60 then '及格'
else '不及格' end
) '英语'
from score;
3.
+----+-------+--------+-------+
| id | name | course | score |
+----+-------+--------+-------+
| 1 | name1 | 101 | 90 |
| 2 | name1 | 102 | 68 |
| 3 | name1 | 103 | 92 |
| 4 | name2 | 101 | 45 |
| 5 | name2 | 102 | 97 |
| 6 | name2 | 103 | 66 |
| 7 | name3 | 101 | 65 |
| 8 | name3 | 102 | 77 |
| 9 | name3 | 103 | 91 |
+----+-------+--------+-------+
输出为
+-------+------+------+------+
| 姓名 | 语文 | 数学 | 英语 |
+-------+------+------+------+
| name1 | 90 | 68 | 92 |
| name2 | 45 | 97 | 66 |
| name3 | 65 | 77 | 91 |
+-------+------+------+------+
INSERT INTO `test`.`testscore` (`name` ,`course` ,`score`)VALUES ('name1', '101', '90');
INSERT INTO `test`.`testscore` (`name` ,`course` ,`score`)VALUES ('name1', '102', '68');
INSERT INTO `test`.`testscore` (`name` ,`course` ,`score`)VALUES ('name1', '103', '92');
INSERT INTO `test`.`testscore` (`name` ,`course` ,`score`)VALUES ('name2', '101', '45');
INSERT INTO `test`.`testscore` (`name` ,`course` ,`score`)VALUES ('name2', '102', '97');
INSERT INTO `test`.`testscore` (`name` ,`course` ,`score`)VALUES ('name2', '103', '66');
INSERT INTO `test`.`testscore` (`name` ,`course` ,`score`)VALUES ('name3', '101', '65');
INSERT INTO `test`.`testscore` (`name` ,`course` ,`score`)VALUES ('name3', '102', '77');
INSERT INTO `test`.`testscore` (`name` ,`course` ,`score`)VALUES ('name3', '103', '91');
method 1:
SELECT name 姓名,
SUM( CASE course WHEN '101' THEN score ELSE 0 END ) "语文",
SUM( CASE course WHEN '102' THEN score ELSE 0 END ) "数学",
SUM( CASE course WHEN '103' THEN score ELSE 0 END ) "英语"
FROM testscore
GROUP BY name;
method 2:
SELECT DISTINCT s.name 姓名,
( SELECT score FROM testscore WHERE name = s.name AND course = '101' ) "语文",
( SELECT score FROM testscore WHERE name = s.name AND course = '102' ) "数学",
( SELECT score FROM testscore WHERE name = s.name AND course = '103' ) "英语"
FROM testscore s
ORDER BY s.name
4.什么是主键?什么是外键?
主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。外键是一个用来建立 两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表格(尽管可能是同一个 表格)里的一系列相连的字段。那么这些相连的字段就是外键。
5.什么叫视图?游标是什么?
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
游标是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集 的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
6.什么是事务?什么是锁?
事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
在DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。
7.触发器的作用?
触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。
8.索引的作用?和它的优点缺点是什么?
索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中 书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列 或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
9.什么是内存泄漏?
一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用free 或者delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。