MySQL--命令大全(一)

MySQL常用命令

命令描述
show databases查看有哪些数据库
use dbname使用哪个数据库
create database dbname创建数据库
show tables查看有哪些表
source 绝对路径(不要有中文!)导入数据
desc tablename查看表结构
select * from tablename查看表中的所有数据
select version()查看mysql数据库当前版本号
select database()查看当前数据库
\c终止一条命令的输入

关于SQL语句的分类

1、DQL:数据查询语言(凡是带有select关键字的都是查询语句)
select……

2、DML:数据操作语言(凡是对表当中的数据进行增删改的都是DML)
insert:增
delete:删
update:改

3、DDL:
数据定义语言
凡是带有create、drop、alter的都是DDL。
DDL主要操作的是表的结构,不是表中的数据。
create:新建,等同于增
drop:删除
alter:修改
这个增删改和DML不同,这个主要是对表结构进行操作。

4、TCL:
事务控制语言
包括:
事务提交:commit
事务回滚:rollback

5、DCL:
数据控制语言
例如:授权grant、撤销权限:revoke……

表的创建(建表)

1、建表的语法格式(建表属于DDL语句,DDL包括:create、drop、alter)

create table 表名(
	字段名1 数据类型,
	字段名2 数据类型,
	字段名3 数据类型
);

表名:建议以t_或者tbl_开始,可读性强,见名知意。
字段名:见名知意。
表名和字段名都属于标识符

2、关于MySQL中的常见数据类型

varchar(最长255)
	可变长度的字符串
	比较智能,节省空间
	会根据实际的数据长度动态分配空间
	
	优点:节省空间
	缺点:需要动态分配空间,速度慢
	
char(最长255)
	定长字符串
	不管实际的数据长度是多少
	分配固定长度的空间去存储数据
	
	优点:不需要动态分配空间,速度快
	缺点:使用不恰当的时候,可能会导致空间的浪费

varchar和char应该怎么选择?
	如性别字段,因为性别是固定长度的字符串,所以选择char
	如姓名字段,因为每个人的名字长度都有可能不同,所以选择varchar
	
int(最长11)
	数字中的整数型
	
bigint
	数字中的长整型
float
	单精度浮点型数据
double
	双精度浮点型数据
date
	短日期类型
datetime
	长日期类型
clob
	字符大对象
	Character Large Object:CLOB
	比如:存储一篇文章,存储一个说明
	超过255个字符的都要采用CLOB字符大对象来存储
	
blob
	二进制大对象
	Binary Large Object
	专门用来存储图片、声音、视频等流媒体数据。
	往BLOB类型的字段上插入数据时,例如插入一个图片、视频等,需要使用IO流才行

3、创建一个简单的学生表

create table t_student(
	number int,
	name varchar(32),
	sex char(1) default 'm',  // 性别不写默认值为'm'
	age int(3),
	email varchar(255)
);

快速创建表(复制)

create table emp2 as select * from emp;
create table mytable as select empno,ename from emp where job = 'MANAGER';

原理:
	将一个查询结果当做一张表新建!
	这个可以完成表的快速复制!
	表创建出来,同时表中的数据也存在了!

在这里插入图片描述

4、删除表

drop table t_student; // 当这张表不存在时会报错!

// 如果这张表存在的话,删除,不存在也不会报错。
drop table if exists t_student;

5、insert插入数据

语法格式

insert into 表名(字段名1,字段名2,字段名3...) values(值1,值2,值3);

注意:字段名和值要一 一对应,数量要对应,数据类型要对应
insert语句但凡是执行成功了,那么必然会多一条记录。没有给其他字段指定值的话,默认值是NULL。
insert语句中的‘字段名’可以省略,但是省略字段名不写的话,就相当于写上了全部的字段名,值也要全部对应写上。
如:

insert into t_student(number,name,sex,age,email) values(1,'zhangsan','m',20,'zhangsan@123.com');
insert into t_student(email,name,sex,age,number) values('lisi@123.com','lisi','f',20,2);
insert into t_student(number) values(3);
insert into t_student(name) values('wangwu');

在这里插入图片描述
insert一次插入多条记录

语法格式:
	insert into t_user(字段名1,字段名2...) values(),(),();

