MySQL查询操作练习

MySQL查询操作基本语法

     LIMIT、ORDER BY、GROUP BY、HAVING、IN、BETWEEN、WHERE、LEFT\RIGHT、UNION等等


                                                                               sutdent表的定义

字段名

字段描述

数据类型

主键

外键

非空

唯一

自增

Id

学号

INT(10)

Name

姓名

VARCHAR(20)

Sex

性别

VARCHAR(4)

Birth

出生年份

YEAR

Department

院系

VARCHAR(20)

Address

家庭住址

VARCHAR(50)

                                                                                score表的定义

字段名

字段描述

数据类型

主键

外键

非空

唯一

自增

Id

编号

INT(10)

Stu_id

学号

INT(10)

C_name

课程名

VARCHAR(20)

Grade

分数

INT(10)

创建studentscore

1.1 创建student表,SQL代码如下:

CREATE DATABASE class DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

SHOW CREATE DATABASE class;

CREATE  TABLE  student (

id  INT(10)  NOT NULL  UNIQUE  PRIMARY KEY,

name  VARCHAR(20)  NOT NULL,

sex  VARCHAR(4),

birth  YEAR,

department  VARCHAR(20),

address  VARCHAR(50) 

);

1.2 创建score,SQL代码如下:

CREATE  TABLE  score (

id  INT(10)  NOT NULL  UNIQUE  PRIMARY KEY  AUTO_INCREMENT ,

stu_id  INT(10)  NOT NULL ,

c_name  VARCHAR(20) ,

grade  INT(10)

);

student表和score表增加记录

2.1 向student表插入记录的INSERT语句如下:

INSERT INTO student VALUES( 901,'张老大', '男',1985,'计算机系', '北京市海淀区');

INSERT INTO student VALUES( 902,'张老二', '男',1986,'中文系', '北京市昌平区');

INSERT INTO student VALUES( 903,'张三', '女',1990,'中文系', '湖南省永州市');

INSERT INTO student VALUES( 904,'李四', '男',1990,'英语系', '辽宁省阜新市');

INSERT INTO student VALUES( 905,'王五', '女',1991,'英语系', '福建省厦门市');

INSERT INTO student VALUES( 906,'王六', '男',1988,'计算机系', '湖南省衡阳市');

2.2 向score表插入记录的INSERT语句如下:

INSERT INTO score VALUES(NULL,901, '计算机',98);

INSERT INTO score VALUES(NULL,901, '英语', 80);

INSERT INTO score VALUES(NULL,902, '计算机',65);

INSERT INTO score VALUES(NULL,902, '中文',88);

INSERT INTO score VALUES(NULL,903, '中文',95);

INSERT INTO score VALUES(NULL,904, '计算机',70);

INSERT INTO score VALUES(NULL,904, '英语',92);

INSERT INTO score VALUES(NULL,905, '英语',94);

INSERT INTO score VALUES(NULL,906, '计算机',90);

INSERT INTO score VALUES(NULL,906, '英语',85);

 

3 查询操作练习

3.1 查询student表中的所有学生信息

MariaDB [class]> SELECT * FROM student; 
+-----+-----------+------+-------+--------------+--------------------+
| id  | name      | sex  | birth | department   | address            |
+-----+-----------+------+-------+--------------+--------------------+
| 901 | 张老大    | 男   |  1985 | 计算机系     | 北京市海淀区       |
| 902 | 张老二    | 男   |  1986 | 中文系       | 北京市昌平区       |
| 903 | 张三      | 女   |  1990 | 中文系       | 湖南省永州市       |
| 904 | 李四      | 男   |  1990 | 英语系       | 辽宁省阜新市       |
| 905 | 王五      | 女   |  1991 | 英语系       | 福建省厦门市       |
| 906 | 王六      | 男   |  1988 | 计算机系     | 湖南省衡阳市       |
+-----+-----------+------+-------+--------------+--------------------+
6 rows in set (0.00 sec)

 

3.2 查询student表的第2条到4条记录 (LIMIT)

MariaDB [class]> SELECT * FROM student LIMIT 1,3;
+-----+-----------+------+-------+------------+--------------------+
| id  | name      | sex  | birth | department | address            |
+-----+-----------+------+-------+------------+--------------------+
| 902 | 张老二    | 男   |  1986 | 中文系     | 北京市昌平区       |
| 903 | 张三      | 女   |  1990 | 中文系     | 湖南省永州市       |
| 904 | 李四      | 男   |  1990 | 英语系     | 辽宁省阜新市       |
+-----+-----------+------+-------+------------+--------------------+
3 rows in set (0.00 sec)

 #Limit为显示某条数据的后几条,LIMIT(x,y),若为LIMIT(x)则表示显示开头到结尾的x行数据;

