avatar

目录
mysql从入门到跑路

window 中 服务的启动和停止

net start 服务名(mysql)
net stop 服务名(mysql)

mysql 服务登录和退出

1.登录 
mysql [-h主机名 -p端口号] -u用户名 -p密码
2.退出
exit或者ctrl+c
3.数据库内查看数据库版本
select version();

mysql 库的常用命令

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;

mysql常见函数

功能:类似于 封装的方法。将一组逻辑封装在方法体中,对外暴露方法名。
作用:提高代码的重用性
调用:select 函数名(实参列表) [form 表]
特点:1.叫什么(函数名) 2.干什么(函数功能)
分类:1.单行函数 如:CONCAT(str1,str2,…),length,IFNULL(expr1,expr2)等
1.1 字符函数 1.2 数学函数 1.3 日期函数 1.4 其他函数 1.5 流程控制函数
2.分组函数 功能:做统计使用,又称为统计函数,聚合函数,组函数
分类 2.1 sum 求和 2.2avg 平均值 2.3 max最大值 2.4 min最小值 2.5 count 计算个数

单行函数

一.字符函数

length

获取长度 utf8 中文占3个字符 GBK中文占2个字符

Code
1
2
3
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 VERSION();
当前库名
SELECT DATABASE();
当前用户
SELECT USER();

流程控制函数

if ,if else

Code
1
2
SELECT IF(10<5,'大','小');
SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金','有奖金') AS 备注 FROM `employees`;

CASE 使用

CASE 需要判断的字段或表达式
WHEN 常量1 THEN 要显示的值或者语句1;
WHEN 常量2 THEN 要显示的值或者语句2;
ELSE  其他的 THEN 要显示的值;
END;

案例:查询员工的工资,要求
部门号=30 ,显示的工资是1.1倍
部门号=40 ,显示的工资是1.2倍
部门号=50 ,显示的工资是1.3倍
其他部门,显示为原工资

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;

按多个字段分组

打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论