由于sql语句不区分大小写,为了书写方便,本文所有命令统一使用小写
往期内容
- day 01 初识Mysql以及DDL数据定义语言
day 02 DML数据操作语言
目录
一、导入练习数据
二、简单查询
三、条件查询
四、排序
五、总结练习
source sql文件路径;
练习数据studydata.sql
链接:https://pan.baidu.com/s/1VTi06D2t1scAnZVFbyJN0w
提取码:ljyx也可以直接到主页---资源 进行下载
导入后会自动创建一个叫studydata的数据库,如果这个数据库存在,会先删除!!!!!
若想保留原有的数据库,可以先进入到studydata.sql,把前三行的studydata(数据库名)改成其他名字。。。
mysql> source C:\Users\me\Desktop\studydata.sql Query OK, 3 rows affected (0.15 sec) ...... Query OK, 0 rows affected (0.00 sec) mysql> show tables; +---------------------+ | Tables_in_studydata | +---------------------+ | t_grade | | t_student | | t_teacher | +---------------------+ 3 rows in set (0.04 sec)
t_grade是成绩等级表
t_student是学生信息表
t_teacher是教师信息表
#三张表的结构 mysql> desc t_grade; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | grade | char(3) | NO | PRI | NULL | | | min | int | YES | | NULL | | | max | int | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 3 rows in set (0.04 sec) mysql> desc t_student; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | stno | int | NO | PRI | NULL | | | stname | varchar(10) | YES | | NULL | | | stsex | char(2) | YES | | NULL | | | stclass | varchar(3) | YES | | NULL | | | stmath | int | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 5 rows in set (0.06 sec) mysql> desc t_teacher; +-------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+-------------+------+-----+---------+-------+ | teno | int | NO | PRI | NULL | | | tename | varchar(10) | YES | | NULL | | | Englishname | varchar(32) | YES | | NULL | | | tesalary | double(7,2) | YES | | NULL | | | teclass | varchar(3) | YES | | NULL | | | hiredate | date | YES | | NULL | | +-------------+-------------+------+-----+---------+-------+ 6 rows in set (0.04 sec)
数据查询语句主要是select语句,select语句只能进行查询,对数据的改变也只反映在查询结果上,不会修改原始数据。
select 字段名1,字段名2,...... from 表名; #查特定字段,多个字段用","隔开
select * from 表名; #查整张表 ,可读性差
#查询学生表的全部信息 mysql> select * from t_student; +------+--------+-------+---------+--------+ | stno | stname | stsex | stclass | stmath | +------+--------+-------+---------+--------+ | 5101 | 赵钱 | 男 | 1班 | 78 | | 5102 | 王五 | 女 | 3班 | 68 | | 5125 | 秋 | 男 | 3班 | 89 | | 5126 | 孙李 | 男 | 3班 | 74 | +------+--------+-------+---------+--------+ 26 rows in set (0.00 sec) #查询教师的姓名 mysql> select tename from t_teacher; +--------+ | tename | +--------+ | 点赞 | | 关注 | | 收藏 | | 订阅 | +--------+ 4 rows in set (0.00 sec)
select 字段名1 as 别名1,字段名2 as 别名2,...... from 表名;
- as只对前一个字段名起别名,多个字段名要用多个as!!!!!!
- as可以省略!!!!!!!
- 别名若是有空格或中文,写成 '别名' 形式!!!!!
(若用双引号,在oracle数据库中会报错,mysql不会报错)
mysql> select teno teacherno, tename as 'teacher name' from t_teacher; +-----------+--------------+ | teacherno | teacher name | +-----------+--------------+ | 9801 | 点赞 | | 9802 | 关注 | | 9803 | 收藏 | | 9804 | 订阅 | +-----------+--------------+ 4 rows in set (0.00 sec)
若该字段的数据类型是数值类型,可以进行数学运算。
#计算各位教师的年薪 mysql> select tename,tesalary*12 as '年薪' from t_teacher; +--------+-----------+ | tename | 年薪 | +--------+-----------+ | 点赞 | 102000.00 | | 关注 | 111600.00 | | 收藏 | 158400.00 | | 订阅 | 105600.00 | +--------+-----------+ 4 rows in set (0.00 sec)
条件查询,即查询符合条件的数据。
select 字段名1,字段名2,字段名3.... from 表名 where 条件;
条件有哪些?
- 只适用于数值型:大于:>,小于:<,小于等于:<=,大于等于:>=
- 数值型、字符型都适用的:不等于:<> 或 !=
#数学成绩大于80分的学生的学号、姓名、数学成绩 mysql> select stno,stname,stmath from t_student where stmath>80; +------+--------+--------+ | stno | stname | stmath | +------+--------+--------+ | 5104 | 钱七 | 93 | | 5107 | 左右 | 88 | | 5110 | 周四 | 94 | | 5112 | 夏 | 82 | | 5114 | 张三 | 87 | | 5115 | 甲乙 | 88 | | 5117 | 前后 | 93 | | 5118 | 周五 | 99 | | 5120 | 冷烬 | 100 | | 5123 | 丙丁 | 91 | | 5125 | 秋 | 89 | +------+--------+--------+ 11 rows in set (0.00 sec) #数学成绩等于100的学生的学号、姓名、数学成绩 +------+--------+--------+ | stno | stname | stmath | +------+--------+--------+ | 5120 | 冷烬 | 100 | +------+--------+--------+ 1 row in set (0.00 sec) #学生名字为'张三' 的的学号、姓名、数学成绩 mysql> select stno,stname,stmath from t_student where stname='张三'; +------+--------+--------+ | stno | stname | stmath | +------+--------+--------+ | 5114 | 张三 | 87 | +------+--------+--------+ 1 row in set (0.00 sec)
两个数值之间
- between …(最小值)and ….(最大值) 包含最小值和最大值
- 字段名 >= 最小值 and 字段名 <= 最大值
#查询数学成绩在75到85之间的所有学生的学号、姓名、数学成绩 mysql> select stno,stname,stmath from t_student where stmath between 75 and 85; +------+--------+--------+ | stno | stname | stmath | +------+--------+--------+ | 5101 | 赵钱 | 78 | | 5109 | 周三 | 77 | | 5112 | 夏 | 82 | | 5113 | 赵六 | 76 | | 5122 | 周二 | 78 | +------+--------+--------+ 5 rows in set (0.00 sec) mysql> select stno,stname,stmath from t_student where stmath >= 75 and stmath <= 85; +------+--------+--------+ | stno | stname | stmath | +------+--------+--------+ | 5101 | 赵钱 | 78 | | 5109 | 周三 | 77 | | 5112 | 夏 | 82 | | 5113 | 赵六 | 76 | | 5122 | 周二 | 78 | +------+--------+--------+ 5 rows in set (0.00 sec)
is null 数据为空
is not null 数据不为空
is 不能用 '=' ,is null 代表什么都没有 !!!!!
#数学成绩为空的学生的学号、姓名、数学成绩 mysql> select stno,stname,stmath from t_student where stmath is null; +------+--------+--------+ | stno | stname | stmath | +------+--------+--------+ | 5116 | 南北 | NULL | +------+--------+--------+ 1 row in set (0.00 sec)
and 并且 ,表示同时满足
# 性别为男,且数学成绩大于80分的学生的学号、姓名、性别、数学成绩 mysql> select stno,stname,stsex,stmath from t_student where stsex='男' and stmath>80; +------+--------+-------+--------+ | stno | stname | stsex | stmath | +------+--------+-------+--------+ | 5107 | 左右 | 男 | 88 | | 5110 | 周四 | 男 | 94 | | 5118 | 周五 | 男 | 99 | | 5120 | 冷烬 | 男 | 100 | | 5123 | 丙丁 | 男 | 91 | | 5125 | 秋 | 男 | 89 | +------+--------+-------+--------+ 6 rows in set (0.00 sec)
or 或者 ,表示满足其中一个
#’1班‘的学生或者数学成绩大于90的学生的学号、姓名、班级、数学成绩 mysql> select stno,stname,stclass,stmath from t_student where stclass='1班' or stmath>90; +------+--------+---------+--------+ | stno | stname | stclass | stmath | +------+--------+---------+--------+ | 5101 | 赵钱 | 1班 | 78 | | 5103 | 上下 | 1班 | 47 | | 5104 | 钱七 | 1班 | 93 | | 5109 | 周三 | 1班 | 77 | | 5110 | 周四 | 2班 | 94 | | 5114 | 张三 | 1班 | 87 | | 5117 | 前后 | 1班 | 93 | | 5118 | 周五 | 2班 | 99 | | 5119 | 春 | 1班 | 73 | | 5120 | 冷烬 | 2班 | 100 | | 5121 | 冬 | 1班 | 54 | | 5123 | 丙丁 | 1班 | 91 | +------+--------+---------+--------+ 12 rows in set (0.00 sec)
and和or同时出现的话,and优先级比or高。
如果同时出现,又先让or先执行,加小括号()
#查询数学成绩高于80分,并且是'1班'或者'3班'的学生的学号、姓名、班级、数学成绩 mysql> select stno,stname,stclass,stmath from t_student where stmath>80 and stclass='1班' or stclass='3班'; +------+--------+---------+--------+ | stno | stname | stclass | stmath | +------+--------+---------+--------+ | 5102 | 王五 | 3班 | 68 | | 5104 | 钱七 | 1班 | 93 | | 5112 | 夏 | 3班 | 82 | | 5114 | 张三 | 1班 | 87 | | 5115 | 甲乙 | 3班 | 88 | | 5116 | 南北 | 3班 | NULL | | 5117 | 前后 | 1班 | 93 | | 5122 | 周二 | 3班 | 78 | | 5123 | 丙丁 | 1班 | 91 | | 5124 | 周六 | 3班 | 58 | | 5125 | 秋 | 3班 | 89 | | 5126 | 孙李 | 3班 | 74 | +------+--------+---------+--------+ 12 rows in set (0.00 sec) mysql> select stno,stname,stclass,stmath from t_student where stmath>80 and (stclass='1班' or stclass='3班'); +------+--------+---------+--------+ | stno | stname | stclass | stmath | +------+--------+---------+--------+ | 5104 | 钱七 | 1班 | 93 | | 5112 | 夏 | 3班 | 82 | | 5114 | 张三 | 1班 | 87 | | 5115 | 甲乙 | 3班 | 88 | | 5117 | 前后 | 1班 | 93 | | 5123 | 丙丁 | 1班 | 91 | | 5125 | 秋 | 3班 | 89 | +------+--------+---------+--------+ 7 rows in set (0.00 sec)
in 包含,相当于多个 or
not in 不包含
select 字段名1,字段名2..... from 表名 where 字段名 in (值1,值2,值3.......);
select 字段名1,字段名2..... from 表名 where 字段名 not in (值1,值2,值3.......);
#成绩为82,87,88,100 的学生的学号、姓名、班级、数学成绩 mysql> select stno,stname,stclass,stmath from t_student where stmath in (82,87,88,100); +------+--------+---------+--------+ | stno | stname | stclass | stmath | +------+--------+---------+--------+ | 5107 | 左右 | 2班 | 88 | | 5112 | 夏 | 3班 | 82 | | 5114 | 张三 | 1班 | 87 | | 5115 | 甲乙 | 3班 | 88 | | 5120 | 冷烬 | 2班 | 100 | +------+--------+---------+--------+ 5 rows in set (0.00 sec)
like 模糊查询,支持%或下划线匹配
%匹配任意多个字符
_下划线:任意一个字符注:匹配字符串’_‘,需要加转义字符'\' 如:%\_%
#找出姓’张‘的? mysql> select stno,stname from t_student where stname like '张%'; +------+--------+ | stno | stname | +------+--------+ | 5114 | 张三 | +------+--------+ 1 row in set (0.04 sec) 找出名字以’四‘结束的? mysql> select stno,stname from t_student where stname like '%四'; +------+--------+ | stno | stname | +------+--------+ | 5105 | 李四 | | 5110 | 周四 | +------+--------+ 2 rows in set (0.00 sec) 找出名字第二个字是’五‘的? mysql> select stno,stname from t_student where stname like '_五%'; +------+--------+ | stno | stname | +------+--------+ | 5102 | 王五 | | 5118 | 周五 | +------+--------+ 2 rows in set (0.00 sec) 找出名字第三个字是’五‘的? mysql> select stno,stname from t_student where stname like '__五%'; Empty set (0.00 sec)
默认升序(asc可以省略):
select 字段名1,字段名2,字段名3....... from 表名 order by 字段名 asc;
降序排列:
select 字段名1,字段名2,字段名3....... from 表名 order by 字段名 desc ;
#按薪水升序排列 mysql> select * from t_teacher order by tesalary; +------+--------+----------+ | teno | tename | tesalary | +------+--------+----------+ | 9801 | 点赞 | 8500 | | 9804 | 订阅 | 8800 | | 9802 | 关注 | 9300 | | 9803 | 收藏 | 13200 | +------+--------+----------+ 4 rows in set (0.00 sec)
按照多个字段排序,会先排第一个,如果第一个序号一样会根据第二个确定顺序
#按成绩升序排列,学号降序排列 mysql> select stno,stname,stmath from t_student order by stmath,stno desc; +------+--------+--------+ | stno | stname | stmath | +------+--------+--------+ | 5116 | 南北 | NULL | ........... | 5117 | 前后 | 93 | | 5104 | 钱七 | 93 | | 5110 | 周四 | 94 | | 5118 | 周五 | 99 | | 5120 | 冷烬 | 100 | +------+--------+--------+ 26 rows in set (0.00 sec)
对成绩在60到100的,并且是1班或者2班的学生的成绩进行降序排列,学号升序排列
mysql> select -> stno,stname,stclass,stmath -> from -> t_student -> where -> (stmath>=60 and stmath <=100) and (stclass='1班' or stclass='2班') -> order by -> stmath desc,stno; +------+--------+---------+--------+ | stno | stname | stclass | stmath | +------+--------+---------+--------+ | 5120 | 冷烬 | 2班 | 100 | | 5118 | 周五 | 2班 | 99 | | 5110 | 周四 | 2班 | 94 | | 5104 | 钱七 | 1班 | 93 | | 5117 | 前后 | 1班 | 93 | | 5123 | 丙丁 | 1班 | 91 | | 5107 | 左右 | 2班 | 88 | | 5114 | 张三 | 1班 | 87 | | 5101 | 赵钱 | 1班 | 78 | | 5109 | 周三 | 1班 | 77 | | 5113 | 赵六 | 2班 | 76 | | 5119 | 春 | 1班 | 73 | | 5111 | 周日 | 2班 | 69 | | 5108 | 周一 | 2班 | 68 | +------+--------+---------+--------+ 14 rows in set (0.00 sec)
未完待续。。。。。。。。。。