MysqL 命令大全

文章目录

  • 1 .库操作
    • 1.1 创建库
    • 1.2 查看库
    • 1.3 选择库
    • 1.4 查看mysql的版本
  • 2.查询表命令
  • 3 过滤
  • 4 模糊查询:like
  • 5 排序
  • 6 函数
  • 7. group by
  • 8 等值连接
  • 9 单行子查询
  • 10 多行子查询
  • 11 表操作
  • 12 事务

1 .库操作

1.1 创建库

create database name;

1.2 查看库

#查看mysql上有哪些库
SHOW DATABASES;

#查看具体库的信息
SHOW CREATE DATABASE name;

1.3 选择库

USE DATABASE name;

1.4 查看mysql的版本

SELECT VERSION();

2.查询表命令

# 查询employees中所有人的名字
SELECT first_name from employees;
## 查询employees中所有人的first_name,last_name
SELECT first_name,last_name 
FROM employees;
# 查询employees中所有人的信息
# * 代表所有字段
SELECT * 
FROM employees;
#给字段取别名
#给字段起别名
/*
方式一 : 字段名  as  别名
方式二 : 字段名  别名
注意 : 如果别名中间有空格,那么别名必须使用""括起来。
*/
SELECT first_name AS fname
FROM employees;

SELECT first_name fname
FROM employees;

SELECT first_name "f name"
FROM employees;

在sql中的select 相当于输出语句

#可以理解成输出语句
SELECT 10;
SELECT 10+20;
SELECT 20+30 FROM DUAL; # dual是伪表,不是一个真实的表。
#字符串和整型做运算,如果字符串可以转成数值那就转成对应的数值,如果不能转那么就是0
SELECT "10"+10;
SELECT "aa"+10;

#null和任意值做运算结果还为null
SELECT NULL+10;

3 过滤

#查询department_id 为90 的员工的信息
SELECT * 
FROM employees
WHERE department_id = 90;
#查询薪水大于5000的所有员工的姓名和薪水。
SELECT first_name,salary
FROM employees
WHERE salary > 5000;
#查询部门不等于100的所有人的部门号
SELECT department_id
FROM employees
WHERE department_id <> 100;
# 或者
SELECT department_id
FROM employees
WHERE department_id != 100;
#查询薪水大于等于5000并且小于等于8000的所有员工的薪水
SELECT salary
FROM employees
WHERE salary >= 5000 AND salary <= 8000;

SELECT salary
FROM employees
WHERE salary BETWEEN 5000 AND 8000;
#查询department_id为50,90,100的员工的部门号
SELECT department_id
FROM employees 
WHERE department_id IN (50,90,100);
#选择工资不在5000到12000的员工的姓名和工资
SELECT first_name,salary
FROM employees
WHERE salary not BETWEEN 5000 AND 12000;

4 模糊查询:like

#查询员工的名字中带有a字符的员工姓名
SELECT first_name
FROM employees
WHERE first_name LIKE '%a%';# % 代表任意个数字符
#查询员工的名字中第二个字符是a的员工的姓名
SELECT first_name
FROM employees
WHERE first_name LIKE `在这里插入代码片`'_a%';#_代表任意一个字符
#查询员工的名字第二个字符是_的员工的姓名
SELECT first_name
FROM employees
WHERE first_name LIKE '_\_%'; # \_ 表示的就是_

SELECT first_name
FROM employees
WHERE first_name LIKE '_$_%' ESCAPE '$'; # escape 指定使用谁作为转义字符。
#查询员工的名字中包含a和e字符的员工姓名
SELECT first_name
FROM employees 
WHERE first_name LIKE '%a%e%' 
OR first_name LIKE '%e%a%';
#查询员工奖金率为null的员工的信息(名字,奖金率)
SELECT first_name,commission_pct
FROM employees
WHERE commission_pct IS NULL;


#查询员工奖金率不为null的员工的信息(名字,奖金率)
SELECT first_name,commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;

5 排序

#获取所有的员工信息,薪水从小到大排序
SELECT *
FROM employees
ORDER BY salary ASC;
#asc 是升序(默认),desc 为降序
#获取所有员工信息,安照部门号进行排序(从小到大),如果部门id相同薪水降序。
SELECT *
FROM employees
ORDER BY department_id ASC,salary DESC;

