SQL语句总结and操作数据表中的记录

 

MySQL学习14:操作数据表中的记录(二)

标签: MySQLSELECT命令MySQL数据库查询记录操作数据库的记录
  632人阅读  评论(0)  收藏  举报
  分类:
 

        四查询记录

        MySQL数据库中对于数据表中的记录最常用的就是记录的查询,操作数据表中的记录大都是记录的查询。查找

记录的语法结构为:

        SELECT select_expr [,select_expr ...]

        [

             FROM table_refereneces

             [WHERE where_condition] 

             [GROUP BY {col_name | position } [ASC | DESC],...]

             [HAVING where_condition]

             [ORDER BY {col_name | expr | position} [ASC | DESC],...]

             [LIMIT {[offset,] row_count | row_count OFFSET offset}]

        ];

       (1)最简单的查询命令

       1)显示当前服务器版本

       SELECT VERSION();

       2)显示当前日期时间

       SELECT NOW();

       3)显示当前用户

       SELECT USER();

       4)显示当前数据库

       SELECT DATABAE();

       来看其中的两个例子:


       (2)查询表达式解析

       对于查询表达式select_expr,每一个表达式表示想要的一列,必须有且至少一个。多个列之间以英文逗号分隔。

号(*)表示所有列。table_name.*可以表示命名表的所有列。查询表达式可以使用[AS] alias_name为其赋予列名。别

可用于GROUP BY,ORDER BY或HAVING子句。

        例子:

        1)查看数据表所有列的记录

        SELECT * FROM users;

        SELECT * FROM users3;


        2)查看数据表指定的列的记录

        查看数据表users3中的id字段和username字段的两列记录,其中你所写的查询表达式的前后位置不一样,查询

的结果也不一样。下面就是例子:

        SELECT id,username FROM users3;

        SELECT username,id FROM users3;


        3)使用table_name.*可以表示命名表的所有列

        SELECT users3.id,users3.username FROM users3;


        上述的例子并没有体现出这样查询的好处,在以后我们学习了多表之间的连接查询,这样写的好处就会立马体现

出来,关于多表之间的连接查询我们后续会深入学习。

        4)查询表达式可以使用[AS] alias_name为其赋予列名

        SELECT id AS userID,username AS uname FROM users3;


        4)where语句进行条件查询

        条件表达式表达的意思是对记录进行过滤,如果没有指定WHERE字句,则显示所有记录。在WHERE表达式

中,可以使用MySQL支持的函数或运算符。在这里不做过多的介绍,以后再进行详细的解析。

        SELECT id,username FROM users3 WHERE id % 2 = 0;


        5)GROUP BY语句对查询结果分组

        [GROUP BY {col_name | position} [ASC | DESC],... ]

        GROUP BY语句进行分组显示还可以指定列的名称以及列的位置。ASC表示显示的查询结果按照默认的升序排

列,DESC表示降序排列。

        SELECT * FROM users3;

        按性别进行分组:

        SELECT sex FROM users3 GROUP BY sex;

        或者SELECT sex FROM users3 GROUP BY 1;


        6)HAVING语句设置分组条件

        分组条件:[HAVING where_condition]

        SELECT sex,age FROM users3 GROUP BY 1 HAVING age > 23;

        SELECT sex FROM users3 GROUP BY 1 HAVING count(id) > 12;

        SELECT sex FROM users3 GROUP BY 1 HAVING count(id) > 1;


        7)ORDER BY语句对查询结果排序

        [ORDER BY {col_name | expr | position} [ASC | DESC],... ]ORDER BY语句进行分组显示还可以指定列的名

称,表达式以及列的位置。ASC表示默认的升序排列,DESC表示降序排列。

       例子:

       SELECT * FROM users3;

       SELECT * FROM users3 ORDER BY id DESC;


       两个字段进行排序

       SELECT * FROM users3 ORDER BY age,id DESC;


       上述的结果表示;首选是以age字段进行升序排列,如果有重复的数字的话,再以id字段的降序开始排列,这就输

