您的位置:首页 > 数据库

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

2016-05-15 22:57 549 查看


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

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


分类:

MySQL(13)


版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[-]

四查询记录

1最简单的查询命令
2查询表达式解析

1查看数据表所有列的记录
2查看数据表指定的列的记录
3使用table_name可以表示命名表的所有列
4查询表达式可以使用AS alias_name为其赋予列名
4where语句进行条件查询
5GROUP BY语句对查询结果分组
6HAVING语句设置分组条件
7ORDER BY语句对查询结果排序
8LIMIT语句限制查询数量

四查询记录

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找工作面试题目
2013-09-03 21:36 12034人阅读 评论(2) 收藏 举报


分类:

找工作笔试面试那些事儿(17)


版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[-]

1SELECT
2DISTINCT
3WHERE
4AND OR
5IN
6BETWEEN
7LIKE
8ORDER BY
9函数
10COUNT
11GROUP BY
12HAVING
13ALIAS

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#;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: