SQL语言在功能上主要分为如下3大类:
(1)DDL(Data Definition Languages、数据定义语言),这些语句定义了不同的数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构。
 主要的语句关键字包括 CREATE、DROP、ALTER等。
 (2)DML(Data Manipulation Language、数据操作语言),用于添加、删除、更新和查询数据库记录,并检查数据完整性。
 主要的语句关键字包括INSERT、DELETE、UPDATE、SELECT等。
 SELECT是SQL语言的基础,最为重要。
 (3) DCL(Data Control Language、数据控制语言),用于定义数据库、表、字段、用户的访问权限和安全级别。
 主要的语句关键字包括 GRANT、REVOKE、COMMIT、ROLLBACK、SAVEPOINT等。
因为查询语句使用的非常的频繁,所以很多人把查询语句单拎出来一类:DQL(数据查询语言)。
还有单独将 COMMIT、ROLLBACK取出来称为TCL(Transaction Control Language,事务控制语言)
题目链接
寻找用户推荐人
错误写法
SELECT name FROM customer WHERE referee_id <> 2 OR referee_id = NULL;
 
正确写法
SELECT name FROM customer WHERE referee_id <> 2 OR referee_id IS NULL;
 
MySQL 使用三值逻辑 —— TRUE, FALSE 和 UNKNOWN。任何与 NULL 值进行的比较都会与第三种值 UNKNOWN 做比较。这个“任何值”包括 NULL 本身!这就是为什么 MySQL 提供 IS NULL 和 IS NOT NULL 两种操作来对 NULL 特殊判断
BETWEEN操作符用于选取介于两个值之间的数据范围值。
 BETWEEN操作符选取介于两个值之间的数据范围内的值。这些值可以是数值,文本或者日期
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2
 
找到学校为北大、复旦和山大的同学进行调研
错误写法
select device_id,gender,age,university,gpa 
from user_profile
where university =('北京大学','复旦大学','山东大学');
 
正确写法
select device_id,gender,age,university,gpa 
from user_profile
where university in('北京大学','复旦大学','山东大学');
 
到gpa在3.5以上(不包括3.5)的山东大学用户 或 gpa在3.8以上(不包括3.8)的复旦大学同学进行用户调研
SELECT device_id, gender, age, university,gpa 
from user_profile 
where (gpa > 3.8 and university = '复旦大学') or (gpa > 3.5 and university = '山东大学')
 
ROUND函数的语法及用法
 (1)语法:round(value,n)
 (2)用法:n表示对某个数值(字段)保留指定n数位数(四舍五入)。
要看一下男性用户有多少人以及他们的平均gpa是多少
男性用户
where gender="male"
 
他们的平均gpa
round(avg(gpa), 1) as avg_gpa
 
合并在一起
select count(gender) as male_num,round(avg(gpa), 6) as avg_gpa
from user_profile where gender="male";
 
select 聚合函数,列(要求出现在group by的后面)
from 表
where 筛选条件
group by 分组的列表
order by 子句
 
查询邮箱中包含a字符的每个部门的平均工资
select max(salary),manager_id 
from employees
where commission_pct is not null
group by manager_id
 
查询每个部门 每个工种的员工平均工资,并且按照平均工资的高低排序
select avg(salary),department_id,job_id 
from employees
where department_id is not null
group by department_id,job_id
order by avg(salary) desc;
 
请分别计算出每个学校 每种性别 的用户数、30天内平均活跃天数和平均发帖数量
select
gender,university,
count(gender)user_num,
avg(active_days_within_30)avg_active_day,	
avg(question_cnt)avg_question_cn
from user_profile
group by gender,university
 
请取出平均发贴数低于5的学校或平均回帖数小于20的 学校
HAVING 往往与 GROUP BY 配合使用,为聚合操作 指定条件
select university,
avg(question_cnt) avg_quesition_cnt,avg(answer_cnt) avg_answer_cnt
from user_profile
group by university
HAVING avg_quesition_cnt < 5 OR avg_answer_cnt < 20  // 指定条件
 
