MySQL基础命令


MySQL命令

基本MySQL语句结构

增删改数据

添加数据

-- 添加数据
-- 1.给指定字段添加数据
insert into 表名(字段1,字段2...) values(值1,值2...);

-- 2.给全部字段添加数据
insert into 表名 values(值1,值2...);

-- 3.批量添加数据
insert into 表名(字段1,字段2...) values(值1,值2...),(值1,值2...),(值1,值2...);
insert into 表名 values(值1,值2...),(值1,值2...),(值1,值2...);

注意 :

  • 插入数据时, 指定的字段顺序需要与值的顺序是一 一对应的
  • 字符串和日期型数据应该包含在引号中
  • 插入的数据大小, 应该在字段的规定范围内

修改数据

-- 修改数据
update 表名 set 字段名1 = 值1,字段名2 = 值2,... [where 条件];

注意 :

  • 修改语句的条件可以有, 也可以没有, 如果没有条件, 则会修改整张表的所有数据

删除数据

-- 删除数据
delete from 表名 [where 条件];

注意 :

  • delete 语句的条件可以有, 也可以没有, 如果没有条件, 则会删除整张表的所有数据
  • delete 语句不能删除某个字段的值(可以使用update)

查询数据

基本查询

-- 1.查询多个字段
select 字段1,字段2,字段3... from 表名;
select * from 表名;

-- 2.设置别名  as可以省略
select 字段1 [as 别名1],字段2 [as 别名2]... from 表名;

-- 3.去除重复记录
select distinct 字段列表 from 表名;
-例子 查询公司员工的上班地址(不要重复)
select distinct workaddress from emp;

条件查询 where

条件运算符

image-20220922160615215

模糊查询说明 :

select 字段列表 from 表名 where 条件列表;

-- eg:查询姓名为两个字的员工信息
select * from employee where name like '__';//两个_
-- eg:查询身份证号最后一位是X的员工信息
select * from employee where idcard like '%X'; 

分组查询 group by

select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];

where 与 having区别

  • 执行时机不同 : where是分组之前进行过滤, 不满足where条件, 不参与分组; 而having是分组之后对结果进行过滤
  • 判断条件不同 : where不能对聚合函数进行判断, 而having可以

注意 :

  • 执行顺序 : where > 聚合函数 > having
  • 分组之后, 查询的字段一般为聚合函数和分组字段, 查询其他字段无意义

例子

-- 1.根据性别分组,统计男性员工 和 女性员工的数量
select gender,count(*) from emp group by gender;

-- 2.查询年龄小于45的员工, 并根据工作地址分组, 获取员工数量大于等于3的工作地址
select workaddress,count(*) from emp where age < 45 group by workaddress having count(*) >= 3;

排序查询 order by

select 字段列表 from 表名 order by 字段1 排序方式1,字段2 排序方式2...;

-- 排序方式
# ASC 升序(默认值)
# DESC 降序
-- 如果是多字段排序, 只有当第一个字段值相同时, 才会根据第二个字段进行排序

例子

-- 1.根据年龄对公司的员工进行升序排序, 年龄相同, 再按照入职时间进行降序排序
select * from emp order by age asc, entrydate desc;

分页查询 limit

select 字段列表 from 表名 limit 起始索引,每页显示记录数;

注意 :

  • 起始索引从0开始, 起始索引 = (查询页码 - 1) * 每页显示记录数

    limit (查询页码 - 1)* 每页显示记录数,每页显示记录数
    
  • 分页查询是数据库的方言, 不同数据库有不同的实现

  • 如果查询的是第一页数据, 起始索引可以省略, 直接简写为limit 10;

例子

-- 1. 查询第二页员工数据,每页展示10条数据
select * from emp limit 10,10;

函数

聚合函数

将一列数据作为一个整体, 进行纵向计算

聚合函数

select 聚合函数(字段列表) from 表名;

注意 :

  • null值不参与所有聚合函数运算

字符串函数

字符串函数

例子

-- concat 
select concat('Hello', 'MySQL');

-- lower
select lower('Hello');

-- upper
select upper('Hello');

-- lpad
select lpad('01',5,'-');

-- rpad
select rpad('01',5,'-');

-- trim
select trim(' Hello MySQL ');

-- substring
select substring('Hello MySQL',1,5)

注意 :

  • substring 的起始位置是1

数值函数

数值函数

日期函数

日期函数

流程控制函数

可以在SQL语句中实现条件筛选, 从而提高语句的效率

流程控制函数

例子

-- if
select if(true,'Ok','Error');

-- ifnull
select ifnull('Ok','Default');

select ifnull(null,'Default'); -- 返回Default

