启动/停止
管理员身份打开cmd
启动: net start mysql
停止: net stop mysql
登录和退出
方式一:
mysql自带的客户端
方式二:
cmd
登录:
mysql -h localhost -P 3306 -u root -p
h: host
P: 端口号
登录本地:
mysql -u root -p
退出:
exit/ctrl + c
查看mysql服务端的版本
方式一:
客户端中输入:
select version();
方式一:
cmd中输入:
mysql --version/mysql -V
mysql常见命令
- 查看当前所有的数据库
show databases; - 打开指定的库
use 库名; - 查看当前库的所有表
show tables; - 查看其它库的所有表
show tables from 库名; - 创建表
create table 表名(
列名 列类型,
…
列名 列类型); - 查看表结构
desc 表名;
mysql的语法规范
- 不区分大小写,但建议关键字大写,表名、列名小写
- 每条命令最好用分号结尾
- 每条命令根据需要,可以进行缩进或换行
- 注释:
单行注释:#注释文字
单行注释:-- 注释文字(有空格)
多行注释:/* 注释文字 */
DQL语言的学习(data query language 数据查询语言)
基础查询
语法:
SELECT 查询列表 FROM 表名
特点:
1.查询列表可以是:表中的字段、常量值、表达式、函数
2.查询的结果是一个虚拟的表格
例:
1.查询表中的单个字段
SELECT last_name FROM employees;
2.查询表中的多个字段
SELECT last_name,salary,email FROM employees;
3.查询表中的所有字段
SELECT * FROM employees;
4.查询常量值
SELECT 100;
SELECT ‘john’;
5.查询表达式
SELECT 100%98;
6.查询函数
SELECT VERSION();
7.起别名
方式一:
SELECT 100%98 AS 结果;
SELECT last_name AS 姓, first_name AS 名 FROM employees;
方式二:
SELECT last_name 姓, first_name 名 FROM employees;
SELECT salary “out put” FROM employees;
8.去重
SELECT DISTINCT department_id FROM employees;
9.+号的作用
mysql中的加号,仅仅只有一个功能,运算符
SELECT CONCAT(last_name, first_name) AS 姓名 FROM employees;
字符型转换失败,则将字符型数值转换为0
其中一方为NULL,则结果一定为NULL
条件查询
语法:
SELECT 查询列表 FROM 表名 WHERE 筛选条件
执行顺序:
表名、条件、列表
分类:
1.按条件表达式筛选
条件运算符:> < = != <> >= <=
SELECT * FROM employees WHERE salary>12000;
SELECT last_name, department_id FROM employees WHERE department_id<>90;
2.按逻辑表达式筛选
逻辑运算符:&& || ! and or not
SELECT last_name,salary,commission_pct FROM employees WHERE salary>=10000 AND salary<=12000;
SELECT * FROM employees WHERE department_id<90 OR department_id>110 OR salary>15000;
SELECT * FROM employees WHERE NOT(department_id>=90 AND department_id<=110) OR salary>15000;
3.模糊查询
like, between and, in, is null, is not null, <=>
SELECT * FROM employees WHERE last_name like ‘%a%’;
通配符:
% 任意多个字符,包含0个字符
_ 任意单个字符
SELECT last_name, salary FROM employees WHERE last_name like ‘__a_e%’;
SELECT last_name FROM employees WHERE last_name like ‘_%’;
SELECT last_name FROM employees WHERE last_name like 'KaTeX parse error: Expected group after '_' at position 1: _̲%' ESCAPE '’;
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;
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’);
SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NULL;
SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NOT NULL;
SELECT last_name,commission_pct FROM employees WHERE commission_pct <=> NULL;
SELECT last_name,commission_pct,salary FROM employees WHERE salary <=> 12000;
排序查询
语法:
SELECT 查询列表 FROM 表名 WHERE 筛选条件 ORDER BY 排序列表 ASC|DESC
SELECT * FROM employees ORDER BY salary DESC;
不写默认是升序
ORDER BY 支持别名、表达式、函数等
常见函数
SELECT 函数名() [FROM 表];
单行函数
如 concat, length, isnull等
字符函数:
- length 获取参数值的字节个数
- concat 拼接字符串
- upper lower 大小写
SELECT UPPER(‘john’);
SELECT LOWER(‘joHn’); - substr substring 截取字符串
SELECT SUBSTR(‘李莫愁爱上了陆展元’, 7) out_put;(结果为 陆展元)
SELECT SUBSTR(‘李莫愁爱上了陆展元’, 1, 3) out_put;(结果为 李莫愁) - instr 返回起始索引
SELECT INSTR(‘杨不悔爱上了殷六侠’, ‘殷六侠’) AS out_put;(结果为7,找不到返回0) - trim 去前后空格等
SELECT LENGTH(TRIM(’ 张翠山 ')) AS out_put;
SELECT TRIM(‘a’ FROM ‘aaaaaaaaa张aaaaa翠山aaaaaa’) AS out_put; - lpad 用指定字符实现左填充指定长度
SELECT LPAD(‘殷素素’, 10, ‘’) AS out_put;
SELECT LPAD(‘殷素素’, 2, '’) AS out_put; - rpad 用指定字符实现左填充指定长度
SELECT RPAD(‘殷素素’, 10, ‘’) AS out_put;
SELECT RPAD(‘殷素素’, 2, '’) AS out_put;
SELECT RPAD(‘殷素素’, 12, ‘ab’) AS out_put; - replace 替换
SELECT REPLACE(‘张无忌爱上了周芷若’, ‘周芷若’, ‘赵敏’) AS out_put;
SELECT REPLACE(‘周芷若周芷若周芷若张无忌爱上了周芷若’, ‘周芷若’, ‘赵敏’) AS out_put;(多个都改)
数学函数
round 四舍五入
ceil 向上取整,返回>=该参数的最小整数
floor 向下取整,返回<=该参数的最大整数
truncate 截断 SELECT TRUNCATE(1.699999,1); 结果为1.6
mod 取余 (a=a - a/b*b)
日期函数
now 返回当前系统日期+时间
curdate 返回当前系统日期,不包含时间
curtime 返回当前系统时间,不包含日期
year 年 month 月 …
str_to_date 将日期格式的字符转换成指定格式的日期
date_format 将日期转换成字符
其他函数[补充]
version database user
流程控制函数[补充]
- if函数 if else 的效果
SELECT IF(10<5, ‘大’, ‘小’);
SELECT last_name, commission_pct, IF(commission_pct IS NULL, ‘没奖金,呵呵’,‘有奖金,嘻嘻’) 备注 FROM employees; - case函数的使用
(1)switch case 的效果
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1
when 常量2 then 要显示的值2或语句2
…
else 要显示的值或语句n;
end
SELECT salary 原始工资, department_id,
CASE department_id
WHEN 30 THEN salary1.1
WHEN 40 THEN salary1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;
(2)类似于 多重if
case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
…
else 要显示的值n或语句n
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), AVG(salary) FROM employees;
SELECT COUNT(*) FROM employees;(一般用于统计行数)
分组查询
语法:
select 分组函数,列(要求出现在group by的后面)from 表 [where 筛选条件] group by 分组的列表 [order by 子句]
例:
查询每个工种的最高工资
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;
查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary), manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY department_id;
查询哪个部门的员工个数>2
SELECT COUNT(),department_id FROM employees GROUP BY department_id HAVING COUNT()>2;
查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT MAX(salary), job_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING MAX(salary)>12000;
查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资
SELECT MIN(salary), manager_id FROM employees WHERE manager_id > 102 GROUP BY manager_id HAVING MIN(salary) > 5000;
按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
SELECT COUNT(), LENGTH(last_name) len_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;
查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示
SELECT AVG(salary), department_id, job_id FROM employees GROUP BY department_id, job_id ORDER BY AVG(salary) DESC;
连接查询
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
笛卡尔乘积现象:表1有m行,表2有n行,结果=m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件
分类
按年代分类
sql92标准:仅仅支持内连接
sql99标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接
sql99语法:
select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】
按功能分类
内连接 inner
sql99语法:
select 查询列表 from 表1 inner join 表2 on 连接条件
等值连接
查询女神名和对应的男神名
SELECT name,boyName FROM beauty,boys WHERE beauty.boyfriend_id=boys.id;
sql99
查询员工名、部门名
SELECT last_name, department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id;
inner 可省略
非等值连接
查询员工的工资和工资级别
SELECT salary, grade_level FROM employees e, job_grades g WHERE salary BETWEEN g.lowest_sal AND g.highest_sal AND g.grade_level=‘A’;
sql99
SELECT salary,grade_level FROM employees e INNER JOIN job_grades g ON e.salary BETWEEN g.lowest_sal AND g.highest_sal AND g.grade_level=‘A’;
自连接
查询员工名和上级的名称
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name FROM employees e,employees m WHERE e.manager_id=m.employee_id;
sql99
SELECT e.last_name,m.last_name FROM employees e INNER JOIN employees m ON e.manager_id=m.employee_id;
外连接
应用场景
用于查询一个表中有,另一个表没有的记录
特点:
1.外连接的查询结果为主表中的所有记录,
如果从表中有和它匹配的,则显示匹配的值,
如果从表中没有和它匹配哦的,则显示null,
外连接结果=内连接结果+主表中有而从表中没有的记录
2.左外连接,left join左边的是主表
右外连接,right join 右边的是主表
3.左外和右外交换两个表的顺序,可以实现同样的效果
4.全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的
左外连接 left [outer]
查询男朋友不在男神表的女神名
SELECT * FROM beauty;
SELECT * FROM boys;
SELECT b.name FROM beauty b LEFT OUTER JOIN boys bo ON b.boyfriend_id=bo.id WHERE bo.id IS NULL;
右外连接 right [outer]
查询男朋友不在男神表的女神名
SELECT b.name FROM boys bo RIGHT OUTER JOIN beauty b ON b.boyfriend_id=bo.id WHERE bo.id IS NULL;
全外连接 full [outer]
SELECT b.,bo. FROM beauty b FULL OUTER JOIN boys bo ON b.boyfriend_id = bo.id;
交叉连接 cross join
SELECT b.,bo. FROM beauty b CROSS JOIN boys bo;
子查询
含义
出现在其他语句中的select语句,称为子查询或内查询
外部的查询语句,称为主查询或外查询
分类
按子查询出现的位置
select后面
仅仅支持标量子查询
案例:查询每个部门的员工个数
SELECT d., (SELECT COUNT() FROM employees e WHERE e.department_id=d.department_id) 个数 FROM departments d;
查询员工号=102的部门名
SELECT (SELECT department_name FROM departments d INNER JOIN employees e ON d.department_id=e.department_id WHERE e.department_id=102) 部门名;
from后面
支持表子查询
将子查询结果充当一张表,要求必须起别名
案例:查询每个部门的平均工资的工资等级
(1)SELECT AVG(salary),department_id FROM employees GROUP BY department_id;
SELECT * FROM job_grades;
(2)SELECT ag_dep.*, g.grade_level FROM (SELECT AVG(salary) ag,department_id FROM employees GROUP BY department_id) ag_dep INNER JOIN job_grades g ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;
where或having后面
标量子查询(单行)
列子查询(多行)
行子查询(多列多行)
特点:
1.子查询放在小括号内
2.子查询一般放在条件的右侧
3.标量子查询,一般搭配着单行操作符使用
< > >= <= = <>
列子查询,一般搭配着多行操作符使用
in、any/some、all
4.子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果
1.标量子查询
案例:谁的工资比Abel高
(1)查询Abel的工资
SELECT salary FROM employees WHERE last_name = ‘Abel’;
(2)查询员工的信息,满足salary>(1)结果
SELECT * FROM employees WHERE salary > (SELECT salary FROM employees WHERE last_name = ‘Abel’);
2.列子查询(多行子查询)
案例:返回location_id是1400或1700的部门中的所有员工姓名
(1)查询location_id是1400或1700的部门编号
SELECT DISTINCT department_id FROM departments WHERE location_id IN(1400, 1700);
(2)查询员工姓名,要求部门号是(1)列表中的某一个
SELECT last_name FROM employees WHERE department_id IN (SELECT DISTINCT department_id FROM departments WHERE location_id IN(1400, 1700));
3.行子查询(结果集为一行多列或多行多列)
案例:查询员工编号最小并且工资最高的员工信息
SELECT * FROM employees WHERE (employee_id,salary)=(SELECT MIN(employee_id),MAX(salary) FROM employees);
exists后面(相关子查询)
语法:exists(完整的查询语句)
结果:0或1
SELECT EXISTS(SELECT employees_id FROM employees);
案例:查询有员工的部门名
SELECT department_name FROM departments d WHERE EXISTS(SELECT * FROM employees e WHERE d.department_id=e.department_id);
SELECT department_name FROM departments d WHERE d.department_id IN(SELECT department_id FROM employees);
查询没有女朋友的男神信息
SELECT bo.* FROM boys bo WHERE bo.id NOT IN (SELECT boyfriend_id FROM beauty);
SELECT bo.* FROM boys bo WHERE NOT EXISTS(SELECT boyfriend_id FROM beauty b WHERE bo.id=b.boyfriend_id);
按结果集的行列数
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集有一行多列)
表子查询(结果集一般为多行多列)