6 函数


#lower : 将所有的字符变成小写
SELECT LOWER("HeLLo");
#upper : 将所有的字符变成大写
SELECT UPPER("HeLLo");

SELECT UPPER(first_name)
FROM employees;


/*
字符:

CONCAT('Hello', 'World') : 字符串拼接
SUBSTR('HelloWorld',2,3) : 截取子串,从1的位置开始长度为5 (注意索引位置从1开始)
LENGTH('HelloWorld') : 字符串长度
INSTR('HelloWorld', 'W') : w在当前字符串中的位置
LPAD(salary,10,'*') :向右对齐
RPAD(salary, 10, '*') :向左对齐
TRIM('H' FROM 'HelloWorld') : 去除当前字符串两端的H
REPLACE('abcd','b','m') : 将当前字符串中的b替换成m

*/

SELECT CONCAT("hello","world");

SELECT CONCAT(first_name,last_name)
FROM employees;

SELECT SUBSTR("Helloworld",2,3);

SELECT LENGTH("aaa");

SELECT INSTR("helloWorld","w");

SELECT LPAD(first_name,10,'*'),RPAD(last_name,10,'*')
FROM employees;

SELECT TRIM('H' FROM 'HHHHHHae HHHHHH lloHHHHHHH');

SELECT REPLACE('abcdef','b','m');

/*

ROUND: 四舍五入

TRUNCATE: 截断

MOD: 求余

*/
#ROUND: 四舍五入
SELECT ROUND(12.8),ROUND(12.56,1),ROUND(-12.3),ROUND(-12.5);
#TRUNCATE: 截断
SELECT TRUNCATE(12.569,1),TRUNCATE(12.569,2),TRUNCATE(12.569,0);
#MOD:求余
SELECT MOD(5,3),MOD(-5,3);
#cell : 向上取整 >= 12.3的整数
SELECT CEIL(12.3)
#floor : 向下取整 <= 12.3的整数
SELECT FLOOR(12.3)

/*
	日期函数
*/
SELECT NOW();
#CURDATE() :当前的日期  
#CURTIME() :当前的时间
SELECT CURDATE(),CURTIME();


/*
	通用函数:
	
	IFNULL(commission_pct,0) :如果commission_pct的值为null那么就使用0值来替代null 
*/
#需求 :求每个人的年薪
SELECT first_name,salary * 12 * (1 + IFNULL(commission_pct,0)) AS "年薪"
FROM employees;



/*

格式:

case 字段名

when  条件  then 执行的任务 
when  条件  then 执行的任务  
when  条件  then 执行的任务  
...
else 执行的任务(如果上面的条件都不满足就执行else中的执行任务)
end (end表示该语句结束)


说明:
    1.else是可选的

*/
#查询部门号为 10, 20, 30 的员工信息, 若部门号为 10, 则打印其工资的 1.1 倍, 
#20 号部门, 则打印其工资的 1.2 倍, 30 号部门打印其工资的 1.3 倍数

SELECT department_id,salary,CASE department_id
		     WHEN 10 THEN salary * 1
		     WHEN 20 THEN salary * 2
		     WHEN 30 THEN salary * 3
		     END  AS "new salary"
FROM employees
WHERE department_id IN(10,20,30);

#查询部门员工信息, 若manager_id为 103, 则打印其工资的 1 倍, 
#若manager_id为 101, 则打印其工资的 2 倍, 若manager_id为 108工资的 3 倍数
#其它员工薪水全部增5倍
SELECT manager_id,salary,CASE manager_id
			 WHEN 103 THEN salary * 1
			 WHEN 101 THEN salary * 2
			 WHEN 108 THEN salary * 3
			 ELSE salary * 5
			 END AS "new salary"
FROM employees
WHERE manager_id IS NOT NULL;



SELECT CONCAT(first_name,last_name)
FROM employees;


