mysql笔记: 查询

查询准备

CREATE DATABASE search;

use search;

# 学生表(student):学号、姓名、性别、出生日期、班级

CREATE TABLE student(

sno varchar(20) primary key,

sname varchar(20) not null,

ssex varchar(10) not null,

sbirthday datetime,

class varchar(20)

) character set = utf8;

# 教师表(teacher):编号、姓名、性别、出生日期、职称、所在部门

CREATE TABLE teacher(

tno varchar(20) primary key,

tname varchar(20) not null,

tsex varchar(10) not null,

tbirthday datetime,

prof varchar(20),

depart varchar(20) not null

) character set = utf8;

# 课程表(course):课程号、课程名称、教师编号

CREATE TABLE course(

cno varchar(20) primary key,

cname varchar(20) not null,

tno varchar(20) not null,

foreign key(tno) references teacher(tno)

) character set = utf8;

# 成绩表(score):学号、课程号、成绩

CREATE TABLE score(

sno varchar(20) not null,

cno varchar(20) not null,

degree decimal,

foreign key(sno) references student(sno),

foreign key(cno) references course(cno),

primary key(sno, cno)

) character set = utf8;

show tables;

# 向数据表中添加数据

# 添加学生信息

INSERT INTO student VALUES('101', '曾华', '男', '1977-09-01', '95033');

INSERT INTO student VALUES('102', '匡明', '男', '1975-10-02', '95031');

INSERT INTO student VALUES('103', '王丽', '女', '1976-01-23', '95033');

INSERT INTO student VALUES('104', '李军', '男', '1976-02-20', '95033');

INSERT INTO student VALUES('105', '王芳', '女', '1975-02-01', '95031');

INSERT INTO student VALUES('106', '陆君', '男', '1974-06-03', '95031');

INSERT INTO student VALUES('107', '王尼玛', '男', '1976-02-20', '95033');

INSERT INTO student VALUES('108', '张全蛋', '男', '1975-02-02', '95031');

INSERT INTO student VALUES('109', '赵铁柱', '男', '1974-06-03', '95031');

# 添加教师信息

INSERT INTO teacher VALUES('804', '李诚', '男', '1958-12-02', '副教授', '计算机系');

INSERT INTO teacher VALUES('856', '张旭', '男', '1969-03-12', '讲师', '电子工程系');

INSERT INTO teacher VALUES('825', '王萍', '女', '1972-05-05', '助教', '计算机系');

INSERT INTO teacher VALUES('831', '刘冰', '女', '1977-08-14', '助教', '电子工程系');

# 添加课程表

INSERT INTO course VALUES('3-105', '计算机导论', '825');

INSERT INTO course VALUES('3-245', '操作系统', '804');

INSERT INTO course VALUES('6-166', '数据电路', '856');

INSERT INTO course VALUES('9-888', '高等数学', '831');

# 分数表

INSERT INTO score VALUES('103', '3-245', '86');

INSERT INTO score VALUES('105', '3-245', '75');

INSERT INTO score VALUES('109', '3-245', '68');

INSERT INTO score VALUES('103', '3-105', '92');

INSERT INTO score VALUES('105', '3-105', '88');

INSERT INTO score VALUES('109', '3-105', '76');

INSERT INTO score VALUES('103', '6-166', '85');

INSERT INTO score VALUES('105', '6-166', '79');

INSERT INTO score VALUES('109', '6-166', '81');

INSERT INTO score VALUES('101', '3-105', '90');

INSERT INTO score VALUES('102', '3-105', '91');

INSERT INTO score VALUES('104', '3-105', '89');

查询练习

# 1、查询student表达所有记录

SELECT * FROM student;

# 2、查询student表中的所有记的的sname、ssex和class列

SELECT sname, ssex, class FROM student;

# 3、查询教师所有的单位即不重复的depart列

# distinct 排除重复

SELECT distinct depart FROM teacher;

# 4、查询score表中成绩在60-80之间的所有记录

# between 查询区间

SELECT * FROM score WHERE degree BETWEEN 60 AND 80;

# 预算符比较

SELECT * FROM score WHERE degree > 60 AND degree < 80;

# 5、查询score表中成绩为85、86或88的记录

# 在同一字段表示或关系的查询 IN

SELECT * FROM score WHERE degree IN(85, 86, 88);

# 6、查询student表中'95031'班或性别为'女'的同学记录

# 在不同字段表示或关系的查询 OR

SELECT * FROM student WHERE class='95031' OR ssex='女';