insert into t_user(id,name,birth,create_time) values
(1,'zhangsan','1980-10-11',now()),
(1,'lisi','1981-10-11',now()),
(1,'wangwu','1982-10-11',now());

将查询结果插入到一张表中

insert into dept_bak select * from dept;  //很少用
注意:查询结果要符合表的结构!!!

insert插入日期

补充的函数
数字格式化 :format
用法:format(数字,‘格式’)
如:

select ename,format(sal,'$999,999') as sal from emp;

在这里插入图片描述

str_to_date:将字符串varchar类型转换成date类型
语法格式:
	str_to_date('字符串日期','日期格式')
通常使用在插入insert方面,因为插入的时候需要一个日期类型的数据,需要通过该函数将字符串转换成date
如果要输入的日期字符串的格式是“%Y-%m-%d”,那么str_to_date函数就不需要写了,MySQL会默认转换为日期类型。

MySQL的日期格式:
	%Y 年
	%m 月
	%d 日
	%h 时
	%i 分
	%s 秒

date_format:将date类型转换成具有一定格式的varchar字符串类型。
这个函数可以将日期类型转换成特定格式的字符串
语法格式
	date_format(日期类型数据,‘日期格式’)	
如:select id,name,date_format(birth,'%m/%d/%Y') as birth from t_user;

这个函数通常使用在查询日期方面,设置展示的日期格式
什么都不写,直接查询日期字段时,实际上也进行了日期格式化,自动将数据库中的date类型转换成varchar类型,并且采用的格式是MySQL默认的日期格式:'%Y-%m-%d'

在这里插入图片描述

6、date和datetime两个类型的区别

date是短日期,只包括年月日信息
datetime是长日期,包括年月日时分秒信息

MySQL短日期默认格式:%Y-%m-%d
MySQL长日期默认格式:%Y-%m-%d %h:%i:%s
在这里插入图片描述
在MySQL中怎么获取系统当前时间?

now()函数,并且获取的时间带有时分秒信息,是datetime类型的!!!

如:
在这里插入图片描述

7、修改update(DML)

语法格式:
	update 表名 set 字段名1 =值1,字段名2 =值2,字段名3 =值3 ...where 条件
注意:没有条件限制会导致所有数据全部更新

如:将学号为1人的名字修改为jack,生日修改为2000年,创建时间修改为当前时间。
update t_user set name='jack',birth='2000-10-01',create_time=now() where id = 1;	

在这里插入图片描述

8、删除数据 delete (DML)

语法格式:
	delete from 表名 where 条件;
注意:
	没有条件,整张表的数据会全部删除!
如:删除id为2的人
delete from t_user where id = 2;
delete from t_user; // 删除所有!

快速删除表中的数据【truncate还是比较重要的,掌握】

删除dept_bak表中的数据
delete from deptbak;  //这种删除数据的方式比较慢

delete语句删除数据的原理【delete属于DML语句!!】
表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不会被释放!
这种删除的缺点是:删除效率比较低
这种删除的优点是:支持回滚,后悔了可以再恢复数据!

truncate语句删除数据的原理
	这种删除效率比较高,表被一次截断,物理删除
	这种删除缺点:不支持回滚
	这种删除优点:快速

语法格式:
	truncate table dept_bak;(这种操作属于DDL操作)

大表非常大,上亿条记录
	删除的时候,使用delete,也许要执行1个小时才能删除完!效率较低。
	可以选择使用truncate删除表中的数据,只需要不到1秒的时间就删除结束,效率较高。
	但是使用truncate之前,必须仔细确认客户是否真的要删除,并警告删除之后不可恢复!
	truncate不能删单条数据,只能删除表中所有数据。

查询

简单查询

1、查询一个字段
select 字段名 from 表名;
如:查询部门名字
在这里插入图片描述
2、查询两个字段,或者多个字段
使用逗号“,”隔开
如:查询部门编号和部门名称
在这里插入图片描述
3、查询所有字段
第一种方式:把每个字段都写上
第二种方式:可以使用*,因为他会先将*转化为字段所以这种方式存在缺点(效率低、可读性差),在实际开发中不建议。
如:
在这里插入图片描述
4、给查询字段起别名
注意:只是将显示的查询结构列名显示为deptname,原表列名不会变,“select语句是永远都不会进行修改操作的,只负责查询”
在这里插入图片描述
as关键字可以省略掉
在这里插入图片描述