/*
 组函数:
	AVG()  :求平均数
	SUM()  : 求和
	MAX()  : 求最大值
	MIN()  : 求最小值
	COUNT() : 求个数

 说明:
     1.avg()和sum()只能数值类型的数据进行运算
     2.max()和min()可以对任意数值类型做运算。
     3.count(字段名) : 求非空的数据的行数。
       count(*) : 求表中所有数据的行数。
       (底层原理:只要当前行中任意一个数据不为null那么就会统计成一行)
       count(数值) : 求表中所有数据的行数(知道即可)。
     
  注意 :组函数在运算时都是忽略为null的数据。
  
  
  问题 :在select中如果使用组函数,那么select后面不能再使用其它的字段(除非该字段是分组字段)
	#下面的写法是错误的
	SELECT first_name,AVG(salary)
	FROM employees;
	#下面的写法是错误的
	SELECT first_name,COUNT(first_name) #统计所有名字的个数
	FROM employees;

*/
#求所有员工的平均薪水
SELECT AVG(salary),MAX(salary),MIN(salary),SUM(salary)
FROM employees;


SELECT MAX(first_name),MIN(first_name)
FROM employees;

SELECT COUNT(salary),COUNT(commission_pct),COUNT(*),COUNT(1)
FROM employees;

SELECT commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;

#使用组函数时可能产生的问题?

#需求:求所有员工的薪水的平均值'
#下面的写法是错误的
SELECT first_name,AVG(salary)
FROM employees;
#下面的写法是错误的
SELECT first_name,COUNT(first_name) #统计所有名字的个数
FROM employees;

7. group by

group by 前面的select 的语句不能添加不是group by 的字段或者不是聚集函数的字段(如果要支持需要配置一个环境)

select department_id,count(department_id ) 
from employees e 
where department_id is not null 
group by department_id;
#统计各job_id员工的薪水的总和
select job_id,count(job_id ) 
from employees e 
where job_id is not null 
group by job_id ;
#统计各个领导手下的员工的人数
select manager_id,count(manager_id ) 
from employees e
where manager_id is not null
group by manager_id ;
#统计各个领导手下薪水大于5000的员工的人数,并把结果进行升序排序。
select manager_id ,count(manager_id ) com 
from employees e 
where salary > 5000 and manager_id  is not null 
group by manager_id
order by com  asc;

不能在 WHERE 子句中使用组函数。
可以在 HAVING 子句中使用组函数。

8 等值连接

# 内连接等值连接
# 查询每个员工的姓名及部门名称
select e.first_name ,d.department_name 
from employees e ,departments d 
where e.department_id  = d.department_id ;
#内连接:非等值连接
#需求:查询每个员工的薪水等级
select e.first_name ,e.salary ,jg.GRADE 
from employees e ,job_grades jg 
where e.salary >= jg.LOWEST_SAL and e.salary <= jg.HIGHEST_SAL 
#内连接:自连接
#需求:查询每个员工及员工的管理者的姓名
select e.first_name ,e2.first_name 
from employees e ,employees e2 
where e.manager_id = e2.employee_id ;
/*
  sql99语法
  
  内连接:
	  格式 :
		from 表1 [inner] join 表2
		on 连接条件
		join 表3
		on 连接条件
 
*/
#内连接:等值连接
#需求:查询每个员工的姓名及部门名称
select e.first_name ,d.department_name 
from employees e join departments d
on e.department_id = d.department_id ;
#内连接 :非等值连接
#需求:查询每个员工的薪水等级
select e.first_name ,e.salary ,jg.GRADE 
from employees e join job_grades jg
on e.salary >= jg.LOWEST_SAL and e.salary <= jg.HIGHEST_SAL ;
#内连接 :自连接
#需求:查询每个员工及员工的管理者的姓名
select e.first_name ,e2.first_name 
from employees e join employees e2
on e.manager_id = e2.manager_id ;
#需求:查询每个员工姓名,员工部门名称,员工部门所在城市
select e.first_name ,d.department_name ,l.city 
from employees e 
join departments d 
on e.department_id = d.department_id 
join locations l 
on d.location_id = l.location_id ;
/*
   外连接:
	左外连接:
	右外连接:
	满外连接(mysql不支持)
	
	
    格式:
	1. 左外连接:
		from  表1 left [outer] join 表2
		on  连接条件
  
*/
#需求:获取所有员工及员工的部门名称
#外连接:左外连接
select e.first_name ,d.department_name 
from employees e 
left join departments d 
on e.department_id = d.department_id ;