出了上面的结果。需要注意的是,如果指定的第一个需要排列的字段无法进行排序,只能进行第二个字段排列;如果

指定的第一个字段能排序,那么第二个字段视情况而定。

       8)LIMIT语句限制查询数量

       限制查询结果返回的数量:[LIMIT {[offset,] row_count | row_count OFFSET offset}]默认的是返回所有记录,因

此返回查询结果的数量就需要我们自己指定。这里最需要注意的是记录都是从索引0开始记录的

       例子:

       1指定一个数字,返回的是查询结果的数量,当然是从索引为0开始计算的。

       SELECT * FROM users3 LIMIT 2;

       2指定两个数字,第一个数字代表返回查询记过的开始索引位置,第二数字代表但会查询结果的数量。

       SELECT * FROM users3 LIMIT 3,2;


       3GROUP BY和LIMIT复合语句

       SELECT * FROM users3 ORDER BY id DESC;

       SELECT * FROM users3 ORDER BY id DESC LIMIT 2,2;


       这里结果表示的是:分组查询的结果不管是正序排列还是倒序排列,LIMIT限制语句的索引位置都是从索引0的位

置开始的,这里所说的索引都是记录的索引位置,也就是记录的初始位置开始。

 

找工作笔试面试那些事儿(10)---SQL语句总结

标签: 数据库sql找工作面试题目
  12034人阅读  评论(2)  收藏  举报
  分类:
 

SQL语句中常用关键词及其解释如下:

1)SELECT

将资料从数据库中的表格内选出,两个关键字:从 (FROM) 数据库中的表格内选出 (SELECT)。语法为
SELECT "栏位名" FROM "表格名"。

2)DISTINCT

在上述 SELECT 关键词后加上一个 DISTINCT 就可以去除选择出来的栏位中的重复,从而完成求得这个表格/栏位内有哪些不同的值的功能。语法为
SELECT DISTINCT "栏位名" FROM "表格名"。

3)WHERE

这个关键词可以帮助我们选择性地抓资料,而不是全取出来。语法为
SELECT "栏位名" FROM "表格名" WHERE "条件" 

4)AND OR

上例中的 WHERE 指令可以被用来由表格中有条件地选取资料。这个条件可能是简单的 (像上一页的例子),也可能是复杂的。复杂条件是由二或多个简单条件透过 AND 或是 OR 的连接而成。语法为:
SELECT "栏位名"  FROM "表格名"  WHERE "简单条件"  {[AND|OR] "简单条件"}+

5)IN

在 SQL 中,在两个情况下会用到 IN  这个指令;这一页将介绍其中之一:与 WHERE 有关的那一个情况。在这个用法下,我们事先已知道至少一个我们需要的值,而我们将这些知道的值都放入 IN  这个子句。语法为:
SELECT "栏位名"  FROM "表格名"  WHERE "栏位名" IN ('值一', '值二', ...)  

6)BETWEEN

IN 这个指令可以让我们依照一或数个不连续 (discrete)的值的限制之内抓出资料库中的值,而 BETWEEN 则是让我们可以运用一个范围 (range)  内抓出资料库中的值,语法为:
SELECT "栏位名"  FROM "表格名" WHERE "栏位名" BETWEEN '值一' AND '值二' 

7)LIKE

LIKE 是另一个在 WHERE  子句中会用到的指令。基本上, LIKE  能让我们依据一个模式(pattern) 来找出我们要的资料。语法为:
SELECT "栏位名"  FROM "表格名"  WHERE "栏位名" LIKE {模式} 

8)ORDER BY

我们经常需要能够将抓出的资料做一个有系统的显示。这可能是由小往大 (ascending)  或是由大往小(descending)。在这种情况下,我们就可以运用 ORDER BY 这个指令来达到我们的目的。语法为:
SELECT "栏位名"  FROM "表格名 [WHERE "条件"] ORDER BY "栏位名" [ASC, DESC] 