# 7、以class降序查询student表的所有记录

# 升序(asc)和降序(desc),默认是升序

SELECT * FROM student ORDER BY  class DESC;

# 8、以cno升序、degree降序查询score表的所有记录

SELECT * FROM score ORDER BY cno, degree DESC;

# 9、查询'95031'班的学生人数

# 统计 count

SELECT COUNT(*) FROM student WHERE class='95031';

# 10、查询score表中的最高分的学生号和课程号

# 复合子查询

SELECT sno, cno FROM score WHERE degree=(SELECT max(degree) FROM score);

# 11、查询每门课的平均成绩

# GROUP BY分组

SELECT cno, avg(degree) FROM score GROUP BY cno;

# 12、查询score中至少有2名学生选修的并以3开头的课程的平均分数

SELECT cno, avg(degree), count(*) FROM score GROUP BY cno HAVING count(cno) >= 2 and cno like '3%';

# 13、查询分数大于70小于98的sno列

SELECT sno, degree FROM score WHERE degree > 70 AND degree < 90;

# 14、查询所有学生的sname、cno 和 degree列

# 多表查询

SELECT sname, cno, degree FROM student, score WHERE student.sno = score.sno;

# 15、查询所有学生的sno、cname和degree列

SELECT sno, cname, degree FROM course, score WHERE course.cno = score.cno;

# 16、查询所有学生的sname、cname和degree列

SELECT sname, cname, degree FROM student, course, score WHERE student.sno=score.sno AND course.cno=score.cno;

# 17、查询'95031'班学生每门可的平均分

# 子查询 + 分组查询

SELECT cno, avg(degree) FROM score WHERE sno in (SELECT sno FROM student WHERE class='95031') GROUP BY cno;

# 18、查询选修'3-105'课程的成绩高于'109'号同学'3-105'成绩的所有同学记录

SELECT * FROM score WHERE cno = '3-105' AND degree > (SELECT degree FROM score WHERE sno='109' AND cno='3-105');

# 19、查询成绩高于学号为'109'、课程号为'3-105'的成绩的所有记录。

SELECT * FROM score WHERE degree > (SELECT degree FROM score WHERE sno='109' AND cno='3-105');

# 20、查询和学号为108、101的同学同年出生的所有学生的sno、sname和sbirthday列

# year函数与带关键字的子查询

SELECT * FROM student WHERE year(sbirthday) in (SELECT year(sbirthday) FROM student WHERE sno in(108, 101));

# 21、查询'张旭'教师任课的学生成绩。

# 多层嵌套查询

SELECT degree FROM score WHERE cno=(SELECT cno FROM course WHERE tno=(SELECT tno FROM teacher WHERE tname='张旭'));

# 22、查询选修某课程的同学人数多于5人的教师姓名。

# 多表查询

SELECT tname FROM teacher WHERE tno=(SELECT tno FROM course WHERE cno=(SELECT cno FROM score GROUP BY cno HAVING count(*) > 5));

# 23、查询95033班和95031班全体学生的记录。

# in表示或者关系

SELECT * FROM student WHERE class in('95033', '95031');

# 24、查询存在有85分以上成绩的课程cno;

SELECT cno, degree FROM score WHERE degree>85;

# 25、查询出'计算机系'教师所教课程的成绩表。

SELECT * FROM score WHERE cno in(SELECT cno FROM course WHERE tno in(SELECT tno FROM teacher WHERE depart='计算机系'));

# 26、查询'计算机系'与'电子工程系'不同职称教师的tname和prof。

# union 和 not in 的使用

SELECT * FROM teacher WHERE depart='计算机系' and prof not in(SELECT prof FROM teacher WHERE depart='电子工程系')

union

SELECT * FROM teacher WHERE depart='电子工程系' and prof not in(SELECT prof FROM teacher WHERE depart='计算机系');

# 27、查询选修编号'3-105'课程且成绩至少高于选修编号为'3-245'的同学的cno、sno和degree,并按degree从高到低次序排序。

# 至少? 大于其中至少一个,any()

SELECT * FROM score WHERE cno='3-105' AND degree > any(SELECT degree FROM score WHERE cno='3-245') ORDER BY degree DESC;

# 28、查询选修编号为'3-105'且成绩高于选修编号为'3-245'课程的同学的cno、sno和degree。

# 且? all()

SELECT * FROM score WHERE cno='3-105' AND degree > all(SELECT degree FROM score WHERE cno='3-245');