如果起别名时,别名中有空格,需要加引号
注意:单双引号都可以,但标准一般都是单引号
在所有数据库当中,字符串统一采用单引号括起来,单引号是标准,双引号在oracle数据库中用不了,但在mysql中都可以用
在这里插入图片描述
5、进行数学运算
如:计算员工年薪
在这里插入图片描述
如果别名为中文,用单引号括起来

条件查询

1、什么是条件查询
将符合条件的数据查询出来
语法格式:
select
字段1,字段2,字段3……
from
表名
where
条件;

2、都有哪些条件

= : 等于
如:查询薪资等于5000的员工姓名和编号
在这里插入图片描述
<> 或 != : 不等于
如:查询薪资不等于800的员工
在这里插入图片描述

<: 小于
如:查询薪资小于两千的员工
在这里插入图片描述

<= : 小于等于
如:查询薪资小于等于3000的员工
在这里插入图片描述

>: 大于
如:查询薪资大于3000的员工信息
在这里插入图片描述

>= : 大于等于
如:查询薪资大于等于3000的员工信息
在这里插入图片描述

between…and… : 两个值之间等同于 >= and <=
如:查询薪资在2450到3000的员工信息
第一种:>= and <=
在这里插入图片描述
第二种:between…and…
在这里插入图片描述
注意:使用between…and…时,必须遵循左小右大,而且是闭区间,包括两端的值

is null 为 null (is not null 不为空)
如:查询哪些员工的津贴/补助为null?
在这里插入图片描述
注意:在数据库中null不能使用等号进行衡量,需要使用is null,因为数据库当中的null代表什么也没有,它不是一个值,所以不能使用等号

如:查询哪些员工的津贴/补助不为null?
在这里插入图片描述

and:并且
如:查询工作岗位是MANAGER并且工资大于2500的员工信息?
在这里插入图片描述

or:或者
如:查询工作岗位是MANAGER和SALESMAN的员工
在这里插入图片描述
注意:

and和or同时出现的话,存在优先级问题,and优先级比or高,如果想让or先执行,需要加小括号

in:包含,相当于多个or(not in 不在这个范围中)
如:查询工作岗位是MANAGER和SALESMAN的员工
在这里插入图片描述
注意:

in不是一个区间,in后面跟的是具体的值

如:查询薪资是800和5000的员工信息
在这里插入图片描述
如:查询薪资不是800和5000的员工信息
在这里插入图片描述
like:模糊查询,支持%或_匹配
%:匹配任意个字符
_:任意一个字符
(%和_都是一个特殊字符)
如:找出名字中含有O的
在这里插入图片描述
如:找出名字以K开始的
在这里插入图片描述
如:找出第二个字母是A的
在这里插入图片描述
如:找出第三个字母是R的
在这里插入图片描述
如:找出学生表中名字中有‘_’的
在这里插入图片描述
注意:
查询带有特殊字符时需要转义

排序

1、查询所有员工薪资,排序(默认是升序)
在这里插入图片描述
2、薪资降序排序,指定升序:asc
在这里插入图片描述
3、按照两个或者字段排序
如:查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话,再按照名字升序排列
在这里插入图片描述
4、根据字段位置也可以排序
如:按照查询结果的第二列排序
在这里插入图片描述
注意:
了解即可,不建议在开发中这样写,因为不健壮,列的顺序很容易发生改变。

综合案例
找出工资在1250到3000之间的员工信息,要求按照薪资降序排列
在这里插入图片描述
执行顺序:
第一步:from
第二步:where
第三步:select
第四步:order by (排序总是在最后执行!)

数据处理函数

1、数据处理函数又被称为单行处理函数
单行处理函数的特点:一个输入对应一个输出
和单行处理函数相对的是多行处理函数(特点:多个输入,对应1个输出)
2、常见的单行处理函数

lower:转换小写
在这里插入图片描述

upper:转换大写
在这里插入图片描述

substr:取子串(substr(被截取的字符串,起始下标,截取的长度))
select substr(ename,1,1) from emp;
注意:起始下标从1开始,没有0
在这里插入图片描述
如:找出员工名字第一个字母是A的员工信息
第一种方式:模糊查询
在这里插入图片描述
第二种方式:substr函数
在这里插入图片描述
concat:字符串拼接
在这里插入图片描述
案例:首字母大写
在这里插入图片描述
length:取长度
在这里插入图片描述
trim:去空格
在这里插入图片描述
round:四舍五入

