数据库操作DDL
创建
create database 数据库名
查询
show databases ; show database like '数据库名';
修改
alter database 数据库名 set 字段名 类型 约束;
删除
drop database 数据库名;
使用
use 数据库名;
数据库表操作DDL
创建
create table 表名(字段 类型 索引);
查看表结构
desc 表名;
复制数据表
create table 表名1 like 表名2;
复制表结构和数据
create table 表名1 as select * from 表2;
修改字段数据类型
alter table 表名 modify 字段名 数据类型;
修改字段名
alter table 表名 change <旧字段><新字段><数据类型>;
增加字段
alter table 表名 add<新字段><数据类型>;
删除字段
alter table 表名 drop<字段>;
删除
drop database 数据表;
数据操纵语句DML
insert插入数据
INSERT INTO <表名> [ <列名1> [ , … <列名n>] ]
VALUES (值1) [… , (值n) ];
update修改数据
UPDATE <表名> SET 字段1=值1 [,字段2=值2… ] [WHERE 子句 ] [LIMIT 子句]
UPDATE emp SET is_enable = 0 WHERE id = 1
delete删除数据
DELETE FROM <表名> [WHERE 子句] [LIMIT 子句]
DELETE FROM emp WHERE is_enable = 0;
执行顺序
from > on > join > where > group by > having > select > distinct > order by > limit
distinct去重数据
SELECT DISTINCT <字段名>,<字段名>, FROM <表名>;
- distinct只能在select语句中使用
- distinct必须在所有字段前面
- 如果有多个字段需要去重,则会对多个字段进行组合去重,即所有字段的数据重复才会被去重
as取别名
#as可省略
<表名> [AS] <别名>
<字段名> [AS] <别名>
select age as "年龄",sex"性别",username"姓名" from TableA as a
limit限制返回数量
LIMIT 初始位置,记录数 #初始位置从0开始
select * from Table limit 2,2; #从第3条记录开始返回2条
select * from Table limit 5 offset 1; #从第2条记录开始返回5条
order by对查询排序
ORDER BY <字段名> [,<字段名>...] [ASC | DESC] #默认ASC升序,DESC降序
select * from Table order by id desc, sex asc;
where条件查询
WHERE 查询条件
select * from Table where id = 1;
比较运算法:
=:等于
<=>:安全等于
!=、<>:不等于
<、>、<=、>=:小于、大于、小于等于、大于等于
逻辑运算符:
and、&&:所有查询条件均满足才会被查询出来
or、||:满足任意一个查询条件就会被查询出来
xor:满足其中一个条件,并且不满足另一个条件时,才会被查询出来
like模糊查询
LIKE '字符串'
NOT LIKE '字符串'
select * from Table where username like "%test%";
#%表示任意长度的字符串,包括0
#_表示单个字符,字符长度不能等于0
#匹配字符串必须加双引号或单引号
is null空值查询
IS NULL
IS NOT NULL
select * from Table where sex is null;
#is null是一个整体,不能用=null 替代
#is not null同理,不能用!= null或<>替代
between and范围查询
BETWEEN 取值1 AND 取值2
NOT BETWEEN 取值1 AND 取值2
select * from Table where age between 19 and 21;
group by分组查询
GROUP BY <字段名>[,<字段名>,<字段名>]
select count(*) from Table group by department;
#group by一般配合聚合函数使用count():统计记录的条数sum():字段值的总和max():字段值的最大值min():字段值的最小值avg():字段值的平均值
having过滤分组结果集
HAVING <查询条件>
#having关键字对group by分组后的数据进行过滤
select *from Table where sex = "1" group by department having department = "ART"
where | having |
---|---|
不可以使用聚合函数 | 可以使用聚合函数 |
数据 group by 前过滤 | 数据 group by 后过滤 |
查询条件中不可以使用字段别名 | 查询条件中可以使用字段别名 |
用于过滤数据行 | 用于过滤分组后的结果集 |
根据数据表的字段直接过滤 | 根据已查询出的字段进行过滤 |
多表查询
#cross join:交叉连接 两张表的笛卡尔积
SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE]
#inner join:内连接 两张表的交集,两张表记录都不为null才会返回
SELECT <字段名> FROM <表1> INNER JOIN <表2> [ON子句]
#left join:左外连接 表1为主表,右表为空字段补null
SELECT <字段名> FROM <表1> LEFT OUTER JOIN <表2> <ON子句>
#right join:右外连接 表2为主表,左表为空字段补null
SELECT <字段名> FROM <表1> RIGHT OUTER JOIN <表2> <ON子句>
#union、union all:全连接 获取左右两表的所有记录
#union 连接的每条 sql 指定的字段顺序最好一致
select * from emp as a left join dept as b on a.dept_id = b.id
union all
select * from emp as a right join dept as b on a.dept_id = b.id;
子查询
#字段、表名、查询条件都可以嵌套子查询
select <子查询> from <表名> where <查询条件>
select <字段> from <子查询> as <别名> where <查询条件>
select <字段> from <表名> where <子查询>