MariaDB [class]> SELECT * FROM student LIMIT 1;
+-----+-----------+------+-------+--------------+--------------------+
| id  | name      | sex  | birth | department   | address            |
+-----+-----------+------+-------+--------------+--------------------+
| 901 | 张老大    | 男   |  1985 | 计算机系     | 北京市海淀区       |
+-----+-----------+------+-------+--------------+--------------------+
1 row in set (0.00 sec)

 

3.3 从student表查询所有学生的学号(id)、姓名(name)和院系(department)的信息

MariaDB [class]> SELECT id,name,department FROM student;
+-----+-----------+--------------+
| id  | name      | department   |
+-----+-----------+--------------+
| 901 | 张老大    | 计算机系     |
| 902 | 张老二    | 中文系       |
| 903 | 张三      | 中文系       |
| 904 | 李四      | 英语系       |
| 905 | 王五      | 英语系       |
| 906 | 王六      | 计算机系     |
+-----+-----------+--------------+
6 rows in set (0.00 sec)

 

3.4 student表中查询计算机系和英语系的学生的信息 (IN)

#这么实现显得十分雍肿,而IN后面可以跟着一个列表

MariaDB [class]> SELECT * FROM student WHERE department='计算机系' OR department='英语系';
+-----+-----------+------+-------+--------------+--------------------+
| id  | name      | sex  | birth | department   | address            |
+-----+-----------+------+-------+--------------+--------------------+
| 901 | 张老大    | 男   |  1985 | 计算机系     | 北京市海淀区       |
| 904 | 李四      | 男   |  1990 | 英语系       | 辽宁省阜新市       |
| 905 | 王五      | 女   |  1991 | 英语系       | 福建省厦门市       |
| 906 | 王六      | 男   |  1988 | 计算机系     | 湖南省衡阳市       |
+-----+-----------+------+-------+--------------+--------------------+
4 rows in set (0.01 sec)

MariaDB [class]> SELECT * FROM student WHERE department IN ('计算机系','英语系');
+-----+-----------+------+-------+--------------+--------------------+
| id  | name      | sex  | birth | department   | address            |
+-----+-----------+------+-------+--------------+--------------------+
| 901 | 张老大    | 男   |  1985 | 计算机系     | 北京市海淀区       |
| 904 | 李四      | 男   |  1990 | 英语系       | 辽宁省阜新市       |
| 905 | 王五      | 女   |  1991 | 英语系       | 福建省厦门市       |
| 906 | 王六      | 男   |  1988 | 计算机系     | 湖南省衡阳市       |
+-----+-----------+------+-------+--------------+--------------------+
4 rows in set (0.00 sec)

 

3.5 student表中查询年龄30~35岁的学生信息(BETWEEN)

#BETTWEN为显示30-35岁闭区间的所有人
MariaDB [class]> SELECT id,name,sex,2019-birth AS age1,department,address FROM student WHERE 2019-birth BETWEEN 30 AND 35;
+-----+-----------+------+------+--------------+--------------------+
| id  | name      | sex  | age1 | department   | address            |
+-----+-----------+------+------+--------------+--------------------+
| 901 | 张老大    | 男   |   34 | 计算机系     | 北京市海淀区       |
| 902 | 张老二    | 男   |   33 | 中文系       | 北京市昌平区       |
| 906 | 王六      | 男   |   31 | 计算机系     | 湖南省衡阳市       |
+-----+-----------+------+------+--------------+--------------------+
3 rows in set (0.00 sec)

 

3.6 从student表中查询每个院系有多少人(GROUP BY)

#表示对department进行分组,count()函数对数据进行计数,不建议使用 * 号

MariaDB [class]> SELECT department, COUNT(id) FROM student GROUP BY department;
+--------------+-----------+
| department   | COUNT(id) |
+--------------+-----------+
| 中文系       |         2 |
| 英语系       |         2 |
| 计算机系     |         2 |
+--------------+-----------+
3 rows in set (0.00 sec)

 

3.7 从score表中查询每个科目的最高分 (max() 函数)

MariaDB [class]> SELECT c_name AS Course,max(grade) AS maxgd FROM score GROUP BY c_name;
+-----------+-------+
| Course    | maxgd |
+-----------+-------+
| 中文      |    95 |
| 英语      |    94 |
| 计算机    |    90 |
+-----------+-------+
3 rows in set (0.00 sec)

 

