重学MySQL(入门)第一篇

跟着尚硅谷视频重新开始学习复习,做个笔记+自我总结

注释语法:

单行注释# 或者--加空格(空格必须有)

多行注释/* */

查询

  基础查询

/*
select 查询列表 from 表名
可以查表中字段/常量值/表达式/函数
查询结果是虚拟表格。并不真实存在
*/

# 查询一个字段
SELECT last_name FROM employees;
# 查询多个字段
SELECT last_name, salary, email FROM employees;
# 查询所有字段
SELECT * FROM employees;

# 查询常量值
SELECT 100;
SELECT 'john';
SELECT 100%98;

# 查询函数
SELECT VERSION();

# 起别名
/*
优点:便于理解;帮助区分重名字段
*/
#方式一
SELECT 100%98 AS 结果;
SELECT last_name AS 姓, first_name AS 名 FROM `employees`;
#方式二
SELECT `last_name` 姓, `first_name` 名 FROM `employees`;
#别名有空格或特殊字符加双引号
SELECT `salary` AS "out put" FROM `employees`;

# 去重:加关键字distinct
SELECT DISTINCT `department_id` FROM `employees`;

# +号作用:只是运算符
# 要想拼接字段,用concat函数
SELECT CONCAT(`last_name`, `first_name`) AS 姓名 FROM `employees`; 

# 显示数据库结构
DESC `departments`;

  条件查询

# 条件表达式筛选:< > = != <> <= >=
#工资>12000的员工信息
SELECT
	*
FROM 
	`employees`
WHERE 
	salary>12000;

# 按逻辑运算符查询: and or not
#查询工资在10000到20000之间的员工名、工资及奖金
SELECT `last_name`, `salary`, `commission_pct`
FROM `employees`
WHERE salary>=10000 AND salary<=20000;

# 模糊查询:
/*
like 和通配符搭配。%任意多个字符,_任意单个字符
between and 包含临界值,顺序不能换
in 
is null
*/
#员工名包含字符’a'的员工信息
SELECT *
FROM `employees`
WHERE `last_name` LIKE '%a%';
#查询员工编号在100到200间的员工信息
SELECT *
FROM `employees`
WHERE `employee_id` BETWEEN 100 AND 200;
#查询员工工种编号是PU_CLERK,ST_MAN,ST_CLERK中一个的员工名和工种编号
SELECT `last_name`, `job_id`
FROM `employees`
WHERE job_id IN ('PU_CLERK', 'ST_MAN', 'ST_CLERK');
#查询没有奖金的员工名和奖金率
SELECT `last_name`, `commission_pct`
FROM `employees`
WHERE `commission_pct` IS NULL;
#安全等于<=>
#查询没有奖金的员工名和奖金率
SELECT `last_name`, `commission_pct`
FROM `employees`
WHERE `commission_pct` <=> NULL;

  排序查询 

/*
语法:order by 排序列表 [asc(升序)|decs(降序)] 默认升序
*/
#查询员工信息,工资由高到低排序
SELECT * FROM `employees` ORDER BY salary DESC;

#按表达式查询:按年薪高低显示员工信息和年薪
SELECT *, salary*12*(1+IFNULL(`commission_pct`,0)) 年薪
FROM `employees`
ORDER BY 年薪 DESC;

#查询员工信息,先按工资排序再按员工编号排序
SELECT *
FROM `employees`
ORDER BY salary ASC, `employee_id` DESC;

  常见函数

字符函数

#length 获取参数值的字节个数
SELECT LENGTH('john');
#cancat 拼接字符串 SELECT CONCAT(`last_name`, '_', `first_name`) 姓名 FROM `employees`;
#upper lower 改变字符串大小写 SELECT CONCAT(UPPER(`last_name`), LOWER(`first_name`)) 姓名 FROM `employees`;
#substr/substring 截取字符串 注:索引从1开始,截取从指定索引处指定字符长度的字符 SELECT SUBSTR("今天天气可真好", 1, 2);
#instr 返回子串第一次出现索引,不存在返回0
#trim 去除前后空格,或前后指定字符 SELECT TRIM('a' FROM 'aaaaaaaa刘诗诗aaaaaaaaaaaaa');
#lpad 用指定字符实现左填充指定长度 SELECT LPAD('刘诗诗', 10, '*') AS out_put;
#rpad 用指定字符实现右填充指定长度
#repalce 替换

数学函数

#round 四舍五入
select round(1.55); #2
select round(1.567, 2); #1.57小数点后保留两位
#roll 向上取整:返回大于等于参数的最小整数
#floor 向下取整
#truncate 截断 select truncate(1.68,1) #mod 取余

日期函数

#now 返回当前系统日期时间
#curdate 返回当前系统日期,不包含时间
#curtime 返回当前系统时间,不包含日期
#可以获取指定部分,年、月、日、小时、分钟、秒 SELECT YEAR(NOW()); SELECT MONTH(NOW()); SELECT MONTHNAME(NOW());
#str_to_date 将日期格式字符转换成指定格式
#date_format 将日期转换成字符

  补充:日期格式

 流程控制函数

#if函数
SELECT IF(10>5, '大', '小');

#case函数
#作用1,switch case效果
SELECT salary, `department_id`,
CASE `department_id`
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM `employees`;
#作用2,类似多重if
SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 工资级别
FROM `employees`;

分组函数

/*
用于统计实用,也称为聚合函数
sum求和,avg平均值,max最大值,min最小值,count计算个数
*/

#简单使用
SELECT SUM(salary) FROM `employees`;

#参数支持类型:sum,avg数值类型;max,min,count任何类型
#都忽略null
#可以和distinct搭配使用
SELECT SUM(DISTINCT salary) FROM `employees`;

#count使用
SELECT COUNT(*) FROM `employees`;#查询总行数
SELECT COUNT(1) FROM `employees`;#添加一列全是1后查询此列1个数也就是查询总行数

#和分组函数一同查询字段有限制,要求是group by后字段

  分组查询

/*
语法:
	select 分组函数,列(要求出现在group by的后面)
	from 表
	【where 筛选条件】
	group by 分组的列表
	【order by 子句】
	【having 复杂条件】
*/

# 简单分组
#查询每个工种最高工资
SELECT MAX(salary), job_id
FROM `employees`
GROUP BY `job_id`;
#查询每个位置上的部门个数
SELECT COUNT(*), `location_id`
FROM `departments`
GROUP BY `location_id`;

# 添加筛选条件
#查询邮箱中包含字符a的每个部门的平均工资
SELECT AVG(salary), `department_id`
FROM `employees`
WHERE email LIKE ('%a%')
GROUP BY `department_id`;

# 添加复杂筛选条件
#查询哪个部门员工个数大于2
SELECT COUNT(*),`department_id`
FROM `employees`
GROUP BY `department_id`
HAVING COUNT(*)>2;

# 按表达式分组
#按员工姓名的长度分组,查看每一组员工个数,筛选员工个数大于5的
SELECT COUNT(*),LENGTH(`last_name`)
FROM `employees`
GROUP BY LENGTH(`last_name`)
HAVING COUNT(*)>5;

# 按多个字段分组
#查询每个部门每个工种的员工平均工资
SELECT AVG(salary), `department_id`, `job_id`
FROM `employees`
GROUP BY `department_id`, `job_id`

  

猜你喜欢

转载自www.cnblogs.com/lunotebook/p/12757623.html
今日推荐