9)函数

函数允许我们能够对这些数字的型态存在的行或者列做运算,包括 AVG (平均)、COUNT (计数)、MAX (最大值)、MIN (最小值)、SUM (总合)。语法为:
SELECT "函数名"("栏位名") FROM "表格名"  

10)COUNT

这个关键词能够帮我我们统计有多少笔资料被选出来,语法为:
SELECT COUNT("栏位名") FROM "表格名"

11)GROUP BY

GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。语法为:
SELECT "栏位1", SUM("栏位2")  FROM "表格名"  GROUP BY "栏位1" 

12)HAVING

该关键词可以帮助我们对函数产生的值来设定条件。语法为:
SELECT "栏位1", SUM("栏位2")  FROM "表格名"  GROUP BY "栏位1"  HAVING (函数条件)  

13)ALIAS

我们可以通过ALIAS为列名称和表名称指定别名,语法为:
SELECT "表格别名"."栏位1" "栏位别名"  FROM "表格名" "表格别名"  

下面为一个例子,通过它我们应该能很好地掌握以上关键词的使用方法。


Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表


问题:
1、查询“001”课程比“002”课程成绩高的所有学生的学号;
select a.S#
from (select s#,score from SC where C#=’001′) a,
(select s#,score from SC where C#=’002′) b
where a.score>b.score and a.s#=b.s#;

2、查询平均成绩大于60分的同学的学号和平均成绩;
select S#,avg(score)
from sc
group by S# having avg(score) >60;

3、查询所有同学的学号、姓名、选课数、总成绩;
select Student.S#,Student.Sname,count(SC.C#),sum(score)
from Student left Outer join SC on Student.S#=SC.S#
group by Student.S#,Sname

4、查询姓“李”的老师的个数;
select count(distinct(Tname))
from Teacher
where Tname like ‘李%’;

5、查询没学过“叶平”老师课的同学的学号、姓名;
select Student.S#,Student.Sname
from Student
where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’叶平’);

6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
select Student.S#,Student.Sname
from Student,SC

where Student.S#=SC.S# and SC.C#=’001′and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#=’002′);


7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
select S#,Sname
from Student
where S# in
(select S#
from SC ,Course ,Teacher
where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’叶平’ group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname=’叶平’));

8、查询所有课程成绩小于60分的同学的学号、姓名;
select S#,Sname
from Student
where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);

9、查询没有学全所有课的同学的学号、姓名;
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S#
group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);

10、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
select S#,Sname
from Student,SC
where Student.S#=SC.S# and C# in (select C# from SC where S#='1001');

11、删除学习“叶平”老师课的SC表记录;
Delect SC
from course ,Teacher
where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平';

12、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
SELECT L.C# 课程ID,L.score 最高分,R.score 最低分
FROM SC L ,SC R
WHERE L.C# = R.C#
and
L.score = (SELECT MAX(IL.score)
FROM SC IL,Student IM
WHERE IL.C# = L.C# and IM.S#=IL.S#
GROUP BY IL.C#)
and
R.Score = (SELECT MIN(IR.score)
FROM SC IR
WHERE IR.C# = R.C#
GROUP BY IR.C# );

13、查询学生平均成绩及其名次
SELECT 1+(SELECT COUNT( distinct 平均成绩)
FROM (SELECT S#,AVG(score) 平均成绩
FROM SC
GROUP BY S# ) T1
WHERE 平均成绩 > T2.平均成绩) 名次, S# 学生学号,平均成绩
FROM (SELECT S#,AVG(score) 平均成绩 FROM SC GROUP BY S# ) T2
ORDER BY 平均成绩 desc;

14、查询各科成绩前三名的记录:(不考虑成绩并列情况)
SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
FROM SC t1
WHERE score IN (SELECT TOP 3 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC)
ORDER BY t1.C#;

15、查询每门功成绩最好的前两名
SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
FROM SC t1
WHERE score IN (SELECT TOP 2 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC )
ORDER BY t1.C#;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值