3.8 查询李四的考试科目(c_name)和考试成绩(grade

MariaDB [class]> SELECT c.name,s.c_name,s.grade from student AS c,score AS s WHERE s.stu_id='904' AND c.name='李四';
+--------+-----------+-------+
| name   | c_name    | grade |
+--------+-----------+-------+
| 李四   | 计算机    |    70 |
| 李四   | 英语      |    92 |
+--------+-----------+-------+
2 rows in set (0.00 sec)

#子查询,MySQL在子查询的优化上十分差,数据量大的场景禁用。

MariaDB [class]> SELECT c_name,grade FROM score WHERE stu_id=(SELECT id FROM student WHERE name='李四');
+-----------+-------+
| c_name    | grade |
+-----------+-------+
| 计算机    |    70 |
| 英语      |    92 |
+-----------+-------+
2 rows in set (0.00 sec)

 

3.9 用连接的方式查询所有学生的信息和考试信息(等值连接)

MariaDB [class]> SELECT c.id,name,sex,birth,department,address,c_name,grade FROM student AS c,score AS s WHERE c.id=s.stu_id;
+-----+-----------+------+-------+--------------+--------------------+-----------+-------+
| id  | name      | sex  | birth | department   | address            | c_name    | grade |
+-----+-----------+------+-------+--------------+--------------------+-----------+-------+
| 901 | 张老大    | 男   |  1985 | 计算机系     | 北京市海淀区       | 英语      |    80 |
| 902 | 张老二    | 男   |  1986 | 中文系       | 北京市昌平区       | 计算机    |    65 |
| 902 | 张老二    | 男   |  1986 | 中文系       | 北京市昌平区       | 中文      |    88 |
| 903 | 张三      | 女   |  1990 | 中文系       | 湖南省永州市       | 中文      |    95 |
| 904 | 李四      | 男   |  1990 | 英语系       | 辽宁省阜新市       | 计算机    |    70 |
| 904 | 李四      | 男   |  1990 | 英语系       | 辽宁省阜新市       | 英语      |    92 |
| 905 | 王五      | 女   |  1991 | 英语系       | 福建省厦门市       | 英语      |    94 |
| 906 | 王六      | 男   |  1988 | 计算机系     | 湖南省衡阳市       | 计算机    |    90 |
+-----+-----------+------+-------+--------------+--------------------+-----------+-------+
8 rows in set (0.00 sec)

 

3.10 计算每个学生的总成绩 (SUM( )函数)

MariaDB [class]> SELECT c.id,name,SUM(grade) FROM student AS c,score AS s WHERE c.id=s.stu_id GROUP BY c.id;
+-----+-----------+------------+
| id  | name      | SUM(grade) |
+-----+-----------+------------+
| 901 | 张老大    |         80 |
| 902 | 张老二    |        153 |
| 903 | 张三      |         95 |
| 904 | 李四      |        162 |
| 905 | 王五      |         94 |
| 906 | 王六      |         90 |
+-----+-----------+------------+
6 rows in set (0.00 sec)

 

3.11 计算每个考试科目的平均成绩 ( AVG( )函数)

MariaDB [class]> SELECT c_name,AVG(grade) AS Agrade FROM score GROUP BY c_name;
+-----------+---------+
| c_name    | Agrade  |
+-----------+---------+
| 中文      | 91.5000 |
| 英语      | 88.6667 |
| 计算机    | 75.0000 |
+-----------+---------+
3 rows in set (0.00 sec)

 

3.12 查询计算机成绩最低分的学生信息

MariaDB [class]> SELECT c.name,c_name AS Course,MIN(grade) AS Mgrade FROM student AS c,score AS s WHERE c.id=s.stu_id AND s.c_name='计算机';
+-----------+-----------+--------+
| name      | Course    | Mgrade |
+-----------+-----------+--------+
| 张老二    | 计算机    |     65 |
+-----------+-----------+--------+
1 row in set (0.00 sec)

 

3.13 查询同时参加计算机和英语考试的学生的信息

MariaDB [class]> SELECT a.* FROM student AS a ,score AS b ,score AS c

    -> WHERE a.id=b.stu_id

    -> AND b.c_name='计算机'

    -> AND a.id=c.stu_id

    -> AND c.c_name='英语';
+-----+--------+------+-------+------------+--------------------+
| id  | name   | sex  | birth | department | address            |
+-----+--------+------+-------+------------+--------------------+
| 904 | 李四   | 男   |  1990 | 英语系     | 辽宁省阜新市       |
+-----+--------+------+-------+------------+--------------------+
1 row in set (0.00 sec)

 

3.14 将计算机考试成绩按从高到低进行排序(DESC)

MariaDB [class]> SELECT a.name,b.c_name AS Course,grade FROM student AS a,score AS b WHERE a.id=b.stu_id GROUP BY name HAVING Course='计算机' ORDER BY grade DESC;
+-----------+-----------+-------+
| name      | Course    | grade |
+-----------+-----------+-------+
| 王六      | 计算机    |    90 |
| 李四      | 计算机    |    70 |
| 张老二    | 计算机    |    65 |
+-----------+-----------+-------+
3 rows in set (0.00 sec)

 

3.15 从student表和score表中查询出学生的学号,然后合并查询结果(union)

#union在使用的时候需要注意两张表数据类型一致;

MariaDB [class]> SELECT id FROM student UNION SELECT stu_id FROM score;
+-----+
| id  |
+-----+
| 901 |
| 902 |
| 903 |
| 904 |
| 905 |
| 906 |
+-----+
6 rows in set (0.00 sec)

 

3.16 查询姓张或者姓王的同学的姓名、院系和考试科目及成绩 (LIKE 模糊匹配)

MariaDB [class]> SELECT a.name,department,c_name AS Course,grade FROM student AS a,score AS b WHERE (name LIKE '张% 'OR name LIKE '王%') AND a.id=b.stu_id;
+--------+--------------+-----------+-------+
| name   | department   | Course    | grade |
+--------+--------------+-----------+-------+
| 王五   | 英语系       | 英语      |    94 |
| 王六   | 计算机系     | 计算机    |    90 |
+--------+--------------+-----------+-------+
2 rows in set (0.00 sec)

 

3.17 查询都是湖南的学生的姓名、年龄、院系和考试科目及成绩

MariaDB [class]> SELECT a.name,2019-birth,department,c_name AS Course,grade FROM student AS a,score AS b WHERE a.id=b.stu_id AND address LIKE '湖南%';
+--------+------------+--------------+-----------+-------+
| name   | 2019-birth | department   | Course    | grade |
+--------+------------+--------------+-----------+-------+
| 张三   |         29 | 中文系       | 中文      |    95 |
| 王六   |         31 | 计算机系     | 计算机    |    90 |
+--------+------------+--------------+-----------+-------+
2 rows in set (0.00 sec)

 

3.18 左外连接 (属于等值连接的一种)

Syntax: FROM tb1 LEFT JOIN tb2 ON tb1.co1=tb2.co1;
#表1 的某一字段等于 表2 的某一字段,左表中的每一项都要保证出现,右表中没有对应的等值关系时留NULL表示;RIGHT JOIN反之。

eg. 添加测试数据 学渣,查询未参加考试的学生是谁。

MariaDB [class]> INSERT INTO student VALUES(907,'学渣','男','1998','计算机系','广州市天河区');
Query OK, 1 row affected (0.00 sec)

MariaDB [class]> SELECT * FROM student;
+-----+-----------+------+-------+--------------+--------------------+
| id  | name      | sex  | birth | department   | address            |
+-----+-----------+------+-------+--------------+--------------------+
| 901 | 张老大    | 男   |  1985 | 计算机系     | 北京市海淀区       |
| 902 | 张老二    | 男   |  1986 | 中文系       | 北京市昌平区       |
| 903 | 张三      | 女   |  1990 | 中文系       | 湖南省永州市       |
| 904 | 李四      | 男   |  1990 | 英语系       | 辽宁省阜新市       |
| 905 | 王五      | 女   |  1991 | 英语系       | 福建省厦门市       |
| 906 | 王六      | 男   |  1988 | 计算机系     | 湖南省衡阳市       |
| 907 | 学渣      | 男   |  1998 | 计算机系     | 广州市天河区       |
+-----+-----------+------+-------+--------------+--------------------+
7 rows in set (0.00 sec) 

MariaDB [class]> SELECT a.name,c_name AS Course,grade FROM student AS a LEFT JOIN score AS b ON a.id=b.stu_id;
+-----------+-----------+-------+
| name      | Course    | grade |
+-----------+-----------+-------+
| 张老大    | 英语      |    80 |
| 张老二    | 计算机    |    65 |
| 张老二    | 中文      |    88 |
| 张三      | 中文      |    95 |
| 李四      | 计算机    |    70 |
| 李四      | 英语      |    92 |
| 王五      | 英语      |    94 |
| 王六      | 计算机    |    90 |
| 学渣      | NULL      |  NULL |
+-----------+-----------+-------+
9 rows in set (0.00 sec) 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值