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#;
相关文章推荐
- redis rdb
- 第97讲:使用Spark Streaming+Spark SQL来在线动态计算电商中不同类别中最热门的商品排名,
- mysql传输表空间
- 【T-SQL基础】03.子查询
- MySQL 教程
- 数据库(二)
- linux 安装 redis,卸载redis、
- 数据库(一)
- Oracle数据库_虚拟机与本地数据库互通连接配置
- 卸载Oracle数据库
- 数据库完整性
- Linux下安装redis
- MySQL报错“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”
- mysql 初始化
- zabbix3.0.2 通过orabbix监控多台oracle数据库
- SQLite数据表和视图
- SQLite包含的时间datetime,strftim…
- SQLite3中TimeStamp的使用问题
- SQLite一条SQL语句插入多条记录
- Spark SQL简单操作演示(含导出表)