![bf03046cf4e0c8eeee6ee3c13328ea53.png](https://img-blog.csdnimg.cn/img_convert/bf03046cf4e0c8eeee6ee3c13328ea53.png)
学习完数据库的基本概念之后,开始语句的学习。
学习内容
1. 导入示例数据库
2. 查询语句 SELECT FROM
3. 筛选语句 WHERE
5. 分组语句 GROUP BY
6. 排序语句 ORDER BY
7. 函数
8. SQL注释
9. SQL代码规范
1. 导入示例数据库
教程 MySQL导入示例数据库 - MySQL教程™,在上面链接中有示例数据库的下载链接,
Navicat自带导入功能,如下截图所示:
![86c3f287624d2b7309a97ee45d45fc38.png](https://img-blog.csdnimg.cn/img_convert/86c3f287624d2b7309a97ee45d45fc38.png)
右键local,点击运行SQL文件,按步骤操作,成功会显示如下界面:
![f360f8e35c97756a7fd9d1e8df92f7e4.png](https://img-blog.csdnimg.cn/img_convert/f360f8e35c97756a7fd9d1e8df92f7e4.png)
2. 查询语句 SELECT FROM
SELECT是最常用的SQL语句,没有之一,它的用途是从一个或多个表中检索信息,使用SELECT检索信息,至少要给出两条信息:
1、想选择什么信息;
2、从哪里选择信息;
实例
查询一列的数据
SELECT contactLastName FROM customers --contactLastName是列标签,customers是表名
运行结果如下所示,有122条,如下所示:
![2243610505c133227c3880f000fa4937.png](https://img-blog.csdnimg.cn/img_convert/2243610505c133227c3880f000fa4937.png)
利用distinct语句去重
SELECT DISTINCT contactLastName FROM customers -- contactLastName是列标签,customers是表名
该查询语句在contactLastName加上distinct,只会保留唯一值,重复的会去掉,可以看到结果从122条变成108条,如下所示:
![e06c567823e324319d05795d5a1b0b59.png](https://img-blog.csdnimg.cn/img_convert/e06c567823e324319d05795d5a1b0b59.png)
利用limit取前N个语句
SELECT contactLastName FROM customers LIMIT 10 -- contactLastName是列标签,customers是表名
limit后面的数字可以为任意正整数,只要小于表的行数,结果如下:
![fe1fbaa70e2c815e89e36cf94cd6841b.png](https://img-blog.csdnimg.cn/img_convert/fe1fbaa70e2c815e89e36cf94cd6841b.png)
利用CASE...END判断语句
详细参考
mysql操作查询结果case when then else end用法举例www.cnblogs.com4. 筛选语句 WHERE
WHERE 子句配合 SELECT 语句,表示有条件的筛选信息,类似程序语言中的if条件。
where语句常结合运算符、通配符操作,运算符常见有算术运算符、逻辑运算符、比较运算符等。
详细参考:
MySQL(六)之MySQL常用操作符 - 苦水润喉 - 博客园www.cnblogs.com![0128c972ed67d903ba69ce1c027eed89.png](https://img-blog.csdnimg.cn/img_convert/0128c972ed67d903ba69ce1c027eed89.png)
通配符
![0cc339251909d336e45cc9437a7ffd96.png](https://img-blog.csdnimg.cn/img_convert/0cc339251909d336e45cc9437a7ffd96.png)
算术运算符
“+”、“-”、“*”、“/”、“%”分别对应加减乘除求余。
比较运算符
“==”等于、“<=>”安全的等于、“<>(!=)”不等于、“<=”小于等于、“>=”大于等于、“IS NULL”判断一个值是否为NULL、“IS NOT NULL”判断一个值是否不为NULL。
逻辑运算符
NOT或者! 逻辑非
AND或者&& 逻辑与
OR或者|| 逻辑或
XOR 逻辑异或
实例
利用where语句筛选
SELECT contactLastName FROM customers WHERE country = "USA" -- contactLastName是列标签,customers是表名
选取国籍是USA的contactLastName,有36条信息:
![b1887c26c90db027ae3e36c29b6cdd94.png](https://img-blog.csdnimg.cn/img_convert/b1887c26c90db027ae3e36c29b6cdd94.png)
where语句加上AND,多个条件同时满足
SELECT contactLastName FROM customers WHERE country = "USA" AND salesRepEmployeeNumber > 1200-- contactLastName是列标签,customers是表名
选取国籍是USA、salesRepEmployeeNumber > 12的contactLastName,有18条信息:
![5409ccc66eec1abb64ead2b92aaa0ade.png](https://img-blog.csdnimg.cn/img_convert/5409ccc66eec1abb64ead2b92aaa0ade.png)
where语句加上OR、IS NULL
SELECT contactLastName FROM customers WHERE country = "France" OR state IS NULL-- contactLastName是列标签,customers是表名
只要满足一个条件就行,73条数据,如下:
![7d9d3e9934c3d96edf07e0d81384ce93.png](https://img-blog.csdnimg.cn/img_convert/7d9d3e9934c3d96edf07e0d81384ce93.png)
5. 分组语句 GROUP BY
GROUP BY 语句根据一个或多个列对结果集进行分组,可以理解成Excel上的透视表。HAVING子句常常配合GROUP BY使用,和where功能相似,where对行进行筛选,而HAVING则是对分组进行筛序。
MySQL中提供的聚合函数可以用来统计、求和、求最值等等。
分类:
COUNT:统计行数量
SUM:获取单个列的合计值
AVG:计算某个列的平均值
MAX:计算列的最大值
MIN:计算列的最小值
实例
按国家分类,并统计出现的次数
SELECT country,count(*) as num FROM customers GROUP BY country
结果如下,有27个国家:
![8dfc3039f596660be11fb17afc57471c.png](https://img-blog.csdnimg.cn/img_convert/8dfc3039f596660be11fb17afc57471c.png)
利用having语句,统计出现次数大于3的国家
SELECT country,count(*) as num FROM customers GROUP BY country HAVING count(*) > 3
筛选之后,只有8条信息,结果如下:
![5d9baeb8ac6708e9db7db66ecfad8894.png](https://img-blog.csdnimg.cn/img_convert/5d9baeb8ac6708e9db7db66ecfad8894.png)
6. 排序语句 ORDER BY
ORDER BY子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果,常常配合ASC升序、DSEC降序使用。
实例
SELECT country,count(*) as num
FROM customers
WHERE creditLimit > 0
GROUP BY country HAVING count(*) > 3
ORDER BY country DESC ,count(*) ASC
GROUP BY语句常常在WHERE之后,ORDER BY之前,country是降序,国家计数是升序,结果如下:
![7bd11f8ed32185330d38c5d0e6cf72e1.png](https://img-blog.csdnimg.cn/img_convert/7bd11f8ed32185330d38c5d0e6cf72e1.png)
7. 函数
时间函数太多,只选部分函数
SELECT NOW();-- 获得当前日期
SELECT TIME('2017-05-15 10:37:14.123456');-- 获取时间
SELECT YEAR('2017-05-15 10:37:14.123456');-- 获取年份
SELECT MONTH('2017-05-15 10:37:14.123456');-- 获取月份
SELECT DAY('2017-05-15 10:37:14.123456');-- 获取日
SELECT HOUR('2017-05-15 10:37:14.123456');-- 获取时
SELECT FROM_UNIXTIME(1494815834);-- 将时间戳转为具体时间
数值函数
![6f33361277836e28a3e3059e56422e30.png](https://img-blog.csdnimg.cn/img_convert/6f33361277836e28a3e3059e56422e30.png)
字符串函数
![1c0c3d8213a73567cccc65ebda460d44.png](https://img-blog.csdnimg.cn/img_convert/1c0c3d8213a73567cccc65ebda460d44.png)
这一节实例相对简单,不做具体说明。
8. SQL注释
“--”之后的文本属于注释。
SELECT NOW();-- 获得当前日期
“/**/”从/*开始,到*/结束,/*和*/之间的任何内容都是注释
9. SQL代码规范
[SQL编程格式的优化建议] 知行:SQL编程格式的优化建议
[SQL Style Guide] SQL style guide by Simon Holywell
题目一:
数据表如下如图所示,查找重复的电子邮箱
![e3801810946683181a2d50fd402c2501.png](https://img-blog.csdnimg.cn/img_convert/e3801810946683181a2d50fd402c2501.png)
利用HAVING的筛选分组功能
SELECT Email as NUM FROM email GROUP BY Email HAVING count(Email) > 1
输出:
![7151314e8f2a69842942b93363b0cbda.png](https://img-blog.csdnimg.cn/img_convert/7151314e8f2a69842942b93363b0cbda.png)
题目二:
如果一个国家的面积超过300万平方公里,或者(人口超过2500万并且gdp超过2000万),那么这个国家就是大国家。
编写一个SQL查询,输出表中所有大国家的名称、人口和面积。
![cb55bb35604991ec5c1d267be4fff0b4.png](https://img-blog.csdnimg.cn/img_convert/cb55bb35604991ec5c1d267be4fff0b4.png)
利用where和运算符做筛选
SELECT name,population, area FROM world WHERE area > 3000000 OR (population > 25000000 AND gdp > 20000000)
结果如下,和预期一致:
![0fcdb0bae16894f9be7621b482170010.png](https://img-blog.csdnimg.cn/img_convert/0fcdb0bae16894f9be7621b482170010.png)