order by 是按照某个字段menu(分数)排序
1.查询所有学生的数学成绩,显示学生姓名name, 分数, 由高到低
SELECT a.name, b.score
FROM student a, grade b
WHERE a.id = b.id
AND kemu = '数学'
ORDER BY score
DESC
gorup by 是某个字段menu(分数)相同的放在一组进行分组
2.统计每个学生的总成绩,显示字段:姓名,总成绩
SELECT a.name, sum(b.score) as sum_score
FROM student a, grade b
WHERE a.id = b.id
GROUP BY name
DESC
一、truncate、delete和drop 的区别
1、表数据和表结构
truncate、delete都会删除表中的数据,不删除表的结构(定义),drop不仅会删除表数据也会删除表结构。
2、是否加入事务
drop、truncate都是DDL语句(数据定义语言),执行后会自动提交。delete是DML语句,不会自动提交。
3、delete 语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;
如果有相应的 trigger,执行的时候将被触发。
truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。
二、使用order by 和 limit 的组合,能够找出一个列中最高或者最低的值。
select prod_price from products order by prod_price desc limit 1;
// prod_price desc 对价格进行降序排列,然后取第一个,获得最大值
order by 子句位置
多条件组合语句,顺序不能出现错误,不然将产生错误。
order by 位于from 子句之后,limit 位于order by 子句之后。
三、连接类型:
1. 交叉联接 :得到所连接表的所有组合 (笛卡儿集)cross join
2. 内联接:得到连接表的满足条件的记录组合inner join on
3. 外联接:(左、右)得到一个表的所有行,及其余表满足连接条件的行 full | left | right outer join on
1、交叉联接
在这类联接的结果集内,两个表中每两个可能成对的行占一行。
但是如果在交叉联接中加入where 子句就相当与是内联接
2、内联接
仅显示两个联接表中的匹配行的联接。(这是查询设计器中的默认联接类型)
3、外链接
(1)左向外联接
包括第一个命名表(”左”表,出现在 JOIN子句的最左边)中的所有行。不包括右表中的不匹配行。
(2)右向外联接
包括第二个命名表(”右”表,出现在 JOIN子句的最右边)中的所有行。不包括左表中的不匹配行。
4、例子:
-------------------------------------------------
a表 id name b表 id job parent_id
1 张3 1 23 1
2 李四 2 34 2
3 王武 3 34 4
a.id 和 parent_id 关联
--------------------------------------------------
1) 内连接
select a.*,b.* from a inner join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
2)左连接
select a.*,b.* from a left join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
3 王武 null
3) 右连接
select a.*,b.* from a right join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
null 3 34 4
4) 完全连接
select a.*,b.* from a full join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
null 3 34 4
3 王武 null
四、常见面试题:
1. 语句查询出每门课都大于80 分的学生姓名
name kecheng fenshu
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90
答案一:: select distinct name from table where name not in (select distinct name from table where fenshu<=80)
答案二:select name from table group by name having min(fenshu)>80
2. 学生表 如下:
自动编号 学号 姓名 课程编号 课程名称 分数
1 2005001 张三 0001 数学 69
2 2005002 李四 0001 数学 89
3 2005001 张三 0001 数学 69
删除除了自动编号不同, 其他都相同的学生冗余信息
A: delete tablename where 自动编号 not in(select min( 自动编号) from tablename group by 学号, 姓名, 课程编号, 课程名称, 分数)
3. 说明:两张关联表,删除主表中已经在副表中没有的信息
SQL:
Delete from info where not exists (select * from infobz where info.infid=infobz.infid )