Skip to content
On this page

SQL语法总结

增加数据

sql
-- users表中新增数据 now()为当前时间
insert into users(username,create_time) values ('张三', now());
-- 批量插入
insert into users(username,create_time) values ('张三', now()),('李四', now());

修改数据

sql
-- 将users表中id=1数据的name和update_time字段,没有加where则修改整张表
update users set name="王五",update_time=now() where id=2;

删除数据

sql
-- 将users表中id=5的数据删除
delete from users where id=5;

查询数据

1. 基本查询

sql
-- 查询users表中的所有数据(性能低)
select * from 'users';
-- 查询users表中的username和password两个字段的数据
select username,password from 'users';
-- 查询users表中的username和password两个字段的数据,并起别名
select username as 用户名,password as 密码 from 'users';
-- 使用distinct查询users表中gander字段,并去掉重复的
select distinct gander from 'users';

2. 条件查询

sql
-- 查询name为张三的数据
select * from users where name='张三';
-- 查询count<=5的数据
select * from users where count<=5;
-- 查询username不为null的数据,相反则使用 is null
select * from users where username is not null;
-- 查询update_time在 '2000-01-01'到 '2010-01-01'之间的gander=2的数据
select * from users where update_time between '2000-01-01' and '2010-01-01' and gander=2;
-- 查询count=2或者count=3的数据
select * from users where count=2 or count=3;
-- 查询count=2或者3或者4的数据
select * from users where count in (2,3,4);
-- 查询name是2个字的数据
-- like为模糊匹配 _代表匹配单个字符 %代表匹配任意字符
select * from users where name like '__';
-- 查询name姓张的数据
select * from users where name like '张%';

3.聚合函数

将一列数据作为一个整体进行纵向计算,不对null运算。

sql
-- 计算总数
select count(*) from users;
-- 计算age最小值
select min(age) from users;
-- 计算age最大值
select max(age) from users;
-- 计算age平均值
select avg(age) from users;
-- 计算age之和
select sum(age) from users;

4.分组查询

执行顺序:where>聚合函数>having

sql
-- 根据gender字段进行分组
select gender,count(*) from users group by gender;
-- 查询年龄>=20并且根据gender字段分组,gender数量>=2的数据
select gender,count(*) from users where age>=20 group by gender having count(*)>=2;

5. 排序查询

sql
-- 查询users表中所有数据并且以status字段排序,默认为升序(ASC可省略不写)
select * from users order by status;
-- 查询users表中所有数据并且以id字段排序,desc为降序
select * from users order by id desc;
-- 查询users表中所有数据并且以status字段升序再以id降序
select * from users order by status,id desc;

6.分页查询

sql
-- 查询第1页数据,每页展示20条
select * from users limit 0,20;
-- 查询第2页数据,每页展示20条
select * from users limit 20,20;

外键

不推荐使用外键,建议使用代码逻辑实现表与表之间的关系

sql
alter table users
    add constraint jobs
        foreign key (job_id) references users (id);

多表查询

user和dept通过user表中的depId关联

sql
select * from user,dept where user.depId=dept.id;
# 给表起别名
select * from user u,dept d where u.depId=d.id;

内连接

内连接查询的是两个表中的交集数据,可能会出现查询数据不全的情况。语法: inner join ... on ...

sql
select * from user u inner join dept d on u.depId=d.id;

外连接

外连接分为左外链接和右外连接,左外连接会完全包含左表的数据,右左外连接会完全包含右表的数据,两者可以互转。

sql
select * from user u left out join dept d on u.depId=d.id;
# 相当于
select * from dept d right out join user u on u.depId=d.id;

自连接

自连接是指将一张表连接到自身,以便在查询中引用同一张表中的多个字段或行。

sql
select a.name,b.name from user a,user b where a.parentId=b.id;

联合查询

union all会查询出合并后的数据可能会有重复数据,一般直接使用 union

sql
select * from user where age>50
union
select * from user where sex=0;

子查询

  1. 标量子查询

    sql
    # 查询销售部门所有员工的数据
    select * from emp where dept_id=(select id from dept where name = '销售部');
  2. 列子查询

    操作符描述
    in在指定范围内
    not in不在指定范围内
    any有任意一条满足条件
    some同any
    all所有条件必须满足
    sql
    # 查询销售部和市场部所有员工的数据
    select * from emp where dept_id in (select id from dept where name = '销售部' or name= '市场部');
  3. 行子查询

    sql
    select * from emp where (salary,parent_id)=(select salary,parent_id from emp where name ='张三');
  4. 表子查询

    子查询查出来的是多行多列

    sql
    select * from emp where (salary,job)=(select salary,job from emp where name='张三' or name='李四');

事务

用户一组操作要么同时成功要么同时失败

sql
-- 开启事务
start transaction;
delete from users where id=1;
delete from jobs where job_id=1;
-- 提交事务
commit;
-- 回滚事务
rollback;

索引

sql
-- 创建索引
create index userage_index on users(name);
-- 查看索引
show index from users;
-- 删除索引
drop index userage_index on users;