mysql --version 查看mysql版本 以及安装位置
mysql -uroot -p; 登录
select user,host from mysql.user; 查看所有用户
flush privileges;
mysql -h 主机名 -P 端口号 -u 用户名 -p密码 -p和密码之间不能有空格 其他随便
create user 'user01' @'localhost' identified by 'user01'; 添加用户
drop user ‘user01’@’localhost’; 删除用户
rename user 'user01'@'localhost' to 'User01'@'localhost'; 修改用户名
常用命令
show databases;--查看当前所有的数据库
use 数据库名;--打开指定的数据库
show tables;--查看所有的表
desc 表名 ;--显示表的信息
create database 数据库名;--创建一个数据库
exit -- 退出连接
操作数据库
create database if not exists 数据库名;--创建数据库名
drop database if exists 数据库名;--删除数据库
use 数据库名 --使用数据库
show databases;--查看数据库
SHOW CREATE DATABASE 数据库名;--查看数据库的创建信息
-- 修改表名
-- ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE teacher RENAME AS teachers;-- 增加表的字段
-- ALTER TABLE 表名 ADD 字段名 列属性
ALTER TABLE teachers ADD age INT(11);-- 修改表的字段(重命名,修改约束)-- ALTER TABLE 表名 MODIFY 字段名 [列属性];
ALTER TABLE teachers MODIFY age VARCHAR(11);-- 修改约束
-- ALTER TABLE 表名 CHANGE 旧名字 新名字 [列属性];
ALTER TABLE teachers CHANGE age age1 INT(1);-- 字段重命名
-- 删除表的字段
-- ALTER TABLE 表名 DROP 字段名
ALTER TABLE teachers DROP age1;
-- 删除表(如果存在再删除)
DROP TABLE IF EXISTS teachers;
增加表中数据
-- 普通用法
INSERT INTO `student`(`name`) VALUES ('zsr');-- 插入多条数据
INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES ('zsr','200024','男'),('gcc','000421','女');-- 省略字段
INSERT INTO `student` VALUES (5,'Bareth','123456','男','2000-02-04','武汉','1412@qq.com',1);
修改表中数据
-- 修改学员名字,指定条件
UPDATE `student` SET `name`='zsr204'WHERE id=1;-- 不指定条件的情况,会改动所有表
UPDATE `student` SET `name`='zsr204';-- 修改多个属性
UPDATE `student` SET `name`='zsr',`address`='湖北'WHERE id=1;-- 通过多个条件定位数据
UPDATE `student` SET `name`='zsr204' WHERE `name`='zsr' AND `pwd`='200024';
删除表中数据(注意一定要加where)
-- 删除指定数据
DELETE FROM `student` WHERE id=1;
查询语句
SELECT [ALL | DISTINCT]{*| table.* |[table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias][left | right | inner join table_name2]-- 联合查询
[WHERE ...]-- 指定结果需满足的条件
[GROUP BY ...]-- 指定结果按照哪几个字段来分组
[HAVING]-- 过滤分组的记录必须满足的次要条件
[ORDER BY ...]-- 指定查询记录按一个或多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}];-- 指定查询的记录从哪条至哪条
基础查询
-- 查询全部学生
SELECT *FROM student;-- 查询指定的字段
SELECT `LoginPwd`,`StudentName`
FROM student;-- 别名 AS(可以给字段起别名,也可以给表起别名)
SELECT `StudentNo` AS 学号,`StudentName` AS 学生姓名
FROM student AS 学生表;-- 函数 CONCAT(str1,str2,...)SELECTCONCAT('姓名',`StudentName`) AS 新名字
FROM student;-- 查询系统版本(函数)SELECTVERSION();-- 用来计算(计算表达式)
SELECT 100*53-90 AS 计算结果;-- 查询自增步长(变量)
SELECT @@auto_increment_increment;-- 查询有哪写同学参加了考试,重复数据要去重
SELECT DISTINCT `StudentNo`
FROM result;
条件查询
-- 查询考试成绩在95~100之间的
SELECT `StudentNo`,`StudentResult`
FROM result
WHERE `StudentResult`>=95
AND `StudentResult`<=100;--&&
SELECT `StudentNo`,`StudentResult`
FROM result
WHERE `StudentResult`>=95&& `StudentResult`<=100;-- BETWEEN AND
SELECT `StudentNo`,`StudentResult`
FROM result
WHERE `StudentResult`BETWEEN 95AND100;-- 查询除了1000号以外的学生
SELECT `StudentNo`,`StudentResult`
FROM result
WHERE `StudentNo`!=1000;-- NOT
SELECT `StudentNo`,`StudentResult`
FROM result
WHERE NOT `StudentNo`=1000;-- 查询名字含d的同学
SELECT `StudentNo`,`StudentName`
FROM student
WHERE `StudentName` LIKE '%d%';-- 查询名字倒数第二个为d的同学
SELECT `StudentNo`,`StudentName`
FROM student
WHERE `StudentName` LIKE '%d_';-- 查询1000,1001学员
SELECT `StudentNo`,`StudentName`
FROM student
WHERE `StudentNo` IN (1000,1001);
分组查询
-- 查询不同科目的平均分、最高分、最低分且平均分大于90-- 核心:根据不同的课程进行分组
SELECT SubjectName,AVG(StudentResult),MAX(`StudentResult`),MIN(`StudentResult`)
FROM result r
INNER JOIN `subject` s
on r.SubjectNo=s.SubjectNo
GROUP BY r.SubjectNoHAVINGAVG(StudentResult)>90;
连接查询
-- 查询学员所属的年级(学号,学生姓名,年级名称)
SELECT `StudentNo`,`StudentName`,`GradeName`
FROM student s
INNER JOIN grade g
ON s.GradeID=g.GradeID;-- 查询科目所属的年级
SELECT `SubjectName`,`GradeName`
FROM `subject` s
INNER JOIN `grade` g
ON s.GradeID=g.GradeID;-- 查询列参加程序设计考试的同学信息(学号,姓名,科目名,分数)
SELECT s.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult`
FROM student s
INNER JOIN result r
on s.StudentNo=r.StudentNo
INNER JOIN `subject` sub
on r.SubjectNo=sub.SubjectNo
where SubjectName='课程设计';
子查询
-- 查询‘课程设计’的所有考试结果(学号,科目编号,成绩)降序排列
-- 方式一:使用连接查询
SELECT `StudentNo`,r.`SubjectNo`,`StudentResult`
FROM result r
INNER JOIN `subject` s
on r.StudentNo=s.SubjectNo
WHERE SubjectName='课程设计'
ORDER BY StudentResult DESC;-- 方式二:使用子查询(由里到外)
SELECT StudentNo,SubjectNo,StudentResult
from result
WHERE SubjectNo=(
SELECT SubjectNo FROM `subject`
WHERE SubjectName='课程设计')
ORDER BY StudentResult DESC;
查询员工12个月的工资总和,并起别名为ANNUAL SALAR
SELECT employee_id , last_name,salary *12"ANNUAL SALARY"FROM employees;
查询employees表中去除重复的job_id以后的数据
SELECT DISTINCT job_id
FROM employees;
查询工资大于12000的员工姓名和工资
SELECT last_name, salary
FROM employees
WHERE salary >12000;
查询员工号为176的员工的姓名和部门号
SELECT last_name, department_id
FROM employees
WHERE employee_id =176;
显示表 departments 的结构,并查询其中的全部数据
DESC departments;
SELECT *FROM departments;
运算符
选择工资不在5000到12000的员工的姓名和工资
SELECT last_name, salary
FROM employees
WHERE salary < 5000 OR salary >12000;
选择在20或50号部门工作的员工姓名和部门号
SELECT last_name, department_id
FROM employees
WHERE department_id =20OR department_id =50;
选择公司中没有管理者的员工姓名及job_id
SELECT last_name, job_id
FROM employees
WHERE manager_id IS NULL;
选择公司中有奖金的员工姓名,工资和奖金级别
SELECT last_name, salary, commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;
选员工姓名的第三个字母是a的员工姓名
SELECT last_name
FROM employees
WHERE last_name LIKE '__a%';
选择姓名中有字母a和k的员工姓名
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%k%' OR last_name LIKE '%k%a%';
显示出表 employees 表中 first_name 以 'e'结尾的员工信息
SELECT employee_id,first_name,last_name
FROM employees
WHERE first_name LIKE '%e';
显示出表 employees 部门编号在 80-100 之间的姓名、工种
SELECT last_name,job_id
FROM employees
where department_id in (80,90,100);
显示出表 employees 的 manager_id 是 100,101,110 的员工姓名、工资、 管理者id
SELECT last_name,salary,manager_id
FROM employees
WHERE manager_id IN (100,101,110);
排序与分页
查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序显示
SELECT last_name,department_id,salary *12 annual_sal
FROM employees
ORDER BY annual_sal DESC,last_name ASC;
选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序,显示第 21到40位置的数据
SELECT last_name,salary
FROM employees
WHERE salary NOT BETWEEN 8000 AND 17000
ORDER BY salary DESC LIMIT20,20;
查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序
SELECT last_name,email,department_id
FROM employees #where email like '%e%'
WHERE email REGEXP '[e]'
ORDER BYLENGTH(email) DESC,department_id ASC;
多表查询
显示所有员工的姓名,部门号和部门名称
SELECT last_name, e.department_id, department_name
FROM employees e
LEFT OUTER JOIN departments d ON e.`department_id` = d.`department_id`;
查询90号部门员工的job_id和90号部门的location_id
SELECT job_id, location_id
FROM employees e, departments d
WHERE e.`department_id` = d.`department_id`
AND e.`department_id` =90;
选择所有有奖金的员工的 last_name , department_name , location_id , city
SELECT last_name , department_name , d.location_id , city
FROM employees e
LEFT OUTER JOIN departments d ON e.`department_id` = d.`department_id`
LEFT OUTER JOIN locations l ON d.`location_id` = l.`location_id`
WHERE commission_pct IS NOT NULL;
选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果 类似于下面的格式
employees Emp# manager Mgr#
kochhar 101 king 100
SELECT emp.last_name employees, emp.employee_id "Emp#",
mgr.last_name manager, mgr.employee_id "Mgr#"
FROM employees emp
LEFT OUTER JOIN employees mgr ON emp.manager_id = mgr.employee_id;
查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所 在部门的部门名称为’Executive’
SELECT department_name, street_address, last_name, job_id, salary
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN locations l ON d.`location_id` = l.`location_id`
WHERE department_name = 'Executive'
查询哪些部门没有员工
SELECT department_id FROM departments d
WHERE NOT EXISTS
( SELECT * FROM employees e WHERE e.`department_id` = d.`department_id` )
聚合函数
查询公司员工工资的最大值,最小值,平均值,总和
SELECTMAX(salary),MIN(salary),AVG(salary),SUM(salary)FROM employees;
查询各job_id的员工工资的最大值,最小值,平均值,总和
SELECT job_id,MAX(salary),MIN(salary),AVG(salary),SUM(salary)
FROM employees GROUP BY job_id;
选择具有各个job_id的员工人数
SELECT job_id,COUNT(*)
FROM employees
GROUP BY job_id;
查询员工最高工资和最低工资的差距
SELECTMAX(salary),MIN(salary),MAX(salary)-MIN(salary) DIFFERENCE
FROM employees;
查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没 有管理者的员工不计算在内
SELECT manager_id,MIN(salary)
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id HAVINGMIN(salary)>6000;
查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序
SELECT department_name, location_id,COUNT(employee_id),AVG(salary) avg_sal
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
GROUP BY department_name, location_id
ORDER BY avg_sal DESC;
查询每个工种、每个部门的部门名、工种名和最低工资
SELECT department_name,job_id,MIN(salary)
FROM departments d LEFT JOIN employees e
ON e.`department_id` = d.`department_id`
GROUP BY department_name,job_id;
子查询
查询和Zlotkey相同部门的员工姓名和工资
SELECT last_name, salary
FROM employees
WHERE department_id =( SELECT department_id FROM employees WHERE last_name = 'Zlotkey' )
查询工资比公司平均工资高的员工的员工号,姓名和工资
SELECT employee_id, last_name, salary
FROM employees
WHERE salary >(SELECTAVG(salary)FROM employees )
选择工资大于所有JOB_ID ='SA_MAN'的员工的工资的员工的last_name, job_id, salary
SELECT last_name,job_id,salary
FROM employees
WHERE salary > ALL ( SELECT salary FROM employees WHERE job_id ='SA_MAN');
查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名
SELECT employee_id, last_name
FROM employees
WHERE department_id =ANY( SELECT DISTINCT department_id FROM employees WHERE last_name LIKE '%u%')
查询在部门的location_id为1700的部门工作的员工的员工号
SELECT employee_id
FROM employees
WHERE department_id IN
( SELECT department_id FROM departments WHERE location_id =1700)
查询管理者是King的员工姓名和工资
SELECT last_name, salary
FROM employees
WHERE manager_id
IN ( SELECT employee_id FROM employees WHERE last_name ='King')
查询工资最低的员工信息: last_name, salary
SELECT last_name,salary
FROM employees
WHERE salary =(SELECTMIN(salary)FROM employees );
查询平均工资最低的部门信息
SELECT *
FROM departments
WHERE department_id =( SELECT department_id
FROM employees
GROUP BY department_id
HAVINGAVG(salary)<=ALL(SELECTAVG(salary) avg_sal
FROM employees
GROUP BY department_id ));
查询平均工资最低的部门信息和该部门的平均工资(相关子查询)
SELECT d.*,(SELECTAVG(salary)
FROM employees
WHERE department_id = d.department_id) avg_sal
FROM departments d
WHERE department_id =(
SELECT department_id
FROM employees
GROUP BY department_id
HAVINGAVG(salary)=(SELECTAVG(salary) avg_sal
FROM employees
GROUP BY department_id
ORDER BY avg_sal LIMIT0,1))
查询平均工资最高的 job 信息
SELECT *
FROM jobs
WHERE job_id =(
SELECT job_id
FROM employees
GROUP BY job_id
HAVINGAVG(salary)>= ALL
(SELECTAVG(salary)
FROM employees
GROUP BY job_id
));
查询每个部门下的部门人数大于 5 的部门名称
SELECT department_name,department_id
FROM departments d
WHERE 5<(SELECTCOUNT(*)
FROM employees e
WHERE d.`department_id` = e.`department_id`
);
查询员工号、姓名、雇用时间、工资,其中员工的管理者为 'DeHaan'
SELECT employee_id, last_name, hire_date, salary
FROM employees
WHERE manager_id =(
SELECT employee_id
FROM employees
WHERE last_name = 'DeHaan'
);
查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary
SELECT employee_id,last_name, department_id, email, salary
FROM employees
WHERE employee_id IN
(SELECT DISTINCT manager_id
FROM employees
WHERE department_id =( SELECT department_id
FROM employees e
GROUP BY department_id
HAVINGAVG(salary)>=ALL(SELECTAVG(salary)
FROM employees
GROUP BY department_id
)));