Products
GG网络技术分享 2025-03-18 16:11 0
掌握这50句常用SQL基本就差不多了。
建议自己在数据库建立好以下几张表,然后自己对照这些例子逐个全部试一遍,并理解透彻。
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、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#=\'002\') score2 from Student,SC where Student.S#=SC.S# and C#=\'001\') S_2 where score2 <score;
9、查询所有课程成绩小于60分的同学的学号、姓名;
select S#,Sname from Student where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);
10、查询没有学全所有课的同学的学号、姓名;
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);
11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#=\'1001\';
12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名; select distinct SC.S#,Sname from Student,SC where Student.S#=SC.S# and C# in (select C# from SC where S#=\'001\');
13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
update SC set score=(select avg(SC_2.score) from SC SC_2 where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname=\'叶平\');
14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;
select S# from SC where C# in (select C# from SC where S#=\'1002\') group by S# having count(*)=(select count(*) from SC where S#=\'1002\');
15、删除学习“叶平”老师课的SC表记录;
Delect SC from course ,Teacher where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname=\'叶平\';
16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2、 号课的平均成绩;
Insert SC select S#,\'002\',(Select avg(score) from SC where C#=\'002\') from Student where S# not in (Select S# from SC where C#=\'002\');
17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示: 学生ID,,数据库,企业管理,英语,有效课程数,有效平均分
SELECT S# as 学生ID ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#=\'004\') AS 数据库 ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#=\'001\') AS 企业管理 ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#=\'006\') AS 英语 ,COUNT(*) AS 有效课程数, AVG(t.score) AS 平均成绩 FROM SC AS t GROUP BY S# ORDER BY avg(t.score)
18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分 FROM SC L ,SC AS R WHERE L.C# = R.C# and L.score = (SELECT MAX(IL.score) FROM SC AS IL,Student AS IM WHERE L.C# = IL.C# and IM.S#=IL.S# GROUP BY IL.C#) AND R.Score = (SELECT MIN(IR.score) FROM SC AS IR WHERE R.C# = IR.C# GROUP BY IR.C# );
21、查询不同老师所教不同课程平均分从高到低显示
SELECT max(Z.T#) AS 教师ID,MAX(Z.Tname) AS 教师姓名,C.C# AS 课程ID,MAX(C.Cname) AS 课程名称,AVG(Score) AS 平均成绩 FROM SC AS T,Course AS C ,Teacher AS Z where T.C#=C.C# and C.T#=Z.T# GROUP BY C.C# ORDER BY AVG(Score) DESC
22、查询如下课程成绩第 3 名到第 6 名的学生成绩单:企业管理(001),马克思(002),UML (003),数据库(004) [学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩
SELECT DISTINCT top 3 SC.S# As 学生学号, Student.Sname AS 学生姓名 , T1.score AS 企业管理, T2.score AS 马克思, T3.score AS UML, T4.score AS 数据库, ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 总分 FROM Student,SC LEFT JOIN SC AS T1 ON SC.S# = T1.S# AND T1.C# = \'001\' LEFT JOIN SC AS T2 ON SC.S# = T2.S# AND T2.C# = \'002\' LEFT JOIN SC AS T3 ON SC.S# = T3.S# AND T3.C# = \'003\' LEFT JOIN SC AS T4 ON SC.S# = T4.S# AND T4.C# = \'004\' WHERE student.S#=SC.S# and ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) NOT IN (SELECT DISTINCT TOP 15 WITH TIES ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) FROM sc LEFT JOIN sc AS T1 ON sc.S# = T1.S# AND T1.C# = \'k1\' LEFT JOIN sc AS T2 ON sc.S# = T2.S# AND T2.C# = \'k2\' LEFT JOIN sc AS T3 ON sc.S# = T3.S# AND T3.C# = \'k3\' LEFT JOIN sc AS T4 ON sc.S# = T4.S# AND T4.C# = \'k4\' ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);
23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
SELECT SC.C# as 课程ID, Cname as 课程名称 ,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85] ,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70] ,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60] ,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -] FROM SC,Course where SC.C#=Course.C# GROUP BY SC.C#,Cname;
24、查询学生平均成绩及其名次
SELECT 1+(SELECT COUNT( distinct 平均成绩) FROM (SELECT S#,AVG(score) AS 平均成绩 FROM SC GROUP BY S# ) AS T1 WHERE 平均成绩 > T2.平均成绩) as 名次, S# as 学生学号,平均成绩 FROM (SELECT S#,AVG(score) 平均成绩 FROM SC GROUP BY S# ) AS T2 ORDER BY 平均成绩 desc;
25、查询各科成绩前三名的记录:(不考虑成绩并列情况)
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#;
26、查询每门课程被选修的学生数
select c#,count(S#) from sc group by C#;
27、查询出只选修了一门课程的全部学生的学号和姓名
select SC.S#,Student.Sname,count(C#) AS 选课数from SC ,Studentwhere SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;
28、查询男生、女生人数
Select count(Ssex) as 男生人数 from Student group by Ssex having Ssex=\'男\'; Select count(Ssex) as 女生人数 from Student group by Ssex having Ssex=\'女\';
29、查询姓“张”的学生名单
SELECT Sname FROM Student WHERE Sname like \'张%\';
30、查询同名同性学生名单,并统计同名人数
select Sname,count(*) from Student group by Sname having count(*)>1;;
31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime)
select Sname, CONVERT(char (11),DATEPART(year,Sage)) as age from student where CONVERT(char(11),DATEPART(year,Sage))=\'1981\';
32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;
33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
select Sname,SC.S# ,avg(score) from Student,SC where Student.S#=SC.S# group by SC.S#,Sname having avg(score)>85;
34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数
Select Sname,isnull(score,0) from Student,SC,Course where SC.S#=Student.S# and SC.C#=Course.C# and Course.Cname=\'数据库\'and score <60;
35、查询所有学生的选课情况;
SELECT SC.S#,SC.C#,Sname,Cname FROM SC,Student,Course where SC.S#=Student.S# and SC.C#=Course.C# ;
36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;
SELECT distinct student.S#,student.Sname,SC.C#,SC.score FROM student,Sc WHERE SC.score>=70 AND SC.S#=student.S#;
37、查询不及格的课程,并按课程号从大到小排列
select c# from sc where scor e <60 order by C# ;
38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;
select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#=\'003\';
39、求选了课程的学生人数
select count(*) from sc;
40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩
select Student.Sname,score from Student,SC,Course C,Teacher where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname=\'叶平\' and SC.score=(select max(score)from SC where C#=C.C# );
41、查询各个课程及相应的选修人数
select count(*) from sc group by C#;
42、查询不同课程成绩相同的学生的学号、课程号、学生成绩
select distinct A.S#,B.score from SC A ,SC B where A.Score=B.Score and A.C# <>B.C# ;
43、查询每门功成绩最好的前两名
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#;
44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列
select C# as 课程号,count(*) as 人数 from sc group by C# order by count(*) desc,c#
45、检索至少选修两门课程的学生学号
select S# from sc group by s# having count(*) > = 2
46、查询全部学生都选修的课程的课程号和课程名
select C#,Cname from Course where C# in (select c# from sc group by c#)
47、查询没学过“叶平”老师讲授的任一门课程的学生姓名
select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname=\'叶平\');
48、查询两门以上不及格课程的同学的学号及其平均成绩
select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#;
49、检索“004”课程分数小于60,按分数降序排列的同学学号
select S# from SC where C#=\'004\'and score <60 order by score desc;
50、删除“002”同学的“001”课程的成绩
delete from Sc where S#=\'001\'and C#=\'001\';
#####1、通过命令行连接数据库
[root@localhost ~]# mysql -u root -p
Enter password:
输入以上命令,回车后输入密码,回车,出现 mysql> 命令提示窗口则表示登录成功,可以在mysql>下输入任何sql语句。
2、退出mysql
mysql> exit
Bye
语法:CREATE DATABASE <数据库名>;
先连接mysql服务后,再使用sql语句。可以通过命令连接也可以通过客户端工具例如navicat连接,以下创建一个库名为lemon的数据库
mysql> create DATABASE lemon;
语法:show databases;
示例:查看mysql服务所有数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| future|
| lemon|
| mysql
| test|
| test_mysql|
+--------------------+
语法:drop database <数据库名>;
drop删除数据库命令谨慎使用,一旦删除,所有数据都没有了。以下示例:删除一个库名为test的数据库。
mysql> drop DATABASE test;
语法:use <数据库名>;
示例:选取数据库lemon进行操作。
mysql> use lemon;
Database changed
语法:create table <表名> ( <字段名1> <类型1>,<字段名2> <类型2>, ...,<字段名n> <类型n>);
示例:需要创建一个学员信息表,用于存储学号、姓名、性别、班级、年龄。
create table student(
sno int(8) not null primary key auto_increment comment \'学号\',
sname varchar(20) NOT NULL comment \'姓名\',
ssex varchar(4) NOT NULL comment \'性别\',
sclass int(8) NOT NULL comment \'班级\',
sage int(4) NOT NULL comment \'年龄\'
)DEFAULT CHARSET=utf8;
解析:
int为整型,这里学号sno、班级编号sclass设定为整型;
varchar字符型,这里姓名sname、性别ssex、年龄sage设定为字符型;
字段属性设定为not null,表示字段值不允许空;
primary key关键字用于定义列为主键。主键唯一、不重复,一般以编号为主键;
auto_increment定义列属性为自增,一般用于主键,插入数据时数值会自动加1;
comment相当于给列添加备注;
DEFAULT CHARSET 设置编码,utf8对传值中文防止乱码。
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| student |
| student1 |
+----------------+
语法:drop table <表名>;
drop删除表请谨慎操作,因为执行删除命令后该表及包含的数据都会消失。以下示例:删除一个表名为student的数据表。
mysql> drop table student;
语法:insert into <表名> ( 字段名1,字段名2,...字段名N)
values
( 值1, 值2,...值N );
示例:
1、往学员信息表中插入一条学员信息
insert into student (sno,sname,ssex,sclass,sage) values (6301,\'柠檬\',\'女\',20190163,18);
注意:如果数据值为字符型必须用单引号或者双引号括起来。
2、批量插入,插入多条学员信息
insert into student (sname,ssex,sclass,sage)
values
(\'毛毛\',\'女\',20190163,20),(\'大大\',\'女\',20190163,22);
语法:update 表名 set 字段名1= 新值1,字段名2=新值2, … where 条件表达式1 and(or) 条件表达式2 …;
示例:修改学员姓名为毛毛的性别为男
update student set ssex = \'男\' where sname = \'毛毛\';
语法:select 字段名1,字段名2,… from <表名> where 条件表达式1 and(or) 条件表达式2 … ;
1、查询所有字段列信息
示例:查询student表中,性别女且年龄在20岁以上的学员信息
select * from student where ssex = \'女\' and sage > 20;
2、查询指定字段列信息
示例:查询student表中,性别女或者年龄在20岁以上的学员姓名
select sname from student where ssex = \'女\' or sage > 20;
3、查询前几行信息
示例:查询student表中,性别女且年龄在20岁以上的前2行学员信息
select sname from student where ssex = \'女\' or sage > 20 limit 0,2;
语法:
1、关联查询:select 字段名1,… from 表名1,表名2,…where 关联条件表达式 and 过滤条件表达式 …;
2、等值连接:select 字段名1,… from 表名1 inner join 表名2 on 关联条件表达式 and 过滤条件表达式… ;
3、左连接:select 字段名1,… from 表名1 left join 表名2 on 关联条件表达式 and 过滤条件表达式… ;
4、右连接:select 字段名1,… from 表名1 right join 表名2 on 关联条件表达式 and 过滤条件表达式… ;
示例:
1、以上左表user表,右表为左表的对象信息user_lover表,查询两表中存在对象关系的信息
SELECT * FROM `user`, user_lover WHERE `user`.id = user_lover.u_id;
SELECT * FROM `user`INNER JOIN user_lover on `user`.id = user_lover.u_id;
运行结果:
2、读取左表全部数据,即使右表没有关联数据
SELECT * FROM `user`LEFT JOIN user_lover on `user`.id = user_lover.u_id;
运行结果:
3、以右表为基础,与LEFT JOIN相反
SELECT * FROM `user` RIGHT JOIN user_lover on `user`.id = user_lover.u_id;
运行结果:
语法:delete from 表名 where 条件1 and(or) 条件2……;
示例:删除student表中年龄小于18岁的用户信息
delete from student where sage < 18;
mysql官网:https://dev.mysql.com/doc/
http://runoob.com:https://www.runoob.com/mysql/
w3cschool:https://www.w3cschool.cn/mysql/
希望本文对你有用
看完文章的朋友不要走,有问题可以给我留言,或者需要相关学习视频也可以留言哦~
#####1、SQL也是一种语言;
2、SQL语句实际是一种操作行为的表达,因此首先要知道SQL的基本操作语法,DDL,DML;
3、要有基本的统计学思想,毕竟SQL在业务中做统计的情况很多,因此分组、最大值、最小值、平均值等都是基础;
4、要知道各个SQL的时间实现方式,时间语法很重要;
5、在此强调要懂得统计学思想,这样,你才能明白某些复杂的统计如何抽丝剥茧实现;
6、学会分步查询,不是所有的查询都要一步到位,实现最终结果,发现相同的部分,实现数据的原子化,借助中间表查询,这样可以降低查询难度,同时又可以提高查询的效率,查询结果的原子化,特别适用于一些每天/每月等才会发生一次变化,或者需要统计的数据的时候,数据原子化可以提高查询效率
#####深入SQL 你先确定你的定位是什么
开发深入学习SQL 就首先达到你能想到就能实现的程度
DBA 优化人员深入学习 应该达到,能看懂别人写SQL 并且通过执行计划找出性能瓶颈且能通过改写或者添加索引等等 达到优化的效果
DA 深入应达到,你设计的表的时候 就应想到这里会发生的SQL大概类型 请大家 关注我 会持续发布数据库相关原创文章
#####学习sql语言就是在学关系型数据库。
第一步要学习数据库的存储方式,以及对数据库表的认识。
第二步要学习数据库设计的三范式。
第三步要学数据库语法增删改查如何编写,关联如何写,子查询如何写。索引,存储过程,视图,触发器等的内容。
第四步要学习不同数据库之间的差别。
#####本人目前在某家商业银行从事数据服务工作,SQL是工作的必备技能,也见证许多同学从不会到精通过程,感受如下:
对新手来讲,我的一贯建议是找一本经典书,好好读一遍,切不可用碎片化学习取代系统学习,不然就会不成体系,缺乏逻辑性。
找前辈之前做过的数据服务,看看每一个数据需求的代码是怎么写的,用了那些技巧和知识点,与书里面的内容相联系,这样既巩固了技术知识,也学习了业务知识,一举两得。如果能发现前辈代码中的问题并适当优化,就更完美了。
由易到难地尝试多个具体的数据需求,编写SQL代码,实现业务逻辑,这样能加深技术理解和业务认知,有助于熟悉数据分布。
有了系统的学习和一定的实操之后,再遇到问题就可以通过碎片化学习等查缺补漏,进行强化。
#####关注大饼说科教,一起聊聊数据、科技、安全、金融的那些琐事。
学SQL还是要多读多写
读,是指要有一套学习辅导书籍或视频教程,我觉得至少要先知道SQL 是做什么的,能够解决什么问题,才是该如何学好。
网上的辅导书籍和视频教程很多,这里推荐我看过的一些比较好的书籍和视频教程
书籍类:
《SQL基础教程》
《SQL必知必会》
这两本应该是写的比较通俗易懂的书籍了,此外一些数据库的安装,操作可以网上搜索一下相关的图文教程,基本上只要你的关键字正确,都可以找到你想要的内容。
视频类
视频类的教程一般网上也有,但是质量参差不齐,有兴趣的可以关注我们的公众号(SQL数据库开发)获取我收藏的一些较好的视频教程。
说完读,下面就是写了
上面这些资料都是为我们写SQL语句作的准备,但是真正要学会SQL 还是要多动手动脑。
SQL 终归还是一门语言,有它固定的语法,这些语法就需要我们去记住。如何记住呢?那就是不停的练习写SQL 代码,并且用SQL 代码解决一些问题,比如每学完一个知识点就去做一道题,这样效果会很好。
此外,凡事都有个过程,学习也不例外,学SQL 如果只是学个皮毛,一周时间就够了。但是真正去解决问题你就会发现无从下手,所以还是要多月多练,并且要养成做笔记的习惯,不会的内容一定要弄懂才进行下一步。
不管是学SQL ,还是学其他东西,我相信方法都类似,只是看你是否坚持下去了。
#####自学的话,找本系统的教材或书籍,搭个SQL运行环境,边看书边实践,很快就入门了;跟老师学的话,就报个班或购买一套实操教程。
#####SQL 教程
SQL 简介
SQL 语法
SQL Select选择
SQL SELECT DISTINCT
SQL 查询子句
SQL 与,或,非
SQL 按关键字排序
SQL 在表中插入
SQL 空值
SQL 更新
SQL 删除
这些简单点的搞定再去学高级的:codingdict.com/article/6947
Demand feedback