-- 查询emp员工表的员工姓名和工作地址(北京\上海 ===> 一线城市 , 其他 === > 二线城市)
select
    name,
    (case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as '工作地址'
from emp;    

多表查询

消除笛卡尔积

-- 多表查询
select * from emp,dept where emp.dept_id = dept.id;

内连接

相当于查询A, B交集部分数据

-- 隐式内连接
select 字段列表 from 表1,表2 where 条件...;
-- 显式内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件...;

例子

-- 1.查询每一个员工的姓名, 及关联的部门的名字(隐式内连接实现)
-- 表结构: emp, dept
-- 连接条件: emp.dept_id = dept.id
select emp.name,dept.name from emp,dept where emp.dept_id = dept.id;

-- 2.查询每一个员工的姓名, 及关联的部门的名称(显式内连接实现)
-- 表结构: emp, dept
-- 连接条件: emp.dept_id = dept.id
select emp.name,dept.name from emp inner join dept on emp.dept_id = dept.id;

外连接

  • 左外连接 : 查询左表所有数据, 以及两张表交集部分数据
  • 右外连接 : 查询右表所有数据, 以及两张表交集部分数据
-- 左外连接
select 字段列表 from 表1 left [outer] join 表2 on 条件...;
-- 右外连接
select 字段列表 from 表1 right [outer] join 表2 on 条件...;

例子

-- 1.查询emp表的所有数据, 和对应的部门名称(左外连接)
-- 表结构: emp, dept
-- 连接条件: emp.dept_id = dept.id
select e.*,d.name from emp e left outer join dept d on e.dept.id = d.id;

-- 2.查询emp表的所有数据, 和对应的员工信息(右外连接)
select d.*,e.* from emp e right outer join dept d on e.dept.id = d.id;

自连接

当前表与自身的连接查询, 自连接必须使用表别名

-- 自连接查询, 可以是内连接查询,也可以是外连接查询
select 字段列表 from 表A 别名A join 表A 别名B on 条件...;

例子

-- 1. 查询员工 及其所属领导的名字
-- 表结构:emp
select a.name, name from emp a, emp b where a.managerid = b.id;

-- 2. 查询所有员工 emp 及其领导的名字 emp, 如果员工每页领导, 也需要查询出来(要使用外连接)
-- 表结构
select a.name '员工',b.name '领导' from emp a left join emp b on a.managerid = b.id;

联合查询

对于union查询, 就是把多次查询的结果合并起来, 形成一个新的查询结果集

select 字段列表 from 表A...
union [all]
select 字段列表 from 表B...;  

-- union all 是直接将结果合并, union 是将结果去重后合并

例子

-- 1.将薪资低于5000的员工 和年龄大于50岁的员工全部查询出来

select * from emp where salary < 5000
union all
select * from emp where age > 50;

注意 :

  • 对于联合查询的多张表的列数必须保持一致, 字段类型也需要保持一致

子查询

sql语句中嵌套select语句, 称为嵌套查询, 又称子查询

select * from t1 where column1 = (select column1 from t2);
-- 子查询外部的语句可以 insert / update / delete / select 的任何一个

例子

-- 标量子查询
-- 常用的操作符 : =, <>, >, <, >=, <=

-- 查询"销售部"的所有员工信息
-- a.查询'销售部'部门ID
select id from dept where name = '销售部';
-- b.根据销售部部门ID,查询员工信息
select * from emp where dept_id = 4;

-- 把a b两部嵌套在一起,形成子查询
select * from emp where dept_id = (select id from dept where name = '销售部');

-- 列子查询
-- 常用的操作符 : in, not in, any, some, all

-- 查询比 财务部 所有人工资都高的员工信息
-- a.查询所有 财务部 人员工资
select salary from emp where dept_id = (select id from dept where name = '财务部';);
-- b.比 财务部 所有人工资都高的员工信息
select * from emp where salary > all (select salary from emp where dept_id = (select id from dept where name = '财务部'));

-- 行子查询
-- 常用的操作符 : =, <>, in, not in

-- 查询与"张无忌"的薪资及直属领导相同的员工信息
-- a.查询"张无忌"的薪资及直属领导
select salary,managerid from emp where name = '张无忌';
-- b.查询"张无忌"的薪资及直属领导
select * from emp where (salary,managerid) = (12500,1);

-- 把a b两部嵌套在一起,形成子查询
select * from emp where (salary,managerid) = (select salary,managerid from emp where name = '张无忌');

-- 表子查询
-- 常用的操作符 :in

-- 查询与"鹿杖客", "宋远桥" 的职位和薪资相同的员工信息
-- a.查询"鹿杖客", "宋远桥" 的职位和薪资
select job,salary from emp where name = '鹿杖客' or name = '宋远桥';
-- b.查询与"鹿杖客", "宋远桥" 的职位和薪资相同的员工信息
select * from emp where (job,salary) in (elect job,salary from emp where name = '鹿杖客' or name = '宋远桥');

-- 查询入职日期是"2006-01-01"之后的员工信息, 及部门信息(把子查询的结果作为一张表来和另一张表进行联合查询)
-- a.入职日期是"2006-01-01"之后的员工信息
select * from emp where entrydate > '2006-01-01';
-- b.查询这部分员工, 对应的部门信息
select e.*,d.* from (select * from emp where entrydate > '2006-01-01') e left join dept d on e.dept_id = d.id;

注意 :

根据子查询的结果不同, 分为 :

  • 标量子查询 (子查询结果为单个值)
  • 列子查询 (子查询结果为一列)
  • 行子查询 (子查询结果为一行)
  • 表子查询 (子查询结果为多行多列)

根据子查询位置, 分为 : where之后, from之后, select之后

总结

罗列了MySQL语句的基本语法。


文章作者: 冬瓜冬瓜排骨汤
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 冬瓜冬瓜排骨汤 !
  目录