select ‘abc’ from emp; select后面直接跟"字面量/字面值",就会根据表的结构生成相对的字面值。
select后面可以跟某个表的字段名(等同看做变量名),也可以跟字面量/字面值(数据)。
如:
在这里插入图片描述
round用法:round(数字,保留小数位)
如:不保留小数
在这里插入图片描述
保留一位1位和2位小数
在这里插入图片描述
保留到十位和百位

保留到十位和百位
rand():生成随机数
在这里插入图片描述
生成100以内的随机数
在这里插入图片描述

ifnull:可以将null转换成一个具体值
注意: ifnull是空处理函数,专门处理空的,在所有的数据库当中,只要有NULL参与的数学运算,最终结果就是NULL
如:
在这里插入图片描述
ifnull用法:ifnull(数据,数据为null要替换的值)

如:计算每个员工的年薪?
年薪 = (月薪 + 月补助) * 12
在这里插入图片描述
case … when …than … when … than … else … end:当…如何…当…如何…否则…结束

如:当员工的工作岗位是MANAGER时,工资上调10%,当工作岗位是SALESMAN的时候,工资上调50%(注意:不修改数据库,只是将查询结果显示为工资上调)
在这里插入图片描述

分组函数(多行处理函数)

多行处理函数的特点:输入多行,最终输出一行

函数描述
count计数
sum求和
avg平均值
max最大值
min最小值

注意:分组函数在使用的时候必须先进行分组,然后才能用,如果你没有对数据进行分组,整张表默认为一组

如:找出最高工资
在这里插入图片描述

找出最低工资
在这里插入图片描述
求工资总和
在这里插入图片描述
求平均薪资
在这里插入图片描述
计算员工数量
在这里插入图片描述
注意事项:
第一点:
分组函数自动忽略null,不需要提前对null进行处理

第二点:
count(具体字段):表示统计字段下所有不为NULL的元素的综述
count(*):统计表当中的总行数。(只要这一行任意列有数据count就+1),因为每一行记录不可能都为NULL,一行数据中有一列不为NULL,则这行数据就是有效的。

第三点:分组函数不能直接使用在where子句中。

第四点:所有的分组函数可以组合起来一起用
如:
在这里插入图片描述

分组查询(非常重要)

1、什么是分组查询
在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。这个时候我们需要使用分组查询,如何进行分组查询
select
……
from
……
group by
……

2、将之间的关键字全部组合起来,找出执行顺序

select

from

where

group by

order by

以上关键字的顺序不能颠倒,需要记忆。
执行的顺序:
1、from
2、where
3、group by
4、select
5、order by

注意:
为什么分组函数不能直接在where后面使用呢?
因为分组函数在使用的时候必须先分组之后才能使用,where执行的时候还没有分组,所以where后面不能出现分组函数,select后面可以用分组函数,因为group by的执行顺序在select之前,如果没有写分组,默认将整张表分为一组。

3、案例
找出每个工作岗位的工资和
在这里插入图片描述

找出每个部门的最高薪资
在这里插入图片描述

找出每个部门,不同工作岗位的最高薪资
在这里插入图片描述
找出每个部门最高薪资,要求显示最高薪资大于3000的

having: 使用having可以对分完组之后的数据进一步过滤,having不能单独使用,having不能代替where,having必须和group by联合使用

方法一:where
在这里插入图片描述
方法二:having
在这里插入图片描述
优化策略: where和having,优先选择where,where实在完成不了,再选择having
比如:
找出每个部门平均薪资,要求显示平均薪资高于2500的
因为要求显示的是平均薪资高于2500,所以 需要在运算完后进行筛选,所以where完成不了,只能选择having
在这里插入图片描述
综上总结:
单表查询
select

from

where

group by

having

order by

以上关键字只能按照这个顺序来!不能颠倒!

执行顺序
1、from
2、where
3、group by
4、having
5、select
6、order by

案例: 找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER之外,要求按照平均薪资降序排序
在这里插入图片描述

重点结论:

在一条select语句当中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数,其他的一律不能跟。

注意
数据库当中是以表格的形式表示数据的,因为表比较直观。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值