常用SQL

DROP DATABASE if exists 旧库名;
CREATE DATABASE [if not exists] 库名 [default character set = 'utf8mb4'];

DROP TABLE [if exists] 表名;
CREATE TABLE 表名(
    字段名1 类型[(宽度)] [约束条件] [comment '字段说明'],
    字段名2 类型[(宽度)] [约束条件] [comment '字段说明'],
    字段名3 类型[(宽度)] [约束条件] [comment '字段说明']
)[表的⼀些设置];

--  修改表
ALTER TABLE 表名 rename [to] 新表名;
ALTER TABLE 表名 comment '新的备注信息';
ALTER TABLE 表名 ADD column 列名 类型 [列约束];
ALTER TABLE 表名 MODIFY column 列名 新类型 [约束];
ALTER TABLE 表名 CHANGE column 列名 新列名 新类型 [约束];
ALTER TABLE 表名 DROP column 列名;

--  添加索引
--      如果字段是char、varchar类型,length可以⼩于字段实际长度,
--      如果是blog、text等长⽂本类型,必须指定length。
CREATE [unique] INDEX 索引名称 ON 表名(列名[(length)]);
ALTER TABLE `TABLE_name` ADD PRIMARY KEY |UNIQUE  (`column1`, `column2`, `column3`);
ALTER TABLE `TABLE_name` ADD INDEX  index_name (`column1`, `column2`, `column3`);

--  修改索引
先删除,再创建

--  删除索引
DROP INDEX 索引名称 ON 表名;

--  只复制表结构
CREATE TABLE 表名 LIKE 被复制的表名;

--  复制表结构+数据
CREATE TABLE 表名 [AS] SELECT 字段,... FROM 被复制的表 [WHERE 条件];
例:CREATE TABLE test13 AS SELECT * FROM test11;

DML数据操作

--  插入数据,如果是字符型或⽇期类型,值需要⽤单引号引起来;如果是数值类型,不需要⽤单引号
INSERT INTO 表名 [(字段,字段)] VALUES (,)[,(,),(,)];

--  更新数据 【建议使用单表更新】
UPDATE 表名 [[AS] 别名] SET [别名.]字段 = ,[别名.]字段 =  [WHERE条件]
例: UPDATE test1 SET a = 1,b=2;
--  多表更新 【不建议】
UPDATE test1 t1,test2 t2 SET t1.a = 2 ,t1.b = 2, t2.c1 = 10 WHERE t1.a
= t2.c1;

--  删除数据 【建议使用单表删除】
DELETE [别名] FROM 表名 [[AS] 别名] [WHERE条件];
例:DELETE t1 FROM test1 t1 WHERE t1.a>100;
--  多表删除 【不建议】
DELETE [别名1,别名2] FROM 1 [[AS] 别名1],2 [[AS] 别名2] [WHERE条件];
例:DELETE t1[,t2] FROM test1 t1,test2 t2 H t1.a=t2.c2;

删除数据前先备份

  • 对于由 foreign key 约束引⽤的表,不能使⽤ truncate table,⽽应使⽤不带 WHERE ⼦句的 DELETE 语句
  • truncate ⽅式删除之后,⾃增列的值会被初始化
  • DELETE ⽅式要分情况(如果数据库被重启了,⾃增列值也会被初始化,数据库未被重启,则不变)
  • 删除速度,⼀般来说: drop > truncate > DELETE
  定义 是否释放空间 保留 别名 是否会触发trigger 生效时间
drop tableName 删除表的内容、定义、索引、触发器 释放空间 存储过程、函数,但状态会变为 invalid 删除表 不会 ⽴即⽣效
truncate tableName 清空表的内容 释放空间 表的定义、索引、触发器、存储过程、函数 清空表中的所有数据 不会 ⽴即⽣效
DELETE 删除表中的数据,每次删除一行 保留日志,方便回滚 表的定义、索引、触发器、存储过程、函数、未删除的数据 删除表中的行 事务提交之后才⽣效

查询

--  如果使用了 GROUP BY, 则 SELECT 后⾯出现的列必须在 group by中或者必须使⽤聚合函数   
SELECT 
    A.xx_id, A.xx_code, B.yy_code, count(A.id) as cnt,
    CASE <表达式>
        WHEN <1> THEN <操作>
        WHEN <2> THEN <操作>
        ...
        ELSE <操作>
    END CASE;
    CASE <表达式>
        WHEN <条件1> THEN <命令>
        WHEN <条件2> THEN <命令>
        ...
        ELSE <命令>
    END CASE;
    
    --  一对多的数据,groupBy后 拼接在一起
    IFNULL(GROUP_CONCAT(TAG.goods_sn, ':', TAG.tag, ';'),'') as '标签'
FROM table_a AS A
LEFT JOIN table_b AS B ON A.xx_id = B.xx_id
--  WHERE 条件顺序:
--      =匹配、IN匹配(建议小于500个元素)、NOT IN()、
--      范围匹配(>、<、>=、<=)、区间查询(BETWEEN AND, 等价于 >= AND <=)
--      NULL值专用查询:NOT NULL、IS_NULL
--      LIKE 'xx%'匹配,LIKE '%yy'匹配,%可以匹配⼀个到多个任意的字符,_可以匹配任意⼀个字符
--      不等匹配(推荐使用<>)
--      安全等于<=>(可用于null值比较,如: where t.a<=>null) 【不建议使用】
WHERE A.xx_code IN (code1,code2,code3) AND B.yy_code = code4
--  GROUP BY保证分页完整性(每页数据量相同), 
--  HAVING 对分组之后的数据进⾏过滤(HAVING count(id)>=2 或 HAVING cnt >= 2)
--  使用 GROUP BY 在 SELECT 中应有 聚合函数(count、sum、)
GROUP BY A.id,B.id [HAVING group_condition]
--  排序尽可能使用左表的字段并命中索引,
--  排序要避免二义性(排序规则使用的字段联合起来具有唯一性),
--  默认 ASC 可省略
ORDER BY A.create_at ASC
--  LIMIT 中不能使用表达式,只能跟明确的正整数
--  命令行脚本,尽可能使用 WHERE条件 使得 偏移量 = 0
--  偏移量默认 = 0 可省略
LIMIT [0,]20

CASE WHEN…THEN

SELECT id, 
    CASE
        WHEN cast(`status` AS SIGNED) < 45 
            THEN '1' 
        WHEN cast(`status` AS SIGNED) > 44 AND vacant_time IS NOT NULL AND vacant_time != '' 
            THEN '3'
        WHEN cast(`status` AS SIGNED) > 44 AND move_date IS NOT NULL AND move_date != '' 
            THEN '2'
        WHEN cast(`status` AS SIGNED) > 44 
            THEN '4'
        ELSE '99'
    END [CASE] AS `status`
    -- =前后不用有空格
    CASE 
        WHEN SPU.status='1' THEN '待做货'
        WHEN SPU.status='2' THEN '打版中'
        WHEN SPU.status='3' THEN '做货成功'
        WHEN SPU.status='4' THEN '移除'
        WHEN SPU.status='5' THEN '做货中'
        ELSE SPU.status
    END  as 'SPU状态',
FROM t_household 
WHERE  del_flag = '0';

mysql查询一个字段在哪些表中用到

SELECT 
    TABLE_SCHEMA as '数据库',
    TABLE_NAME as '表' ,
    COLUMN_NAME as '字段'
FROM information_schema.COLUMNS
WHERE COLUMN_NAME ='字段名';