# 29、查询所有教师和同学的name、sex和birthday。

# 别名? as

SELECT tname as name, tsex as sex, tbirthday as birthday FROM teacher

union

SELECT sname, ssex, sbirthday FROM student;

# 30、查询所有女教师和女同学的name、sex和birthday。

SELECT tname as name, tsex as sex, tbirthday as birthday FROM teacher WHERE tsex='女'

union

SELECT sname, ssex, sbirthday FROM student WHERE ssex='女';

# 31、查询成绩比该课程平均成绩低的同学的成绩表。

SELECT * FROM score a WHERE degree < (SELECT avg(degree) FROM score b WHERE a.cno=b.cno);

# 32、查询所有任课教师的tname和depart

SELECT tname, depart FROM teacher WHERE tno in(SELECT tno FROM course);

# 33、查询至少2名男生的班号

SELECT class FROM student WHERE ssex='男' GROUP BY class HAVING count(*) > 1;

# 34、查询student表中不姓'王'的同学记录。

# not like模糊查询取反

SELECT * FROM student WHERE sname not like '王%';

# 35、查询student表中每个学生的姓名和年龄

# 年龄 = 当前年份-出生年份

SELECT sname, year(now()) - year(sbirthday) as 'age' FROM student;

# 36、查询student表中最大和最小的sbirthday日期值。

# max min

SELECT max(sbirthday) as max, min(sbirthday) as min FROM student;

# 37、以班号和年龄从大到小的顺序查询student表中的全部记录

SELECT * FROM student ORDER BY class DESC, sbirthday DESC;

# 38、查询'男'教师及其所上的课程

SELECT * FROM course WHERE tno in(SELECT tno FROM teacher WHERE tsex='男');

# 39、查询最高分同学的sno、cno和degree列

SELECT * FROM score WHERE degree=(SELECT max(degree) FROM score);

SQL的四种连接查询

# 内连接:

# inner join 或 join

# 外连接:

# 1.左连接 left join 或者 left outer join

# 2.右连接 right join 或者 right outer join

# 3.完全外连接 full join 或者 full outer join

# 创建两个表

# Person表:id, name, cardid

CREATE TABLE person(

id int,

name varchar(20),

cardid int

) character set = utf8;

# Card表:id, name

CREATE TABLE card(

id int,

name varchar(20)

) character set = utf8;

INSERT INTO card VALUES(1, '饭卡');

INSERT INTO card VALUES(2, '建行卡');

INSERT INTO card VALUES(3, '农行卡');

INSERT INTO card VALUES(4, '工商卡');

INSERT INTO card VALUES(5, '邮政卡');

INSERT INTO person VALUES(1, '张三', 1);

INSERT INTO person VALUES(2, '李四', 3);

INSERT INTO person VALUES(3, '王五', 6);

# 这两张表并没有创建外键

# 1. inner join查询(内链接)

SELECT * FROM person inner join card on person.cardid = card.id;

# inner join 内联查询,其实就是两张表中的数据,通过某个字段相等,查询出相关数据记录,和join的效果一样

SELECT * FROM person join card on person.cardid = card.id;

# 2. left join查询(左外连接)

SELECT * FROM person left join card on person.cardid = card.id;

# 左外连接会将左边表里面的所有数据取出来,而右边的表数据,如果有相等的就显示,没有的就补null

# left join 等同于 left outer join,下面的结果是一样的

SELECT * FROM person left outer join card on person.cardid = card.id;

# 3. right join查询(右外连接)

SELECT * FROM person right join card on person.cardid = card.id;

# 右外连接会将右边表里面的所有数据取出来,而左边的表数据,如果有相等的就显示,没有的就补null

# 右外连接与左外连接正好相反

# right join 等同于 right outer join,下面的结果是一样的

SELECT * FROM person right outer join card on person.cardid = card.id;

# 4. mysql不支持 full join, 通过左右连接的union来完成

SELECT * FROM person left join card on person.cardid = card.id

union

SELECT * FROM person right join card on person.cardid = card.id;

本文禁止转载或摘编

--

--

--

分享到:

投诉或建议

评论

