常用的MySQL语句写法
MySQL 的 SQL 语句写法,除了那些基本的之外,还有一些也算比较常用的,这里记录下来,以便以后查找。好记性不如烂笔头,这话说的太有道理了,一段时间不写它,还真容易忘记。大家不要纠结这些 SQL 语句包含的业务或是其它问题,本文只是一篇笔记而已。
将数据从 T1 表导入到 T2 表
INSERT
INTO T2 (C1,C2)
SELECT C1,C2
FROM T1
[
WHERE C1 = XX AND C2 = XX ORDER BY C1
]
使用 T2 表的 NAME 来更新 T1 表的 NAME
UPDATE T1
AS A, T2
AS B
SET A.NAME
= B.NAME
WHERE A.TID
= B.ID
两表的关联更新
UPDATE T_ROLE_USER
AS A,
(
SELECT
ID
FROM
T_USER
WHERE
DEPARTID IN (
SELECT
ID
FROM
T_DEPART
WHERE
LENGTH(ORG_CODE) = 9
)
) AS B
SET A.ROLEID = ' 123456 '
WHERE
A.USERID = B.ID
(
SELECT
ID
FROM
T_USER
WHERE
DEPARTID IN (
SELECT
ID
FROM
T_DEPART
WHERE
LENGTH(ORG_CODE) = 9
)
) AS B
SET A.ROLEID = ' 123456 '
WHERE
A.USERID = B.ID
自己和自己关联更新
UPDATE T_DEPART
AS A,
(
SELECT
ID,
SUBSTRING(ORG_CODE, 1, 6) ORG_CODE
FROM
T_DEPART
WHERE
LENGTH(ORG_CODE) = 8
AND PARENT_DEPART_ID IS NOT NULL
) AS B
SET A.PARENT_DEPART_ID = B.ID
WHERE
SUBSTRING(A.ORG_CODE, 1, 6) = B.ORG_CODE
(
SELECT
ID,
SUBSTRING(ORG_CODE, 1, 6) ORG_CODE
FROM
T_DEPART
WHERE
LENGTH(ORG_CODE) = 8
AND PARENT_DEPART_ID IS NOT NULL
) AS B
SET A.PARENT_DEPART_ID = B.ID
WHERE
SUBSTRING(A.ORG_CODE, 1, 6) = B.ORG_CODE
两表关联删除,将删除两表中有关联 ID 并且 T2 表 NAME 为空的两表记录
DELETE A,B
FROM T1
AS A
LEFT
JOIN T2
AS B
ON A.TID
= B.ID
WHERE B.NAME
IS
NULL
将统计结果插入到表
INSERT
INTO SE_STAT_ORG (
RECORD_DATE,
ORG_ID,
ORG_NAME,
SIGN_CONT_COUNT,
SIGN_ARRI_CONT_COUNT,
SIGN_CONT_MONEY,
SIGN_ARRI_CONT_MONEY,
TOTAL_ARRI_CONT_COUNT,
TOTAL_ARRI_MONEY,
PUBLISH_TOTAL_COUNT,
PROJECT_COUNT
) SELECT
*
FROM
(
SELECT
' 2012-06-09 ' RECORD_DATE,
PARENT_ORG_ID,
PARENT_ORG_NAME,
SUM(SIGN_CONT_COUNT) SIGN_CONT_COUNT,
SUM(SIGN_ARRI_CONT_COUNT) SIGN_ARRI_CONT_COUNT,
SUM(SIGN_CONT_MONEY) SIGN_CONT_MONEY,
SUM(SIGN_ARRI_CONT_MONEY) SIGN_ARRI_CONT_MONEY,
SUM(TOTAL_ARRI_CONT_COUNT) TOTAL_ARRI_CONT_COUNT,
SUM(TOTAL_ARRI_MONEY) TOTAL_ARRI_MONEY,
SUM(PUBLISH_TOTAL_COUNT) PUBLISH_TOTAL_COUNT,
SUM(PROJECT_COUNT) PROJECT_COUNT,
FROM SE_STAT_USER
WHERE DATE_FORMAT(RECORD_DATE, ' %Y-%m-%d ') = ' 2012-06-09 '
GROUP BY PARENT_ORG_ID
) M
RECORD_DATE,
ORG_ID,
ORG_NAME,
SIGN_CONT_COUNT,
SIGN_ARRI_CONT_COUNT,
SIGN_CONT_MONEY,
SIGN_ARRI_CONT_MONEY,
TOTAL_ARRI_CONT_COUNT,
TOTAL_ARRI_MONEY,
PUBLISH_TOTAL_COUNT,
PROJECT_COUNT
) SELECT
*
FROM
(
SELECT
' 2012-06-09 ' RECORD_DATE,
PARENT_ORG_ID,
PARENT_ORG_NAME,
SUM(SIGN_CONT_COUNT) SIGN_CONT_COUNT,
SUM(SIGN_ARRI_CONT_COUNT) SIGN_ARRI_CONT_COUNT,
SUM(SIGN_CONT_MONEY) SIGN_CONT_MONEY,
SUM(SIGN_ARRI_CONT_MONEY) SIGN_ARRI_CONT_MONEY,
SUM(TOTAL_ARRI_CONT_COUNT) TOTAL_ARRI_CONT_COUNT,
SUM(TOTAL_ARRI_MONEY) TOTAL_ARRI_MONEY,
SUM(PUBLISH_TOTAL_COUNT) PUBLISH_TOTAL_COUNT,
SUM(PROJECT_COUNT) PROJECT_COUNT,
FROM SE_STAT_USER
WHERE DATE_FORMAT(RECORD_DATE, ' %Y-%m-%d ') = ' 2012-06-09 '
GROUP BY PARENT_ORG_ID
) M
三表关联更新
UPDATE SE_STAT_USER A,
(
SELECT
USER_ID,
SUM(INVEST_ORG_COUNT + FINANCIAL_ORG_COUNT + INTERMEDIARY_ORG_COUNT + ENTERPRISE_COUNT) AS COMMON_COUNT
FROM SE_STAT_USER
WHERE DATE_FORMAT(RECORD_DATE, ' %Y-%m-%d ') = ' 2012-06-09 '
GROUP BY USER_ID
) B,
(
SELECT
USER_ID,
SUM(ESTABLISH_COUNT + STOCK_COUNT + MERGER_COUNT + ACHIEVE_COUNT) AS PROJECT_COUNT
FROM SE_STAT_USER
WHERE DATE_FORMAT(RECORD_DATE, ' %Y-%m-%d ') = ' 2012-06-09 '
GROUP BY USER_ID
) C
SET A.COMMON_COUNT = B.COMMON_COUNT, A.PROJECT_COUNT = C.PROJECT_COUNT
WHERE A. USER_ID = B. USER_ID
AND A. USER_ID = C. USER_ID
AND DATE_FORMAT(A.RECORD_DATE, ' %Y-%m-%d ') = ' 2012-06-09 '
(
SELECT
USER_ID,
SUM(INVEST_ORG_COUNT + FINANCIAL_ORG_COUNT + INTERMEDIARY_ORG_COUNT + ENTERPRISE_COUNT) AS COMMON_COUNT
FROM SE_STAT_USER
WHERE DATE_FORMAT(RECORD_DATE, ' %Y-%m-%d ') = ' 2012-06-09 '
GROUP BY USER_ID
) B,
(
SELECT
USER_ID,
SUM(ESTABLISH_COUNT + STOCK_COUNT + MERGER_COUNT + ACHIEVE_COUNT) AS PROJECT_COUNT
FROM SE_STAT_USER
WHERE DATE_FORMAT(RECORD_DATE, ' %Y-%m-%d ') = ' 2012-06-09 '
GROUP BY USER_ID
) C
SET A.COMMON_COUNT = B.COMMON_COUNT, A.PROJECT_COUNT = C.PROJECT_COUNT
WHERE A. USER_ID = B. USER_ID
AND A. USER_ID = C. USER_ID
AND DATE_FORMAT(A.RECORD_DATE, ' %Y-%m-%d ') = ' 2012-06-09 '
带条件的关联更新
UPDATE SE_STAT_USER A,
(
SELECT
P.CHANNEL,
COUNT(P.CONT_ID) AS CONT_COUNT,
C.CUST_MGR_ID
FROM
(
SELECT
CHANNEL,
CONT_ID
FROM SK_PROJECT
WHERE PROJECT_STATUS = 6
AND DATE_FORMAT(AUDIT_TIME, ' %Y-%m-%d ') = ' 2012-06-11 '
) p
INNER JOIN SE_CONTRACT C ON P.CONT_ID = C.CONT_ID
GROUP BY P.CHANNEL, C.CUST_MGR_ID
) B
SET
A.STOCK_COUNT = CASE WHEN B.CHANNEL = 2 THEN B.CONT_COUNT ELSE 0 END,
A.ESTABLISH_COUNT = CASE WHEN B.CHANNEL = 3 THEN B.CONT_COUNT ELSE 0 END,
A.ACHIEVE_COUNT = CASE WHEN B.CHANNEL = 4 THEN B.CONT_COUNT ELSE 0 END,
A.BRAND_COUNT = CASE WHEN B.CHANNEL = 5 THEN B.CONT_COUNT ELSE 0 END,
A.MERGER_COUNT = CASE WHEN B.CHANNEL = 6 THEN B.CONT_COUNT ELSE 0 END
WHERE
A. USER_ID = B.CUST_MGR_ID
AND DATE_FORMAT(A.RECORD_DATE, ' %Y-%m-%d ') = ' 2012-06-11 '
(
SELECT
P.CHANNEL,
COUNT(P.CONT_ID) AS CONT_COUNT,
C.CUST_MGR_ID
FROM
(
SELECT
CHANNEL,
CONT_ID
FROM SK_PROJECT
WHERE PROJECT_STATUS = 6
AND DATE_FORMAT(AUDIT_TIME, ' %Y-%m-%d ') = ' 2012-06-11 '
) p
INNER JOIN SE_CONTRACT C ON P.CONT_ID = C.CONT_ID
GROUP BY P.CHANNEL, C.CUST_MGR_ID
) B
SET
A.STOCK_COUNT = CASE WHEN B.CHANNEL = 2 THEN B.CONT_COUNT ELSE 0 END,
A.ESTABLISH_COUNT = CASE WHEN B.CHANNEL = 3 THEN B.CONT_COUNT ELSE 0 END,
A.ACHIEVE_COUNT = CASE WHEN B.CHANNEL = 4 THEN B.CONT_COUNT ELSE 0 END,
A.BRAND_COUNT = CASE WHEN B.CHANNEL = 5 THEN B.CONT_COUNT ELSE 0 END,
A.MERGER_COUNT = CASE WHEN B.CHANNEL = 6 THEN B.CONT_COUNT ELSE 0 END
WHERE
A. USER_ID = B.CUST_MGR_ID
AND DATE_FORMAT(A.RECORD_DATE, ' %Y-%m-%d ') = ' 2012-06-11 '
加索引
ALTER
TABLE PROJECT
ADD
INDEX INDEX_USER_ID (
USER_ID),
ADD INDEX INDEX_PROJECT_STATUS (PROJECT_STATUS);
ADD INDEX INDEX_PROJECT_STATUS (PROJECT_STATUS);
删除列
ALTER
TABLE PROJECT
DROP
COLUMN PROJECT_STATUS,
DROP COLUMN EXPECT_RETURN, DROP COLUMN CURRENCY;
DROP COLUMN EXPECT_RETURN, DROP COLUMN CURRENCY;
增加列
ALTER
TABLE PROJECT
ADD COLUMN DICT_ID INT DEFAULT NULL COMMENT ' xxx ' AFTER PROJECT_SITE,
ADD COLUMN INTRODUCE TEXT DEFAULT NULL COMMENT ' xx ' AFTER DICT_ID,
ADD COLUMN STAGE INT DEFAULT NULL COMMENT ' xx ' AFTER ID,
ADD COLUMN ATTACH_URI VARCHAR( 8) DEFAULT NULL COMMENT ' xxx ' AFTER INTRODUCE;
ADD COLUMN DICT_ID INT DEFAULT NULL COMMENT ' xxx ' AFTER PROJECT_SITE,
ADD COLUMN INTRODUCE TEXT DEFAULT NULL COMMENT ' xx ' AFTER DICT_ID,
ADD COLUMN STAGE INT DEFAULT NULL COMMENT ' xx ' AFTER ID,
ADD COLUMN ATTACH_URI VARCHAR( 8) DEFAULT NULL COMMENT ' xxx ' AFTER INTRODUCE;
修改列,一般用 MODIFY 修改数据类型, CHANGE 修改列名
ALTER
TABLE PROJECT
CHANGE DICT_ID DICT_ID1
INT
NOT
NULL,
MODIFY PROJECT_STATUS TINYINT NOT NULL COMMENT ' xxx ';
MODIFY PROJECT_STATUS TINYINT NOT NULL COMMENT ' xxx ';