左外连接就是不管与之对应的表的值是否为null,都会显示出来,就是说左表的数据一定会显示出来.

#外连接:右外连接
#需求:获取员工及所有部门名称
select e.first_name ,d.department_name 
from employees e 
right join departments d 
on e.department_id = d.department_id ;

右外连接就是不管与之对应的表的值是否为null,都会显示出来,就是说右表的数据一定会显示出来.

#练习:查询公司所有员工薪水及大于5000的员工的薪水等级
select e.first_name ,e.salary ,jg.GRADE 
from employees e 
left join job_grades jg
on e.salary >= jg.LOWEST_SAL 
and e.salary <= jg.HIGHEST_SAL 
and e.salary > 5000;
/*

	full join : 满外连接(mysql不支持)
	
	mysql实现满外连接的方法
		UNION : 可以将两张表的结果进行合并-去重(相当于full join)。
		UNION ALL : 可以将两张表的结果进行合并-没有去重
		
	格式:
	    左外连接的结果
	    union/union all
	    右外连接的结果
	    
	DISTINCT :去重
	    格式 : distinct 字段名
*/
#需求 :查询所有的部门及所有的员工
select e.first_name,d.department_name 
from departments d 
left join employees e 
on d.department_id = e.department_id 
#union 去重
union all #没有去重
select e.first_name,d.department_name 
from departments d 
right join employees e 
on d.department_id = e.department_id ;

9 单行子查询

/*

一 子查询的概念 : 在一个查询语句中嵌套了一个查询语句该查询语句叫作子查询。

例 : select first_name
      from employees e join (select * from departments)
      on......
      

二 子查询的分类 :单行子查询  vs 多行子查询
		单行子查询 :子查询的结果只有一条
		多行子查询 :子查询的结果有多条
	 
		单行子查询所使用的运算符 :> >= < <= =
		多行子查询所使用的运算符 :in , any ,all

三 子查询使用的位置
	select --- 子查询
	from ----- 子查询
	where ---- 子查询
	having ---- 子查询
	
*/
#需求 :谁的工资比 Abel 高?
#方法一:内查询
select e.first_name ,e.salary ,e2.salary 
from employees e ,employees e2 
where e.salary > e2.salary and e2.last_name = 'Abel';

#方法二:子查询
select e2.last_name ,e2.salary 
from employees e2 
where e2.salary >
(select e.salary 
from employees e 
where e.last_name = 'Abel');
#返回job_id与141号员工相同,salary比143号员工多的员工
#            姓名,job_id 和工资
select e3.first_name ,e3.job_id ,e3.salary 
from employees e3 
where e3.job_id =
(select e.job_id 
from employees e 
where e.employee_id = 141)
and e3.salary > 
(select e2.salary
from employees e2 
where  e2.employee_id = 143);


#返回公司工资最少的员工的last_name,job_id和salary
select e2.last_name,e2.job_id,e2.salary
from employees e2 
where e2.salary =(
select min(e.salary ) 
from employees e );
#查询最低工资大于50号部门最低工资的部门id和其最低工资
select e2.department_id ,min(e2.salary )
from employees e2 
where e2.department_id is not null 
group by e2.department_id 
having min(e2.salary ) > 
(
select min(e.salary)
from employees e 
where e.department_id = 50
);

10 多行子查询

/*

	多行子查询 : 子查询的结果有多条数据。
	
	使用的运算符:
		
		in:等于列表中的任意一个

		any: 和子查询返回的某一个值比较

		all: 和子查询返回的所有值比较

*/
#返回其它部门中比job_id为‘IT_PROG’部门任一工资低的员工的员
#             工号、姓名、job_id 以及salary
select e2.first_name ,e2.job_id ,e2.salary 
from employees e2 
where e2.salary < any(
select distinct e.salary 
from employees e 
where e.job_id = 'IT_PROG'
) and e2.job_id != 'IT_PROG';

