概述
作为产品经理或者数据分析师,需要从数据库获取和分析数据,知道如何使用 SQL 查看原始数据,可以为你节省大量的精力。虽然每年都有大量数据管理平台出现,但是SQL是绝对的主流和标准,而且大多数平台想要获取更好的发展都在不断增加sql功能,sql是通向数据世界的门户。
SQL简单易学,尤其是查询部分,同时SQL语句接受项集作为输入,返回提交的项集作为输出,这种项集特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使它拥有极大的灵活性和强大的功能。下面表格中关键词应用满足95%以上查询使用。
SQL常用数据类型
常见SQL数据类型的分类及说明
| 数据类型 | 描述 | 分类 | 说明 |
|---|---|---|---|
| Int | 整型 | 数值 | -2147483648 到 2147483647 |
| Bigint | 整型 | 数值 | 常规大型整数数字 |
| Float | 浮点型 | 数值 | 带有浮动小数点的小数 |
| Double | 浮点型 | 数值 | 带有浮动小数点的大数字 |
| Char | 字符型 | 字符串 | 固定长度字符串,一般255 |
| Varchar | 字符型 | 字符串 | 可变长度字符串 |
| Boolean | 布尔型 | 布尔值 | 1 为 TRUE,0 为 FALSE |
| Date | 日期 | 日期时间 | 日期格式:YYYY-MM-DD |
| DateTime | 日期时间 | 日期时间 | 格式:YYYY-MM-DD HH:MM:SS |
| Timestamp | 时间戳 | 时间戳 | 使用 Unix 纪元至今的描述来存储 |
| Blob | 二进制 | 二进制 | 存放二进制数据,大的图像等 |
SELECT查询
学习SQL中最基本也是最重要的SELECT语句,掌握从数据库表中检索数据的技能
查询所有列
基本语法:SELECT 列名1, 列名2, ...FROM 表名;使用 * 号查询表中的所有列
SELECT * FROM student;
查询指定列
只查询需要的特定列
SELECT name, age, department
FROM student;
这个查询只会返回student表中的name、age和grade三列数据
使用列别名
使用AS关键字为列指定别名
SELECT name AS 姓名, age AS 年龄, department AS 院系
FROM student;
使用别名可以让查询结果更易读,AS关键字可以省略
去重查询
使用DISTINCT关键字去除重复数据
SELECT DISTINCT department
FROM student;
这个查询会返回所有不重复的院系值
查询结果限制
使用LIMIT关键字限制查询结果数量,如果只想返回第一行或者一定数量的行,我们需要使用limit关键词,不同数据库关键词不同,sqlserver使用top,oracle使用rownum,比如默认返回结果前5条:指定从哪儿开始以及检索的行数,有的数据库支持offset,这样可以方便的实现分页查询。比如SELECT * FROM student LIMIT 5 OFFSET 3;
SELECT * FROM student LIMIT 5;
这个查询会返回查询结果按默认排序的前五条数据
条件过滤
学习使用WHERE子句对查询结果进行过滤,掌握各种条件运算符的使用方法,查询很多情况下需要根据条件获取相关记录,而不是所有记录,就像excel中的筛选,使用以下语句:
Select * from <表名> where <条件表达式>;
表达式可以是单一条件或者多个条件组合,条件组合通过AND,OR,NOT来表达同时出现、只要有一个出现,不符合该条件出现情况;
WHERE子句
使用WHERE子句过滤查询结果
SELECT * FROM student
WHERE age > 20;
这个查询会返回所有年龄大于20的学生记录
比较运算符
常用的比较运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
| = | 等于 | age = 20 |
| != | 不等于 | grade != '大一' |
| > | 大于 | score > 90 |
| < | 小于 | age < 25 |
| >= | 大于等于 | score >= 60 |
| <= | 小于等于 | age <= 30 |
逻辑运算符
使用AND、OR、NOT组合多个条件
-- AND:所有条件都必须满足
SELECT * FROM student
WHERE age > 18 AND department = '计算机系';
-- OR:满足任一条件即可
SELECT * FROM student
WHERE department = '数学系' OR department = '计算机系';
-- NOT:取反
SELECT * FROM student
WHERE NOT department = '信息系';
BETWEEN范围查询
查询某个范围内的数据
SELECT * FROM student
WHERE age BETWEEN 18 AND 22;
等价于:WHERE age >= 18 AND age <= 22
IN列表查询
查询在指定列表中的数据
SELECT * FROM student
WHERE department IN ('计算机系', '数学系', '信息系');
等价于:WHERE department = '计算机系' OR department = '数学系' OR department = '信息系'
LIKE模糊查询
使用通配符进行模糊匹配
-- % 表示任意多个字符
SELECT * FROM student
WHERE name LIKE '张%';
-- _ 表示单个字符
SELECT * FROM student
WHERE name LIKE '李_';
NULL值判断
判断字段是否为空
-- 查询为空的记录
SELECT * FROM student
WHERE email IS NULL;
-- 查询不为空的记录
SELECT * FROM student
WHERE email IS NOT NULL;
结果排序
默认系统一般都是按照主键ID进行排序,如果我们需要进行结果按照某种规则排序,使用以下ORDER BY关键词,排序分为ASC和DESC两种,升序和降序两种,可以采用多种排序方式组合,按照顺序来表达先按什么条件排序,再按什么条件排序:
Select * from <表名> where <条件表达式> order by <排序表达式> [ASC|DESC], <排序表达式> [ASC|DESC]
按照某个属性排序
使用 ORDER BY对结果中的某个属性排序,同样可以按照列的位置排序,同样的查询使用SELECT * FROM student ORDER BY 3 DESC;
SELECT * FROM student ORDER BY age;
这个查询结果按照age这个字段排序返回
按照多个属性排序
使用 ORDER BY对结果中的多个属性排序
SELECT * FROM student ORDER BY age,sex;
同时可以按照多个列排序,获取所有学生信息按照年龄排序,如果年龄相同按照性别进行排序
选择顺序还是逆序排序
排序可以按照正序,或者逆序,分别用asc和desc关键词来处理。
SELECT * FROM student ORDER BY age DESC;
年龄按照从大到小排序