- 导入示例数据库
首先创建并打开数据库,接着在数据库下执行sql或者将sql语句复制执行sql语句。 - SQL是什么?MySQL是什么?
SQL即结构化查询语言(Structured Query Language),是一种特殊的数据库查询和程序设计语言,用来对数据进行crud。
MySQL是一个关系型数据库管理系统。 - 查询语句 SELECT FROM
语句解释 :查询表达式
去重语句:
select distinct name from A
前N个语句:
select column_name(s) from table_name limit number
CASE…END判断语句:
使用case…end 实现if条件判断
SELECT CASE sva
WHEN 1 THEN '男'
ELSE '女'
END AS ssva
FROM taname
WHERE id = '1'
- 筛选语句 WHERE
语句解释: where语句进行条件查询
运算符/通配符/操作符:
运算符主要有两种–>
一种是使用比较运算符:
主要有:=、>、<、>=、<=、<>、!=、<=>
SELECT goods_name,
goods_price
FROM tdb_goods
WHERE goods_cate = '超级本';
一种是用ANY、SOME 或ALL 修饰的比较运算符:
SELECT goods_id,
goods_name,
goods_price
FROM tdb_goods
WHERE goods_price = any (SELECT goods_price
FROM tdb_goods
WHERE goods_cate = '超级本');
- 分组语句 GROUP BY
聚集函数:
[GROUP BY {col_name | position}] [ASC | DESC],…]
语句解释
查询结果分组,GROUP BY之后加可以加上列名,也可以加上位置参数:
SELECT sex
FROM users
GROUP BY sex;
# 不推荐用位置的方式表示参数
#1不是代表id,是代表SELECT sex....语句中的sex,所以这里的1其实就是sex的意思;
#如果SELECT后面跟多个字段,比如username,sex两个字段,如果你GROUP BY还是希望用sex字段的话,就要用数字2而不是1了,这是因为sex排在username后面
SELECT sex
FROM users
GROUP BY 1;
HAVING子句:对分组附加条件
分组条件语法结构:[HAVING where_condition]
比如对年龄大于35岁的用于进行性别分组:
SELECT sex
FROM users
GROUP BY sex
HAVING age > 35;
但是这样操作会报错,报错的原因是因为HAVING后面的条件只能为聚合函数(比如SUM,MIN,MAX等)或者该条件出现在SELECT中,所以我们可以将SELECT中加入age:
SELECT sex, age
FROM users
GROUP BY sex
HAVING age > 35;
或者使用聚合函数,在这里表示对id数大于等于2的sex进行分组:
SELECT sex
FROM users
GROUP BY sex
HAVING count(id) >=2;
- 排序语句 ORDER BY
语句解释:order by语句对查询结果排序
正序、逆序:
ASC:升序(默认),DESC:降序,
比如我们按照id降序排序:
SELECT *
FROM users
ORDER BY id DESC;
如果对多个字段进行排序时,如果第一个字段可以排出想要的结果,则忽略其他字段,如果不能,则遵守第二个字段,依次类推,比如我们首先按照年龄默认排序,如果其中有同龄的用户,我们可以设置为如果同龄,则按照id降序进行排序:
SELECT *
FROM users
ORDER BY age,id DESC;
- 函数
时间函数
NOW():表示当前日期和时间
SELECT NOW();
+---------------------+
| now() |
+---------------------+
| 2019-02-28 17:25:31 |
+---------------------+
1 row in set
CURDATE():当前日期
SElECT CURDATE();
+------------+
| CURDATE() |
+------------+
| 2019-02-28 |
+------------+
1 row in set
CURTIME():当前时间
SElECT CURTIME();
+-----------+
| CURTIME() |
+-----------+
| 17:26:44 |
+-----------+
1 row in set
DATE_ADD():日期变化
SELECT DATE_ADD('2019-2-28',INTERVAL -365 DAY);
+-----------------------------------------+
| DATE_ADD('2019-2-28',INTERVAL -365 DAY) |
+-----------------------------------------+
| 2018-02-28 |
+-----------------------------------------+
1 row in set
DATEDIFF():日期差值
SELECT DATEDIFF('2019-3-1','2018-2-28');
+----------------------------------+
| DATEDIFF('2019-3-1','2018-2-28') |
+----------------------------------+
| 366 |
+-----------------------
DATE_FORMAT():日期格式化
SELECT DATE_FORMAT('2019-2-28\','%m / %d / %Y ');
+------------------------------------------+
| DATE_FORMAT('2019-2-28','%m / %d / %Y ') |
+------------------------------------------+
| 02 / 28 / 2019 |
+------------------------------------------+
1 row in set
数值函数
CEIL():进一取整(向上取整)
DIV:整数除法
FLOOR():舍一取整(向下取整)
MOD:取余数(取模) (和%等价,同时可以对整数也可以对浮点型取余)
POWER():幂运算,比如2的三次方
ROUND():四舍五入
TRUNCATE():数字截取(不四舍五入)
字符串函数
CONCAT():字符连接
CONCAT_WS():使用指定的分隔符进行字符连接
FORMAT():数字格式化
LOWER():转换成小写字母
UPPER():转换成大写字母
LEFT():获取左侧字符,RIGHT():获取右侧字符
需要两个参数,第一个是从哪个字符串获取,第二个是获取几位:
LENGTH():获取字符串长度
TRIM():删除前导和后续空格
SUBSTRING():字符串截取,一共三个参数,第一个从哪个字符串截取,第二个是从第几个字符开始截取,第三个是截取几位:
REPLACE():字符串替换
- SQL代码规范
[SQL编程格式的优化建议] SQL编程格式的优化建议 - 知乎
作业
项目一:查找重复的电子邮箱(难度:简单)
表数据为
±—±--------+
| Id | Email |
±—±--------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
±—±--------+
通过对Email列分组,分组完后,再对其设置条件,如果count>1则认为是重复:
select *
from email
group by Email
having count(Email) > 1;
项目二:
查找大国(难度:简单)
如果一个国家的面积超过300万平方公里,或者(人口超过2500万并且gdp超过2000万),那么这个国家就是大国家。
编写一个SQL查询,输出表中所有大国家的名称、人口和面积。
表数据为:
+-------------+-----------+---------+------------+-----------+
| name | continent | area | population | gdp |
+-------------+-----------+---------+------------+-----------+
| Afghanistan | Asia | 652230 | 25500100 | 20343000 |
| Albania | Europe | 28748 | 2831741 | 12960000 |
| Algeria | Africa | 2381741 | 37100000 | 188681000 |
| Andorra | Europe | 468 | 78115 | 3712000 |
| Angola | Africa | 1246700 | 20609294 | 100990000 |
+-------------+-----------+---------+------------+-----------+
输出所有大国的名称,人口和面积,可以先想到select name,population,area;接着再考虑加条件,条件为筛选出大国:
select name,population,area
from world as w
where w.population >25000000
and w.gdp>20000000;