#题目:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工
#           的员工号、姓名、job_id 以及salary
select e2.first_name ,e2.job_id ,e2.salary 
from employees e2 
where e2.salary < all(
select distinct e.salary 
from employees e 
where e.job_id = 'IT_PROG'
) and e2.job_id != 'IT_PROG';

11 表操作



/*

	对库的管理
		1.创建库 : create database 库名
		2.删除库 : drop database 库名
	
	对表的管理
		1.创建表 : 
			create table 表名(
			    字段名 类型,
			    字段名2 类型,
			    ......
			
			)
		2.删除表 :drop table 表名
		
		3.修改表名:alter table 原表名 rename to 新表名
		
		4.清空表:TRUNCATE TABLE 表名

*/
#创建库
CREATE DATABASE cangjie;
#删除库
DROP DATABASE cangjie;


#创建表 - 白手起家
CREATE TABLE person(
	pid INT,
	pname VARCHAR(20),
	score DOUBLE(4,1)
);

#创建表 - 复制表
CREATE TABLE person
AS
SELECT first_name,department_id
FROM employees;

--  下面的操作很少极少非常少 ----

#删除表
DROP TABLE person;

#修改表名
ALTER TABLE person RENAME TO person2;

#查询表结构
DESC person;

#修改列
   #格式 :alter table 表名  add/drop/modify/change  column  【字段名-不同操作有区别】
   #1.添加一列
   ALTER TABLE person ADD COLUMN page INT;
   #2.删除一列
   ALTER TABLE person DROP COLUMN page;
   #3.修改列的类型
   ALTER TABLE person MODIFY COLUMN pid VARCHAR(20);
   #4.修改列的名称
   ALTER TABLE person CHANGE COLUMN pid ppid VARCHAR(20);
   
   
 #清空表
 TRUNCATE TABLE person2;

/*
	数据处理之 :增,删,改
*/
#删除表
DROP TABLE person;
#创建表
CREATE TABLE person(
	pid INT,
	pname VARCHAR(20),
	score DOUBLE(4,1)
);

#查询表
SELECT * FROM person;

/*
	插入数据:
	   insert into 表名(字段名1,字段名2,字段名......) values(值1,值2,值3....)
	   
	修改数据:
	   update 表名 set 字段名=值,字段名2=值....... where 修改的条件
	   
	删除数据:
	    delete from  表名  where 删除的条件

*/
#注意:字段顺序和值的顺序必须保持一致。
INSERT INTO  person(pid,pname,score) VALUES(1,'小龙哥',100);
INSERT INTO  person(pname,pid,score) VALUES('小哥哥',2,101);
#注意:如果表名后面没有写字段名,那么值默认和字段的顺序依次对应(个数和顺序都不能错)
INSERT INTO person VALUES(3,'小空空',102);
#注意:可以指定只给某些字段插入数据,表名后面必须加字段名。
#需求 :只插入pid和pname
INSERT INTO  person(pid,pname) VALUES(4,'小坤坤');
#需求:一次插入多条数据
INSERT INTO person VALUES(5,'小飞飞',100),(6,'小钻石',100),(7,'小辉辉',100);
#需求:将查询出的数据添加到表中
INSERT INTO person(pname)
SELECT first_name
FROM employees; #将employees中first_name字段中所有数据插入到person的pname字段中


/*
修改表中的数据:
	 update 表名 set 字段名=值,字段名2=值....... where 修改的条件
*/
UPDATE person SET score=300,pname='小杰杰' WHERE pid=1;



/*
删除表中的数据
  delete from  表名  where 删除的条件
*/
#需求:删除pid为null的数据
DELETE FROM person WHERE pid IS NULL;#DELETE FROM person :删除表中的所有数据

12 事务

/*
	事务的操作:
		1.设置提交状态:SET AUTOCOMMIT = FALSE;
		2.开启事务
		3.执行相应的执行语句
		4.提交、回滚

*/
#设置提交状态
SET autocommit=FALSE;
#开启事务
START TRANSACTION;

UPDATE account SET abalance=900 WHERE aname='aa';
-- 发生异常----
UPDATE account SET abalance=1100 WHERE aname='cc';

#提交 - 一旦提交将不能再回滚
COMMIT;

#回滚
ROLLBACK;

你可能感兴趣的:(大数据)