查看不同大学的用户平均发帖情况,并期望结果按照平均发帖情况进行升序排列
group by 比order by先执行
select university,avg(question_cnt) avg_question_cnt
from user_profile
group by university
order by avg_question_cnt ASC
 
返回每个订单号(order_num)各有多少行数(order_lines),并按 order_lines对结果进行升序排序
select order_num,count(order_num) as order_lines 
from OrderItems 
group by order_num
order by order_lines asc;
 
返回名为 cheapest_item 的字段,该字段包含每个供应商成本最低的产品(使用 Products 表中的 prod_price),然后从最低成本到最高成本对结果进行升序排序。
 【示例结果】返回供应商id vend_id和对应供应商成本最低的产品cheapest_item。
select vend_id, min(prod_price) as cheapest_item 
from Products 
group by vend_id 
order by cheapest_item;
 
【where不能使用聚合函数、having中可以使用聚合函数】
返回订单数量总和不小于100的所有订单号,最后结果按照订单号升序排序
SELECT order_num
FROM OrderItems
GROUP BY order_num
HAVING SUM(quantity) >= 100
ORDER BY order_num
 
根据订单号聚合,返回订单总价不小于1000 的所有订单号,最后的结果按订单号进行升序排序。
 提示:总价 = item_price 乘以 quantity
select order_num , sum(item_price*quantity) total_price from  OrderItems group by order_num
having total_price >= 1000
order by order_num asc
 
在每个用户名字后面加上金智秀 用 CONCAT 拼接,同时起别名
select CONCAT(cust_name,'金智秀') as name from customer;
 
1、DISTINCT 需要放到所有列名的前面,如果写成 SELECT salary, DISTINCT department_id FROM employees 会报错。
 2、DISTINCT 其实是对后面所有列名的组合进行去重,你能看到最后的结果是 74 条,因为这 74 个部门id不同,都有 salary 这个属性值。如果你想要看都有哪些不同的部门(department_id),只需要写 DISTINCT department_id 即可,后面不需要再加其他的列名了。
SELECT DISTINCT department_id,salary FROM employees
 
所有运算符或列值遇到null值,运算的结果都为null
 在 MySQL 里面, 空值不等于空字符串。一个空字符串的长度是 0,而一个空值的长度是空。
 而且,在 MySQL 里面,空值是占用空间的。
DESCRIBE sys_user;
或
DESC sys_user;
 
 Field:表示字段名称。
 Type:表示字段类型,这里barcode、goodsname是文本型的,price是整数类型的。
 Null:表示该列是否可以存储NULL值。
 Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示在列中某个给定值允许出现多次。
 Default:表示该列是否有默认值,如果有,那么值是多少。
 Extra:表示可以获取的与给定列有关的附加信息,例如AUTO_INCREMENT等。
语法格式为:LEAST(值1,值2,…,值n)。其中,“值n”表示参数列表中有n个值。
 在有两个或多个参数的情况下,返回最小值。
SELECT LEAST (1,0,2), LEAST('b','a','c'), LEAST(1,NULL,2);
 
语法格式为:GREATEST(值1,值2,…,值n)。其中,n表示参数列表中有n个值。
 当有两个或多个参数时,返回值为最大值。假如任意一个自变量为NULL,则GREATEST()的返回值为NULL。
SELECT GREATEST(1,0,999), GREATEST('b','z','u'), GREATEST(1,NULL,2);
 
分页显式公式:(当前页数-1)*每页条数,每页条数
SELECT * FROM table
LIMIT(PageNo - 1)*PageSize,PageSize;
 
limit n子句表示查询结果返回前n条数据
 offset n表示跳过x条语句
 limit y offset x 分句表示查询结果跳过 x 条数据,读取前 y 条数据
例如:lselect * from student limit m,n;
m 开始值(从第m+1行开始)
n 结束值(1.共展示n行数据;2.第m+n行结尾)
 
判断空值的函数(ifnull)函数来处理特殊情况。
 ifnull(a,b)函数解释:
 如果value1不是空,结果返回a
 如果value1是空,结果返回b
                    上一篇:Hadoop集群安装
                
下一篇:第一讲 递推与递归