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
模糊查询说明 :
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语句的基本语法。