![45393a0ba6fc409581715a527f4d3df4.png](https://i-blog.csdnimg.cn/blog_migrate/900dec1f3ebfd4c43524b6fee52760b6.jpeg)
每天早起或者睡前听一首温柔而美好的音乐,是一件很幸福的事情,无论你是否懂音乐,它都能带你发现生活中的隐藏的那些美好,今天我们先来一起欣赏Mindy Gledhill的单曲《California》,每次我听到这首歌,都有一种吃了彩虹蛋糕一样的感觉,仿佛真的听见歌手轻轻在问:你曾去过加利福尼亚州吗?见过那里独特的景致和友好的人们吗?置身在宁静的海边小镇,吹拂着淡淡清甜的海风。闭眼又如飞驰在漫漫花海,徜徉于童话般的琉璃梦境。车内盈满了花香,盈满了夕阳,闪灼着鎏金色的轻柔的光。我曾经很想做的是,和你在从容闲适的旅行中度过白驹过隙的一生。听完了,你有没有感觉很愉悦,放松?放松过后,我们一起来开始今天的学习吧!
在上一文章里,我们学习了SQL的书写规则,以及用insert语法往表中插入数据,你还记得吗?我们一起再来回顾一下:
书写规则:
- SQL语句以英文分号(;)结尾;
- 输入列名时不能加单引号,列名间也不能有空格;
- SQL语句不区分关键字的大小写(如SELECT=select,INSERT=insert等);
- SQL语句输入符号时只能在英文状态下。
insert语句:
INSERT INTO tablename(列名…) VALUES(列值);
- 数字类型的值不需要用单引号引起来
- 字符和日期类型数据需要用单引号引起来
- 输入值的顺序必须与在表中定义的顺序或者在表名后列出的列的顺序相同
今天我们将学习如何用select语句实现简单查询,现在打开你的Navicat客户端,按照昨天说的方法,在“school”数据库中新建一个查询,准备好了吗?Ready go!
1.基本的查询语句
select:
Select 列名1,列名2,…… -- select子句,用来查询指定要显示的字段;如果是要查看所有的列,则用*表示From 表名 -- from 子句,选择要查询的表
例如:老板要求你从学生表中查询出“姓名”,和“性别”2列数据,按照上面说的规则,我们用select查询指定字段:
Select 姓名,性别 -- 查询指定要显示的字段,如果是要查看所有的列,则用*表示FROM student; -- 选择要查询的表
运行,查询结果:
![d1bb220de7199057d0118447749331bb.png](https://i-blog.csdnimg.cn/blog_migrate/484564f4686523659ae29ba5a488cb3f.jpeg)
而如果我们把列名用*表示,则显示所有列。
as:
那如果老板让你在查询结果中给列设定一个别名,要怎么做呢?这里,我们用as设定别名,如我们把上面查询结果里面的“姓名”字段设定别名为“name”,性别字段设定别名为“人类性别”,则:
Select 姓名 as name ,性别 as '人类性别' -- 用as设定别名FROM student;
![7dd1eeb1984f062e7c7aa5dea2f20a3e.png](https://i-blog.csdnimg.cn/blog_migrate/f4a59a981cc9e20f1c62f86948b08adc.jpeg)
distinct:
假设老板有点奇葩,说我想要看学生里一共有多少个不同的名字?那我们就要用distinct来删除重复数据了。
Select DISTINCT 姓名 -- 用distinct删除重复数据FROM student;
![747083ae64b115d8de0bcf5c70376e29.png](https://i-blog.csdnimg.cn/blog_migrate/3d66963a228713c8f2e3f94ebfa73cbb.jpeg)
数据出来,老板也觉得自己有点奇葩,于是让你删除姓名和学号都重复的数据。此时,我们就是把distinct用在多列之间,用来删除多列信息完全重复的数据。
Select DISTINCT 学号,姓名 -- 用distinct删除两列信息完全重复的数据FROM student;
![ac8e7b2f3eb7830f3b0c89b980e54469.png](https://i-blog.csdnimg.cn/blog_migrate/31f5bd9f7223945d623bcad17082795c.jpeg)
由于两名名为“猴子”的学生,学号不一样,所以我们可以看到这两条信息并没有被去重。
2.指定查询条件的查询
where:
现在,老板让你选取“姓名”列里值为“猴子”的行,用select的字段筛选就解决不了了,这时,我们就要用where语句进行条件查询:
Select 姓名,学号 -- 用distinct删除两列信息完全重复的数据FROM studentwhere 姓名='猴子'; -- 限制条件,用于各种过滤条件,例如:大于,小于等
![43bc886e79f6e0f762e2cb6a6d0f1263.png](https://i-blog.csdnimg.cn/blog_migrate/5e6351a5301c3856206be879d94c6066.jpeg)
这次我们运行了3条语句,我们来看一下上面语句的运行顺序,要注意在SQL中,实际运行顺序和你的输入顺序是不一样,像这三语句就是按如下顺序进行的:
- from student -- 从那张表中查找数据;
- where 姓名='猴子'; -- 用where查询出符合条件的行(记录);
- select 姓名,学号 -- 从查询出的行中筛选出select语句指出的列,一般是最后运行,返回查询结果
3.注释和SQL语句的注意事项
你可能会问,前面那么多条语句后面都写了语句的注释,是怎么做的呢?很简单,注释分为单行注释和多行注释:
单行注释:
就像我前面写的,在语句后面输入“--”+空格”,后面就可以添加注释内容了,注意:一定不要忘了在小横线后面加空格哦!
![f6d6bea10e8ffe98d54011970971f029.png](https://i-blog.csdnimg.cn/blog_migrate/5a299f42410df0d444442ed1fd488706.jpeg)
多行注释:
注释用“/*”开始,用“*/”结尾。
![27bf41a54bdb178dffa1e9fd50fb4366.png](https://i-blog.csdnimg.cn/blog_migrate/4657713a5a4c7f15a6224bde14b63915.jpeg)
学会了注释,以后在写复杂的SQL语句时,要养成添加注释的好习惯哦,方便自己回顾,也方便其他需要看你的语句的同事,你好我好大家好!
SQL语句的注意事项:用英文符号,子句之间不要空行,要和前面的书写规则一起记住了哦!
![b2b9f0ef99dee178ddae6511f42f9638.png](https://i-blog.csdnimg.cn/blog_migrate/9f99cce3d311a924e1417e6a0da3849b.jpeg)
4.运算符
我们在做条件查询时,常会用“大于”,“等于”,“包含”“或者”等等查询条件,这时就要用到运算符了,常用的运算符包括以下三种:
算术运算符:四则运算所使用的运算符(+、-、 *、 /)称为算术运算符。 就是使用其两边的值进行四则运算或者字符串拼接、数值大小比较等运算,并返回结果的符号(注:和null进行算术运算返回结果全部为null),例如,老板要你算出每名学生的百分比成绩
-- 算出每名学生的百分比成绩Select 学号,成绩,成绩/100 as '百分比成绩'FROM score
![cec950944df08b1aa84c0610b4bb524e.png](https://i-blog.csdnimg.cn/blog_migrate/8a5d99aa36be4945f5ceb21d91f0bb25.jpeg)
比较运算符:
![67adc8dabfa0afcfac262a6951f0205a.png](https://i-blog.csdnimg.cn/blog_migrate/f7c2c4716fcb66c27ae7575b49a57a49.jpeg)
注意:
- 比较运算符也可以对日期进行比较,
- 不能对NULL使用比较运算符, 因此, SQL提供了专门用来判断是否为 NULL 的 IS NULL 运算符。 反之, 希望选取不是 NULL 的记录时,需要使用 IS NOT NULL 运算符
例如老板要你查找出成绩低于60分的学生:
-- 成绩低于60分的学生Select 学号,成绩FROM scoreWHERE 成绩<60;
![ba44958945ac3e779fe49f5b5d3c7163.png](https://i-blog.csdnimg.cn/blog_migrate/ca254ab47b035113f332b89787a3dfa2.jpeg)
接下来,查找出生日期早于1990-01-01的学生:
-- 成绩低于60分的学生Select 姓名,出生日期FROM studentWHERE 出生日期
![7918a62540ec9c5a99a0fe7261845ad4.png](https://i-blog.csdnimg.cn/blog_migrate/14b9cc3c53aea159d31cf952e0633c65.jpeg)
对于字符串的比较,从左向右 根据asc码比较,不是先转成数字后比较的,所以会出现'10'
对于空值的判断如:分别选出“教师姓名”为null和不是null的数据:
-- 选出教师姓名是null的数据Select 教师号,教师姓名FROM teacherWHERE 教师姓名 is null;
![970e01c44d6e1fd3d3c565135e3d3ff7.png](https://i-blog.csdnimg.cn/blog_migrate/77fdae16c6778a49394cc0ea5f449d35.jpeg)
-- 选出教师姓名是null的数据Select 教师号,教师姓名FROM teacherWHERE 教师姓名 is not null;
![9cff4df054f8e33674d9200a81e31471.png](https://i-blog.csdnimg.cn/blog_migrate/c8991ad3f526daf470b04d39470b943b.jpeg)
逻辑运算符:
![7ca34767437b158877c35bcf36ffe330.png](https://i-blog.csdnimg.cn/blog_migrate/bc0ca0553ba0a0e71ae168eea58b47e3.jpeg)
例如在score表中找出成绩小于60的学生,就可以有如下两种方法:
-- 运用算术运算符查找出成绩小于60的数据Select 学号,成绩FROM scoreWHERE 成绩<60;-- 运用逻辑运算符查找出成绩小于60的数据Select 学号,成绩FROM scoreWHERE NOT 成绩>=60;
![0b114b305d7688cb39c9933dd8502972.png](https://i-blog.csdnimg.cn/blog_migrate/2491411ead7ec0375b506af0f1752575.jpeg)
同样的查找出成绩>=60且成绩<=90的学生,如下:
-- 用and查找出成绩>=60且成绩<=90的数据Select 学号,成绩FROM scoreWHERE 成绩>=60and 成绩<=90;-- 用between查找出成绩>=60且成绩<=90的数据Select 学号,成绩FROM scoreWHERE 成绩 BETWEEN 60 AND 90;
![f74f1fd500e09193fd816610c932058b.png](https://i-blog.csdnimg.cn/blog_migrate/0a53380d1b5d1001ab6b3e80252d1ad3.jpeg)
查找出成绩小于60或大于90的学生数据:
-- 用or查找出成绩小于60或大于90的学生数据SELECT 学号,成绩FROM scoreWHERE 成绩<60or 成绩>90;
![1dcd6c639e26499ea8d3fad58d7d4ebe.png](https://i-blog.csdnimg.cn/blog_migrate/3615de9fee540c61b4d120bb836bdfc7.jpeg)
查找出性别是“男”并且姓名是“猴子”或者“马云”的数据:
-- 用or查找出性别是“男”并且姓名是“猴子”或者“马云”的数据Select 姓名,性别FROM studentWHERE 性别='男'AND (姓名='猴子'or 姓名='马云');
![a67416f17ddc6920d8a50e7cbf59785e.png](https://i-blog.csdnimg.cn/blog_migrate/aa182ebfa38beee79700267a6cb6a8c1.jpeg)
查找出姓名是(不是)“猴子”和“马云”的数据:
-- 用in查找出姓名为“猴子”和“马云”的数据SELECT *FROM studentWHERE 姓名 in('猴子','马云');-- 用not in查找出姓名不是“猴子”和“马云”的数据SELECT *FROM studentWHERE 姓名 not in('猴子','马云');
![a1b1800a86928a841596d2490dab8cc6.png](https://i-blog.csdnimg.cn/blog_migrate/eadadb4f6a7a2e6b0b57bccb6e16e9d5.jpeg)
![9326a376db11e90c4d6a49a278fa3c67.png](https://i-blog.csdnimg.cn/blog_migrate/bf4cacee4733aab309c6214b8c645015.jpeg)
从这里我们可以看出:in实际上可以看成是or的简便写法。
5.字符串模糊查询
我们使用like语句运用通配符进行模糊查询:
- % :表示任意长度的字符串,长度可以为0;例如:like ‘a%b’,以a开头,b结尾任意长度的内容;
- _:一个下划线就表示一个字符;例如:like ‘a_b’,以a开头,b结尾任意长度为3个字符的内容。
查询姓“猴”的学生名单:
-- 查找姓"猴"的学生名单SELECT *FROM studentWHERE 姓名 LIKE '猴%';
![b1a4d37466a1fffb688c4826a84cad8d.png](https://i-blog.csdnimg.cn/blog_migrate/48ad26d2b45b45433f689467a7172329.jpeg)
查询姓名中最后一个字是“猴”的学生名单(返回结果为没有符合条件的):
-- 查询姓名中最后一个字是“猴”的学生名单SELECT *FROM studentWHERE 姓名 LIKE '%猴';
![245c42115f53e347f2137ef0e364058f.png](https://i-blog.csdnimg.cn/blog_migrate/0823c9a8932e1e04171ea7460885d40a.jpeg)
查询姓名中带“猴”的学生名单:
-- 查询姓名中带“猴”的学生名单SELECT *FROM studentWHERE 姓名 LIKE '%猴%';
![d5dd0063b8aa8e51a8b4ed619f5f64cc.png](https://i-blog.csdnimg.cn/blog_migrate/27385de2a099918f7d354171026fe80e.jpeg)
查询姓“王”的学生名单,并且姓名为3个字的:
-- 查询姓“王”的学生名单,并且姓名为3个字的SELECT *FROM studentWHERE 姓名 LIKE '王__';
![9a56e33cec240335b4d8b9958083e649.png](https://i-blog.csdnimg.cn/blog_migrate/5c0ed5ca57238a830927eec455cc4cfd.jpeg)
好啦,今天的主要知识就学习到这里了,你学会了吗?下面,让我们一起去SQLZOO完成一些练习题吧! 网址:https://sqlzoo.net/
![519fa5bea185e2598935a15e09e1f5af.png](https://i-blog.csdnimg.cn/blog_migrate/18fe3c3673dc58932ea152a3a1d2df1d.jpeg)
select basics:
![dac623d5b59ceeda1cd5c966ddf8611c.png](https://i-blog.csdnimg.cn/blog_migrate/583de1ec37714fdbb3b2e2bfd10dc3b7.jpeg)
![380e740e190506bd1d827823e7322baf.png](https://i-blog.csdnimg.cn/blog_migrate/d45792d7f45480338525c81fc527c4b9.jpeg)
![9cc3d74880f2b55ff1d4800ab4184152.png](https://i-blog.csdnimg.cn/blog_migrate/c871a61fa6525ae4cf97de5bbccf128f.jpeg)
select from world:
![98da1348e89443c54b1370ee9c9671f2.png](https://i-blog.csdnimg.cn/blog_migrate/dbc23f7a19b132f61d54ddb3b03242b1.jpeg)
![c5f7b9aef2d718844e3d60425a6e6586.png](https://i-blog.csdnimg.cn/blog_migrate/9d0ef0e91f9f11fa98a255bc911fff6b.jpeg)
![cfb04ed01ef58169b527ab3bd3355519.png](https://i-blog.csdnimg.cn/blog_migrate/7b4e0db8a0ea1943554593f0f8387025.jpeg)
![9f88961027694b02c7a96d2cd640e0bc.png](https://i-blog.csdnimg.cn/blog_migrate/63c18ddc5791fde6dfc791d8f1e3d2af.jpeg)
![d9b51c8f349ab64c13299e61c3ab3ce8.png](https://i-blog.csdnimg.cn/blog_migrate/0126fb67a0eb06934e928d5c7a6bc340.jpeg)
![83c69d98186dfef9686c608a51ea9f8a.png](https://i-blog.csdnimg.cn/blog_migrate/f86526c36ae64cae37234bb9b7a93e85.jpeg)
![905c723114b3d375e67749b8fdbee800.png](https://i-blog.csdnimg.cn/blog_migrate/1d177c66040904090127b1f5751e40c8.jpeg)
![3361138a5c836b937469a29ec149dbc9.png](https://i-blog.csdnimg.cn/blog_migrate/c7fa0ce585b4a01c0bac81cf95c945c2.jpeg)
![3b74c03b998ba78a6655dbb76ace5de9.png](https://i-blog.csdnimg.cn/blog_migrate/11d3ddbeeb87c5cebf1be14211c6fe88.jpeg)
其中用到了ROUND() 函数,ROUND 函数用于把数值字段舍入为指定的小数位数,语句如下
SELECT ROUND(column_name,decimals) FROM table_name -- column_name为要舍入的字段,decimals为规定要返回的小数位数。
- ROUND(7253.86, 0) -> 7254
- ROUND(7253.86, 1) -> 7253.9
- ROUND(7253.86,-3) -> 7000
![d701c132dbb36b7151762c99f2afe75c.png](https://i-blog.csdnimg.cn/blog_migrate/fc1437c911067058bea48bca92f007d3.jpeg)
![f41a3f79bc4df16f5e1678aa54ec6170.png](https://i-blog.csdnimg.cn/blog_migrate/1edb5e81db76179fac50516766f3ed3e.jpeg)
length(str):查询字符串长度
![7646c7722ff7427c5a4e765648f29132.png](https://i-blog.csdnimg.cn/blog_migrate/b412d72d4bbe3cbd9e89a365a1ad551d.jpeg)
left(a,b)函数表示的是从字符表达式最左边一个字符开始返回指定数目的字符.若 b 的值大于 a 的长度,则返回字符表达式的全部字符a.如果 b 为负值或 0,则返回空字符串.
![2b732f691f9ea2ab55d995c9ca555794.png](https://i-blog.csdnimg.cn/blog_migrate/e0e07af4979f77fe5a7140c24a073b7a.jpeg)
这么多练习题终于做完啦,里面涉及到了一些函数,后面还会再详细讲,最后,看一张思维导图,我们一起回顾一下今天学习的内容:
![640a0f6c8a36b3d07d57afa50ce45123.png](https://i-blog.csdnimg.cn/blog_migrate/ad8eaf432bc4956ca178077caa206876.jpeg)
好啦,记得多加练习,下一次我们将学习如何利用SQL进行汇总分析,see you next time!