sql学习笔记5—查询练习

参考资料来源于Bilibili《一天学会MYSQL数据库》

  • 条件查询
  • 排序
  • 子查询
  • 其它(按所选字段查询、查询数目)

1、准备数据

创建四个表:学生表、教师表、课程表和成绩表。
学生表(学号 姓名 性别 出生日期 所在班级)

CREATE TABLE student(s_no VARCHAR(10) PRIMARY KEY,
                   s_name VARCHAR(20) NOT NULL,
                   s_sex CHAR(2) NOT NULL,
                   s_birth DATETIME NOT NULL,
                   s_class VARCHAR(10) NOT NULL);

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

CREATE TABLE teacher(t_no VARCHAR(10) PRIMARY KEY,
                  t_name VARCHAR(20) NOT NULL,
                  t_sex CHAR(2) NOT NULL,
                  t_birth DATETIME NOT NULL,
                  t_prof VARCHAR(20) NOT NULL,
                  t_depart VARCHAR(20) NOT NULL);

课程表(课程号,课程课程名称,教师编号)

CREATE TABLE course(c_no VARCHAR(10) PRIMARY KEY,
                  c_name VARCHAR(20) NOT NULL,
                  t_no VARCHAR(10),
                 FOREIGN KEY(t_no) REFERENCES teacher(t_no));

成绩表(学号,课程号,成绩)

CREATE TABLE score(s_no VARCHAR(10) ,
                  c_no VARCHAR(10),
                  grade DECIMAL,
                  FOREIGN KEY(s_no) REFERENCES  student(s_no),
                  FOREIGN KEY(c_no) REFERENCES  course(c_no),
                  PRIMARY KEY(s_no,c_no));

向表中添加数据

--学生表数据
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-10','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-10','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');

2、查询练习

a.查询表中所有或者部分字段的数据
SELECT * FROM 表名;(所有字段)
SELECT 字段1,字段2,字段3... FROM 表名

SELECT s_no,s_name,s_sex from student;
--返回结果
+------+--------+-------+
| s_no | s_name | s_sex |
+------+--------+-------+
| 101  | 曾华   | 男    |
| 102  | 匡明   | 男    |
| 103  | 王丽   | 女    |
| 104  | 李军   | 男    |
| 105  | 王芳   | 女    |
| 106  | 陆军   | 男    |
| 107  | 王尼玛 | 男    |
| 108  | 张全蛋 | 男    |
| 109  | 赵铁柱 | 男    |
+------+--------+-------+

b.查询表中不重复的字段
SELECT DISTINCT 字段名 FROM 表名;(使用关键字DISTINCT)

SELECT DISTINCT  t_depart FROM  teacher;
--返回结果
+------------+
| t_depart   |
+------------+
| 计算机系   |
| 电子工程系 |
+------------+

c.查询值在某一范围内的记录
SELECT 字段名 FROM 表名 WHERE 值的条件;
值的条件:

  • 逻辑运算符
  • BETWEEN AND
  • IN 值的取值集合
SELECT * FROM score WHERE grade BETWEEN 60 AND 80;
--between and 包含边界
--result
+------+-------+-------+
| s_no | c_no  | grade |
+------+-------+-------+
| 105  | 3-245 |    75 |
| 105  | 6-166 |    79 |
| 109  | 3-105 |    76 |
| 109  | 3-245 |    68 |
+------+-------+-------+

也可以

SELECT * FROM score WHERE grade < 60 AND grade >80;
SELECT * FROM score WHERE  grade in (76,79);

d.按所选字段值升序或者降序排列
SELECT 字段名 FROM 表名 ORDER BY 选中的字段 DESC(ASC);

SELECT * FROM student ORDER BY s_class DESC;
--result
+------+--------+-------+---------------------+---------+
| s_no | s_name | s_sex | s_birth             | s_class |
+------+--------+-------+---------------------+---------+
| 101  | 曾华   | 男    | 1977-09-01 00:00:00 | 95033   |
| 103  | 王丽   | 女    | 1976-01-23 00:00:00 | 95033   |
| 104  | 李军   | 男    | 1976-02-20 00:00:00 | 95033   |
| 107  | 王尼玛 | 男    | 1976-02-20 00:00:00 | 95033   |
| 102  | 匡明   | 男    | 1975-10-02 00:00:00 | 95031   |
| 105  | 王芳   | 女    | 1975-02-10 00:00:00 | 95031   |
| 106  | 陆军   | 男    | 1974-06-03 00:00:00 | 95031   |
| 108  | 张全蛋 | 男    | 1975-02-10 00:00:00 | 95031   |
| 109  | 赵铁柱 | 男    | 1974-06-03 00:00:00 | 95031   |
+------+--------+-------+---------------------+---------+

以字段1升序,字段2降序
SELECT 字段名 FROM 表名 ORDER BY 字段1 ASC, 字段2 DESC;

SELECT * FROM score ORDER BY c_no ASC, grade DESC;
--result
+------+-------+-------+
| s_no | c_no  | grade |
+------+-------+-------+
| 103  | 3-105 |    92 |
| 105  | 3-105 |    88 |
| 109  | 3-105 |    76 |
| 103  | 3-245 |    86 |
| 105  | 3-245 |    75 |
| 109  | 3-245 |    68 |
| 103  | 6-166 |    85 |
| 109  | 6-166 |    81 |
| 105  | 6-166 |    79 |
+------+-------+-------+

e.查询符合某个字段的记录数目
SELECT COUNT(*) FROM 表名 WHRER 条件;
查询班级为”95031”的学生人数;

SELECT COUNT(*) FROM student WHERE s_class='95031';
--result
+----------+
| COUNT(*) |
+----------+
|        5 |
+----------+

f.子查询
查询score表中成绩最高分的学生学号

SELECT s_no FROM score WHERE grade=(SELECT MAX(grade) FROM score);
--result
+------+
| s_no |
+------+
| 103  |
+------+

上述语句select max(grade) from score 可能会出现一个问题,即最大值有两个及以上,为了避免这种现象,我们可以用limit x,y限制查询记录的个数。
如:

SELECT s_no, c-no FROM score ORDER BY grade LIMIT 0,1;
--result
+------+-------+
| s_no | c_no  |
+------+-------+
| 109  | 3-245 |
+------+-------+
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351