mysql数据库查询笔记_mysql笔记: 查询相关推荐

  1. MySQL数据库基础到进阶笔记整理包含事务、SQL优化、锁等内容

    写在前面 本文是在学习MySQL数据库时整理的笔记,可供初学者学习 是在https://dhc.pythonanywhere.com/entry/share/?key=12e4a7324f68371d ...

  2. MySQL 数据库 like 语句通配符模糊查询小结

    MySQL 报错:Parameter index out of range (1 > number of parameters, which is 0)--MySQL 数据库 like 语句通配 ...

  3. mysql数据库表的多条件查询

    mysql数据库表的多条件查询 一.select语句基本查询 SELECT 字段1,字段2....FROM 表名[WHERE 条件] [LIMIT N][ OFFSET M] select可以返回多条 ...

  4. MySQL数据库中的多表查询含义以及练习~建议码友们点亮拇指+收藏呐~

    MySQL数据库中的多表查询含义以及练习 一. 多表查询含义 二. 多表查询练习 1. 已知表 2. 需求And代码 一. 多表查询含义 查询语法: select列名列表from表名列表where条件 ...

  5. MySQL数据库C接口的数据查询操作示例

    MySQL数据库C接口的数据查询操作示例 命令行操作 (1)建库建表(已有则不用) 连接MySQL服务器,并登录之.选择某个数据库.假设用户在这个数据库下已有一个表了. (2)查询所有数据的方法 SE ...

  6. MySQL数据库学习教程全套笔记完整版

    [MySQL学习1]SQL语言简介及数据库简介https://www.52txr.cn/2021/mysql1.html 本节大致介绍数据库. [MySQL学习2]MySQL简介及安装和卸载https ...

  7. 【如何通过汉字首字母拼写查询数据】mysql数据库汉字首字母获取查询或通过ES插件elasticsearch-analysis-pinyin进行汉字首拼查询

    一.mysql数据库汉字首字母获取查询 1.汉字提取首字母 get_first_pinyin_char: 此函数是将一个中文字符串的第一个汉字转成拼音字母 (例如:"李"-> ...

  8. MYSQL数据库字段关联_MySQL数据库基础——操作关系表、连接查询

    MySQL数据库基础入门--day11 一.操作关联表 1.关联关系: 关联关系有:多对一.多对多和一对多. 一对一关联关系可以应用在以下几方面: (1)分割具有很多列的表 (2)由于安全原因而隔离表 ...

  9. 您是否也需要用到Visual Studio 2017连接MySQL数据库,请看正文笔记

    开篇 为了开发.net应用程序,选择了Visual Studio 2017开发软件,公司用的数据库是MySQL,所有写了这篇文章记录笔记,方便以后查找. 正文 需要工具(我本地用以下版本): 1.My ...

最新文章

  1. Zabbix监控httpd服务
  2. SAP CRM Survey调查问卷的存储模型
  3. BaseExecutor.query()-从数据库查询
  4. Es6常用方法filter
  5. oracle之 Oracle归档日志管理
  6. 一个完整的机器学习项目在Python中演练
  7. 用深度强化学习玩atari游戏_深度强化学习从入门到大师:以刺猬索尼克游戏为例讲解PPO(第六部分)...
  8. http://download.chinaitlab.com/testdoc/files/8628.
  9. 软件测试自动化测试工具有哪些?常见的自动化工具简介
  10. Windows Server安装 IIS 时报错:刷新服务器管理器时出现意外错 误:无法打开匿名级安全令牌。(异常来自 HRESULT:0x80070543)
  11. Unity3D中隐藏与显示物体的方法
  12. css 动画 抖动,css3动画之上下抖动
  13. 几种常用网页文本编辑器总结
  14. 拉卡拉前三季度净利润7.35亿元 继续保持高速增长态势
  15. pandas中的窗口对象(窗口函数)
  16. Allegro如何添加泪滴操作指导
  17. 视觉SLAM(二):相机与图像
  18. 快乐生活的1000+篇文章总结
  19. 文件扫描-TWAIN,WIA,ISIS,SANE
  20. 盘点PDF文件转Word文档的四种高效率转换方法

热门文章

  1. 「题解」:[BZOJ4558]方
  2. 客户端与服务器之间通信收不到信息——readLine()
  3. 关于vue如何解决数据渲染完成之前,dom树显示问题
  4. XML文件解析之--DOM与SAX
  5. C++查缺补漏,赶紧的
  6. File类的mkdir()与mkdirs()方法的区别
  7. 堆垛机器人编程技巧_机器人智能堆垛的控制方法与流程
  8. Python+django网页设计入门(5):自定义用户注册与登录功能
  9. web前端三大主流框架_web前端三大主流框架
  10. 只可顺守不可逆取书法_坚持练书法10年以上,会怎么样?