温故知新-MYSQL-语法

查询数据

  • SELECT

  • SELECT DISTINCT

去重查询

基础用法:

SELECT DISTINCT lastname FROM employees ORDER BY lastname;
列中有NULL值:只保留一个NULL值;

 在多个列上使用:使用所有列的组合来确定结果集中行的唯一性(按组合唯一去重);

 和GROUP BY的比较:DISTINCT是GROUP BY的特殊情况,GROUP BY效率高于DISTINCT

 查询非重复项的所有列:

SELECT *,count(DISTINCT lastname) FROM employees;
可以在列上使用count(),sum()等聚合函数;

 可以搭配order by、limit使用;

过滤数据

  • WHERE

使用=,!=,<>,>,<,>=,<=,between,like,in,is null等条件过滤数据

  • AND

  • OR

AND和OR的短路求值功能:遇到可以确定的结果时,忽略后面的表达式,例如:

SELECT 1 = 0 AND 1 / 0 ;
SELECT 1 = 1 OR 1 / 0;
  • IN/NOT IN

  • BETWEEN/NOT BETWEEN

between包含边界,即>=,<=,not between不包含边界,即<,>

  • LIKE

通配符:%(百分号)匹配零个或多个字符,_(下划线)匹配单个字符

\(反斜杠)转义%和_

  • LIMIT

  • IS NULL/IS NOT NULL

    使用is null可以使查询命中索引。(普通的=条件在有空值时索引会失效)
    

数据排序

ORDER BY

  • 普通列排序(略)

  • 表达式排序:

SELECT a*b as total FROM table_1 ORDER BY total DESC;

  • 自定义排序顺序:FIELD()函数
SELECT 
    orderNumber, statusFROM
    ordersORDER BY FIELD(status,
        'In Process',
        'On Hold',
        'Cancelled',
        'Resolved',
        'Disputed',
        'Shipped');

连接表

  • AS

列别名:

SELECT [column_1 | expression] AS descriptive_nameFROM table_name;

可以在ORDER BY,GROUP BY,HAVING子句中使用别名(WHERE中不行)

表别名:一般用在连接中

  • INNER JOIN

  • LEFT JOIN

  • RIGHT JOIN

三种连接的区别:

        left join返回包括左表中的所有记录和右表中联结字段相等的记录,右表中不存在的记录字段填null

        right join返回包括右表中的所有记录和左表中联结字段相等的记录,左表中不存在的记录字段填null

        Inner join只返回两个表中联结字段相等的行,不满足条件的行不展示
  • 自连接

通过inner join或left join把一个表连接到自身(必须使用别名)

分组数据

  • GROUP BY

    多个字段分组:根据多个字段的唯一组合分组

    与聚合函数组合使用:计算每一个分组的相关信息

SELECT status, COUNT(*) AS total_number FROM orders GROUP BY status;   //计算每个状态下订单数量
SELECT status, SUM(quantityOrdered * priceEach) AS amount FROM
    orders INNER JOIN
    orderdetails USING (orderNumber) GROUP BY status;                       //从别的表里获取订单详情,再求得该组订单的总金额
SELECT YEAR(orderDate) AS year,
    SUM(quantityOrdered * priceEach) AS total
    FROM orders INNER JOIN
    orderdetails USING (orderNumber)
    WHERE status = 'Shipped'GROUP BY year
    HAVING year > 2013;                                                           //和HAVING子句组合使用

可以对分组进行排序,默认升序,降序:GROUP BY status DESC

  • HAVING

和GROUP BY组合使用,过滤每组数据;

和WHERE的区别:WHERE过滤每行数据

子查询,派生表,通用表达式

FROM子句中的子查询:把查询出来的结果集当做一个派生表,从派生表中查询数据;

WHERE条件中的子查询:把查询出来的结果集当做WHERE条件使用。单个结果用>,<,=等条件,多个结果用in条件

通用表达式:可重复使用,可递归

WITH cte_name AS (
    query)   //此处为查询语句
 SELECT * FROM cte_name;

UNION,UNION ALL,模拟INTERSECT

UNION,UNION ALL取两个查询结果集的并集,区别是UNION去重,UNION ALL不去重

mysql不支持INTERSECT(交集)语法,只能模拟,有以下两种办法:

  1. DISTINCT + INNER JOIN

  2. IN + 子查询

修改数据

  • INSERT
INSERT INTO table_1SELECT c1, c2, FROM table_2;    //从table_2复制数据到table_1
INSERT INTO tasks(task_id,subject,start_date,end_date,description)
VALUES (4,'Test ON DUPLICATE KEY UPDATE','2017-01-01','2017-01-02','Next Priority')
ON DUPLICATE KEY UPDATE //主键重复时插入,更新原来的值或者插入新行
task_id = task_id + 1, 
subject = 'Test ON DUPLICATE KEY UPDATE';
  • INSERT IGNORE 插入时忽略错误的行

  • UPDATE

  • UPDATE JOIN

连表更新:

UPDATE T1, T2,
[INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1
SET T1.C2 = T2.C2, 
    T2.C3 = expr
    WHERE condition
上面的查询等价于:
UPDATE T1, T2SET T1.c2 = T2.c2,
      T2.c3 = expr WHERE T1.c1 = T2.c1 AND conditio
  • DELETE

使用LIMIT删除有限条数据。配合ORDER BY使用。

  • ON DELETE CASCADE

在外键约束定义的末尾加上这个子句,父表数据删除时会自动删除子表的相关数据

  • DELETE JOIN

注意inner join和left join的区别

  • REPLACE

有则update,没有则insert

  • PREPARE

使用占位符执行语句。

  1. 避免注入

  2. 提高效率

表锁

LOCK TABLES table_name [READ | WRITE];
UNLOCK TABLES;

持有READ锁的会话只能读取数据不能写入数据,其他会话在释放READ锁之前无法将数据写入表中。来自另一个会话的写操作将被放入等待状态,直到释放READ锁;

如果会话正常或异常终止,MySQL将会隐式释放所有锁;

WRITE锁同理;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

  • 8.0MySQL常见语法: #启动mysql服务器:net start mysql #关闭:net stop my...
    骑小猪看流星阅读 1,315评论 1 20
  • 万丈高楼平地起 一、基本概念 数据库术语 数据库(database) - 保存有组织的数据的容器(通常是一个文件或...
    赵客缦胡缨v吴钩霜雪明阅读 1,802评论 1 38
  • 一、SQL速成 结构查询语言(SQL)是用于查询关系数据库的标准语言,它包括若干关键字和一致的语法,便于数据库元件...
    shadow雨轩阅读 514评论 0 3
  • 1 锁引介绍 官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能...
    IT雪山阅读 614评论 0 1
  • 一、基本概念 数据库术语 数据库(database) - 保存有组织的数据的容器(通常是一个文件或一组文件)。 数...
    cisonRen阅读 1,312评论 0 2