1.显示所有库
show databases;
2.选择库
use 库名;
3.显示表
show tables;
4.显示指定库内的表
show tables from 库名;
5.查看当前在那个库
select database();
6.查看表结构
desc 表名;
7.注释
#
--
mysql 创建表
create table 表名(
id int,
name varchar(20)
);
mysql 查询SELECT
1.单字段查询
SELECT `username` FROM upms_user;
2.多字段查询
SELECT `username`,`phone` FROM upms_user;
3.查询所有字段
SELECT * FROM upms_user;
4. SELECT
SELECT 100;
SELECT '100';
SELECT 100%2;
SELECT VERSION();
5.起别名
5.1 方式一,as
SELECT 100%2 as result;
5.2 方式二
SELECT 100%2 result;
5.去除重复 distinct
SELECT DISTINCT `department_id` FROM `employees`;
6.+ 加号的作用 在mysql中只是运算符,不能做拼接
7.数据多个字段拼接使用函数 CONCAT
SELECT CONCAT(str1,str2,...)
8.判断是否为null
SELECT department_id,IFNULL(department_id,1) AS asdepartment from employees;
mysql SELECT条件查询 where
select 查询列表 from 表名 where 筛选条件
分类
一. 按条件表达式筛选
条件运算符:> < = != >= <= <>
二. 按逻辑表达式
逻辑运算符: and or not
Code
1 2 3 4 5 6 7 8 9
-- 按条件表达式筛选 -- 案例一 查询工资> 12000的员工信息 SELECT * FROM employees WHERE salary>12000; -- 案例二 查询部门编号不等于90的员工名和部门编号 SELECT last_name ,department_id FROM employees WHERE department_id<>90; -- 案例三 查询工资在10000到20000之间的员工名,工资,以及奖金 SELECT last_name,salary,commission_pct FROM employees WHERE salary>=10000 AND salary<=20000; -- 案例四 查询部门编号不在90到110之间,或者工资高于15000的员工信息 SELECT * FROM employees WHERE department_id<90 OR department_id>110 OR salary>15000;
三. 模糊查询
命令
说明
like
和通配符(%:任意多个 _:任意单个字符) 配合使用
between and
含义:字段包含在一个区间 特点:包含领界值
in
含义:判断某字段的值是否属于in 列表中的某一项 特点:in列表中的每一项类型必须相同
is null
含义:判断某项字符内容为null的,不能判断null
<=>
<=> 安全等于 等价于 = 可以判断null
1.模糊查询like
Code
1 2 3 4 5 6 7 8
-- 1.查询员工名中包含字符a 的员工信息 SELECT * FROM employees WHERE last_name LIKE '%a%'; -- 2.查询员工名第三个字符中包含字符n第5个包含l的员工信息 SELECT * FROM employees WHERE last_name LIKE '__n_l%'; -- 3.查询员工名中第二个字符为_的员工名 (因为_是通配符需要转义) SELECT * FROM employees WHERE last_name LIKE '_\_%'; -- 3.查询员工名中第二个字符为_的员工名(指定$为转义字符 ESCAPE '$') SELECT * FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$';
2.模糊查询between and
Code
1 2
-- 4 查询部门编号在100到120之间 SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;
3.模糊查询in
Code
1 2 3
-- 5 员工的工种编号是IT_PROG,AD_VP,AD_PRES中的一个员工名和工种编号 SELECT last_name,job_id FROM employees WHERE job_id = 'IT_PROG' OR job_id = 'AD_VP' OR job_id = 'AD_PRES'; SELECT last_name,job_id FROM employees WHERE job_id IN('IT_PROG','AD_VP','AD_PRES');
4.模糊查询is null
Code
1 2 3 4 5 6
-- 6 查询没有奖金的员工姓名和奖金率 SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NULL; -- <=> 安全等于等价于 = 可以判断null SELECT last_name,commission_pct FROM employees WHERE commission_pct <=> NULL; -- 7 查询有奖金的员工姓名和奖金率 SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NOT NULL;
5.排序查询order by
SELECT * FROM employees WHERE ORDER BY [asc(默认可以不写)|desc] order by 子句一般放在查询语句的最后面,除limit子句
Code
1 2 3 4 5 6 7 8 9 10 11 12 13
# 查询员工信息,要求工资从高到底排序 SELECT * FROM `employees` ORDER BY salary DESC; SELECT * FROM `employees` ORDER BY salary; # 案例2 查询部门编号》=90的员工信息,按入职日期的先后排序 SELECT * FROM `employees` WHERE `department_id` >=90 ORDER BY `hiredate` ASC; # 案例3 按年薪的高低显示员工的信息和年薪【按表达式排序】 SELECT *, salary*12*(1+IFNULL(`commission_pct`,0)) 年薪 FROM `employees` ORDER BY `salary`*12*(1+IFNULL(`commission_pct`,0)) DESC; # 案例4 按年薪的高低显示员工的信息和年薪【按别名排序】 SELECT *, salary*12*(1+IFNULL(`commission_pct`,0)) 年薪 FROM `employees` ORDER BY 年薪 DESC; # 案例5 按姓名长度显示员工的信息和工资【按函数排序】 SELECT LENGTH(last_name) AS 字节长度 , last_name,salary FROM `employees` ORDER BY LENGTH(last_name) DESC; # 案例6 查询员工信息,要求先按工资s升序排序,再按员工编号降序排序【按多个字段排序】 SELECT * FROM `employees` ORDER BY salary ASC,`employee_id` DESC;
select LENGTH('john'); SELECT LENGTH('中国'); SHOW VARIABLES LIKE '%char%';
CONCAT(str1,str2,…)
拼接字符串
Code
1
select CONCAT(last_name,'-',first_name) 姓名 from employees;
UPPER(str) 大写,LOWER(str) 小写
大小写转换
Code
1 2
SELECT LOWER('JOHN'); SELECT UPPER('john');
SUBSTR(str FROM pos FOR len),SUBSTRING(str FROM pos FOR len)
截取字符长度 注意索引从1开始
截取从指定索引出后面的所有字符
Code
1
SELECT SUBSTR('截取字符长度注意索引',1) as '截取';
截取从指定索引处指定字符长度的字符
Code
1
SELECT SUBSTR('截取字符长度注意索引',1,5) as '截取';
INSTR(str,substr)
返回子串第一次出现的所在索引 注意:如果找不到返回0
Code
1
SELECT INSTR('截取字符长度注意休息','休息') as out_put;
TRIM([remstr FROM] str)
去空格
Code
1
SELECT LENGTH(TRIM(' 张三 ')) as out_put;
去除前后的指定字符
Code
1
SELECT LENGTH(TRIM('a' from 'aaa张三aaa')) as out_put;
lpad
用指定的字符实现左填充指定的长度
Code
1
SELECT LPAD('张三',10,'$');
rpad
用指定的字符实现右填充指定的长度
Code
1
SELECT RPAD('张三',10,'$');
REPLACE
替换
Code
1
SELECT REPLACE('张三爱上李四','李四','王五') AS out_put;
二.数学函数
ROUND(X)
四舍五入
Code
1 2
SELECT ROUND(4.51); ROUND(1.567,2) 第二个参数保留几位小数
ceil 向上取整,返回>=该的最小整数
Code
1
SELECT CEIL(1.10);
floor 向下取整,返回>= 的最大整数
Code
1
SELECT FLOOR(1.10);
TRUNCATE 截断,第二位保留几位小数
Code
1
SELECT TRUNCATE(1.10,2);
mod 取余
Code
1
SELECT MOD(7,3);
日期函数
now 返回当前系统的日期+时间
Code
1
SELECT NOW();
CURDATE 返回当前系统的日期
Code
1
SELECT CURDATE();
CURTIME 返回当前系统的时间
Code
1
SELECT CURTIME();
可以获取指定的部分,年,月,日,小时,分钟,秒
Code
1 2 3 4 5 6 7
SELECT YEAR(NOW()) AS 年; SELECT YEAR('2020-1-1') AS 年; SELECT MONTH('2020-1-2') AS 月; SELECT DAY('2020-1-2') AS 日; SELECT HOUR(NOW()) AS 小时; SELECT MINUTE(NOW()) AS 分钟; SELECT SECOND(NOW()) AS 秒钟;
STR_TO_DATE(str,format)
将日期格式的字符转换成指定格式的日期
Code
1 2 3
select STR_TO_DATE('2020102','%Y%m%d');
SELECT * from employees WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y');
序号
格式符
功能
1
%Y
四位的年份
2
%y
2位的年份
3
%m
月份(01,02,03….)
4
%c
月份(1,2,3….)
5
%d
日(01,02,03….)
6
%H
小时(24小时)
7
%h
小时(12小时)
8
%i
分钟(00,01,…,59)
9
%s
秒(00,01,…,59)
DATE_FORMAT(date,format)
将日期格式的字符转换成字符串
Code
1
SELECT DATE_FORMAT('2020-1-2','%Y年%m月%d日');
DATEDIFF(expr1,expr2) 两个时间的差
Code
1
SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) FROM employees;
SELECT salary AS 原始工资,`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`;
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 只支持 数值类型并且忽略null max 和 min 支持 任意类型的数值并且忽略null count 忽略null 和 DISTINCT 搭配 实现去重 和分组函数一同查询的字段要求是 group by 后的字段
sum 求和
Code
1
SELECT SUM(salary) FROM employees;
avg 平均值
第二个值保留几位小数
Code
1
SELECT AVG(salary,2) FROM employees;
max 最大值
Code
1
SELECT MAX(salary) FROM employees;
min 最小值
Code
1
SELECT min(salary) FROM employees;
count 计算个数
Code
1
SELECT count(salary) FROM employees;
DISTINCT 搭配 实现去重
Code
1 2
SELECT SUM(DISTINCT salary),SUM(salary) FROM employees; SELECT COUNT(DISTINCT salary) FROM employees;
分组查询
语法:
SELECT 分组函数,列(要求出现在GROUP BY 的后面)
FROM 表
[where 筛选条件]
GROUP BY 分组的列表
[ORDER BY 排序子句]
注意:查询列表必须特殊,要求是分组函数和group by 后出现的字段
查询每个部门的平均工资
Code
1
SELECT AVG(salary) FROM employees GROUP BY department_id;
查询每个工种的最高工资
Code
1
SELECT MAX(salary),job_id FROM employees GROUP BY job_id;
分组查询后筛选 HAVING
查询那个部门的员工数>2
方式1 HAVING 用于 GROUP BY 后面的筛选
Code
1
SELECT COUNT(1) as total ,department_id FROM employees GROUP BY department_id HAVING total>2;
方式2 子查询的实现方法
Code
1
SELECT tatal2.department_id,tatal2.total FROM (SELECT COUNT(1) as total ,department_id FROM employees GROUP BY department_id) as tatal2 WHERE tatal2.total<2;
查询每个有奖金的员工的最高工资>12000的工种编号和最高工资
原始表能查出来的用where 原始表查不出来的用 HAVING
Code
1
SELECT MAX(salary) as _Max,job_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING _Max>12000;
查询领导编号>102 的每个领导手下的最低工资>5000的领导编号是那个,以及最低工资>5000
Code
1
SELECT MIN(salary) as dd,manager_id FROM employees WHERE manager_id>102 GROUP BY manager_id HAVING dd>5000;