用之前要连接好
打开一级目录:
USE xxxx;
关键词大写
选择列:
SELECT *
OR SELECT xxxx
前者选择所有列 ,后者选择 特定列
SELECT DISTINCT 选择的列没有重复元素
从哪选:
FROM xxx
指定按什么:
WHERE XXX = xxxx (有点像IF)
按什么排序:
ORDER BY xxxxx
ORDER BY XXXXX DESC : means 倒序
ORDER BY XX, XXX, ,将按照两个条件排序
AND优先级比OR高
IN
可以合并多个OR条件判断
按特定字符检索:
WHERE XXX LIKE 'xx%':
%分号可以表示任意字符 所以也可以这样用 %xx%
用下划线表示固定一个字符,几个字符就连用几个
如果把 LIKE 换成 REGEXP :即正则表达式
则在字符前加^表示以该字符串开头的搜索,以$结尾的 表示以该字符串结尾的字符搜索
搜索多个字符的 可在中间加 | 表示 or 的 意思,多个条件检索
[]e 想搜索某个以e结尾但前缀不明的 字符串,可以用[]然后在括号内加上想检索的
几种情形 同理向后也可以
假如想搜索 a到h 可以用 a-h
-- ^ beginning
-- $ end
-- | logical or
-- [abcd]
-- [a-f]
WHERE XX IS NULL 可用来查询空值
LIMIT Num ,限制前多少行记录:
LIMIT num,num 前者是偏移量,后者是提取的数
常用顺序
SELECT
FROM
WHERE
ORDER BY
LIMIT
FROM xx
JOIN xxx ON xxx
将两个表链接在一起 其中ON后面是条件判断语句
在FROM XX ABCD可以赋予XX的别称ABCD这样 字符长度长的时候就可以缩写了
当然 JOIN后面也可以
用 LEFT JOIN 表示外部链接
RIGHT JOIN 表示内部链接
显式链接与隐式链接
显式
FROM JOIN ON
隐式
FROM 两个表,WHERE xxxx
引用相同列缩写版
SELECT
o.order_id,
c.first_name
FROM orders o
JOIN customers c
-- ON o.customer_id = c.customer_id
USING (customer_id)
自然链接
不建议使用,易发生错误
交叉链接
SELECT
c.first_name AS customer,
p.name AS product
FROM customers c
CROSS JOIN products p
ORDER BY c.first_name
or:
FROM customers c,products p
ORDER BY c.first_name
UNION
UNION能链接两个查询记录,第一个查询末尾需要加半分号;
插入,更新,删除
设计模式:
PK : primary key
NN : not NULL
AI : auto increment 自动递增
插入:
INSERT INTO xx表 (各个key)
VALUES(实际插入的值)
内置函数:
LAST_INSERT_ID () 返回最后一个插入行的ID
数据从一张表复制到另一张表中:
首先创建表:
CREATE TABLE XXX AS
SELECT * FROM
更新:
UPDATE 某table
SET 需要更改的值
WHERE 接限定条件,一般限定PK.
删除:
DELETE FROM XXX
WHERE XXXXX
aggregate functions
COUNT usually not going include null value
if want to get the total number ,you will have to use COUNT of star
COUNT(*)
MAX MIN AVG SUM
And we can write an expression in parentheis ,when mysql try to excute the query
SELECT
SELECT 'first half of 2019' AS date_range
and the first columns' name is date_Range first row name is 'First half of 2019'
记个思路
如果某次需要展示自创的行列 可以如上所示,但是这列名都必须相同,
行名可以不同,然后用UNION链接起来
GROUP
GROUP BY clause can present each part
and usually after WHERE and before ORDER BY
HAVING clause
WE can use Having Clause to filter data after Group By clause
WHERE clause 可以过滤select之外的条件 而 having clause 不可以
ROLLUP
GROUP BY XXX WITH ROLLUP 可以多一个汇总值
但是ROLLUP 是mysql特有的函数
子查询
WHERE 套子查询的时候 左边的条件要在括号里 SELECT
SELECT里加子查询才能过滤多行,不然只有一行过滤出来的数据
ALL keyword
可用在比较时,大于一个整体过滤值组 而不用先求出这些值组的最大值
ANY语句
ANY语句与子查询IN相同 ,
ANY,SOME 父查询中的结果集大于子查询中任意一个结果集中的值,则为真
EXISTS 语句
EXISTS返回的是BOOL值,而IN语句返回的是一个值集合,当数据量庞大的时候显然用EXSITS语句更好些
对比如下
SELECT *
FROM clients c
WHERE client_id IN (
SELECT DISTINCT client_id
FROM invoices
)
SELECT *
FROM clients c
WHERE EXISTS (
SELECT client_id
FROM invoices
WHERE client_id = c.client_id
)
time format
需要经常查阅官方文档
DATE
DATE_ADD 和 DATE_SUB 可以加减时间
LIKE: SELECT DATE_ADD (NOW(),INTERVAL 1 DAY)
DATEDIFF FUNCTON 计算时间差 前面的时间差-后面的时间差
TIME_TO_SEC 时间转秒函数
IFNULL函数
可以重命名值为NULL 的列
IFNULL(xxxx,'xx') AS XXXXX
COALESCE函数
将null值替换为列第一个非null值
CONCAT
拼接函数名字段
IF 函数
IF(条件,TRUE,FALSE) AS XXX
CASE Operator
CASE
WHEN XXXXX THEN
WHEN XXXXX THEN
ELSE
END AS XXX
VIEW 创建视图
CREATE VIEW XXX AS
或者CREATE OR REPLACE VIEW
删除视图 DROP VIEW
在编码最后一句写 WITH CHECK OPTION可以保护视图
创建存储过程
DELIMITER
DELIMITER ;
删除存储过程
DROP PROCEDURE IF EXISTS XXXX; 这样可以保证更新能力
异常命名
SIGNAL SQLSTATE 'number' SET MESSAGE_TEXT = ''
网友评论