进阶之SQL知识点

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 ) 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章