mysql 常用语句一览表

操作表数据,增删改查

  • 查询
select * from table;
select id,name,age from table;
select * from table where id = '2323';
select * from table order by id asc; -- 排序默认 a-z
select * from table order by id desc;
select * from table where name like '%xu%';
select * from table where index  != 0;
select * from table where sex = 'man' and age = 18;
select * from table where age = 18 or age = 20;
select * from table where id in (10,11);
select * from table where id not in (10,11);
select * from table where name REGEXP 'xu|zhao'; --正则
select * from table where phone REGEXP '[0-9]{11}'; --正则
  • 新增
-- 新增单行
INSERT INTO table(age, name, sex) VALUES(18, 'tom', 'man'); 
-- 新增多行
INSERT INTO table(age, name, sex) VALUES(18, 'tom', 'man'),(18, 'may', 'man');
-- selected 其他表数据插入
INSERT INTO table(age, name, sex) select age,name,sex from otherTable;
  • 更新
update tabel set age = 30 where id=123;
update tabel set age = 30,sex = 'women' where id=123;
update IGNORE tabel set age = 30,sex = 'women' where id=123; -- 忽略错误
  • 删除
delete from table  where id=123;
-- 删除表中所有行
TRUNCATE TABLE;

更快的删除 如果想从表中删除所有行,不要使用DELETE。可使用TRUNCATE TABLE语句,它完成相同的工作,但速度更快(TRUNCATE实际是删除原来的表并重新创建一个表,而不是逐行删除表中的数据)。

操作表结构,增删改查

一般使用数据库管理工具创建表,更便捷;并谨慎更改表结构

  • 新增/创建表
CREATE TABLE tableName (age int null,name var(50) null, sex var(50) null);
  • 更新表
ALTER TABLE table add score init; --新增列
ALTER TABLE table drop column age; --删除列
  • 删除表
DROP TABLE table;  --谨慎使用
  • 重命名表
RENAME TABLE table TO otherTableName;

操作视图,增删改查

视图是虚拟的表,理解为公共函数。视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的数据。视图的最常见的应用之一是隐藏复杂的SQL,例如连表查询。

  • 查询视图

    直接当作普通表来使用,一般是查询;因为视图主要用于数据检索
select * from viewName;
  • 新增视图
CREATE VIEW viewName AS select * from table;
  • 更新视图

但是,并非所有视图都是可更新的。基本上可以说,如果MySQL不能正确地确定被更新的基数据,则不允许更新(包括插入和删除); 更新视图意义不大,不如直接创建一个新的视图。

  • 删除视图
DROP VIEW viewName;

连表查询

SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)表。联结是利用SQL的SELECT能执行的最重要的操作.

  • 笛卡儿积
select * from table1,table2; 
-- 查询出的结果行数量是:table1.length * table2.length;
  • inner join on 内连接
select * from table1 INNER JOIN table2 ON table1.id = table2.id; 
  • outer join on 外链接
select * from table1 OUTER JOIN table2 ON table1.id = table2.id; 
  • 联结多个表

考虑性能,连接的表不应该过多,超过3个表时,就应该考虑表结构设计是否合理

select * from table1,table2,table3 where talbe1.id = table2.id AND talbe2.id = table3.id; 
  • 使用表别名
select * from table1 AS a,table2 AS b where a.id = b.id; 
  • 自联结
select * from table1 where name = (select name from table1 where id=123);
-- 第二种写法
select * from table1 AS t1, table1 AS t2 where t1.id = t2.id and t1.id = 123;

数据分组 group by

一般配合聚合函数来处理分组,例如:求平均数、最大值、最小值


image.png
-- 求男生的平均年龄
selecte *,avg(age) age avgAge from table group by sex HAVING sex = 'man';
-- HAVING HAVING非常类似于WHERE。事实上,目前为止所 学过的所有类型的WHERE子句都可以用HAVING来替代.
-- 例如求男生中分数及格的平均年龄:
group by sex HAVING sex = 'man' and score > 60;

使用子查询

SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询。

  • 使用计算属性
SELECT 
    *,
    (SELECT 
            COUNT(*)
        FROM
            apago_top.ariticle AS t1,
            apago_top.ariticle_preview AS t2
        WHERE
            t1.id = t2.id AND t2.acttype = '阅读') AS previewNum,
             (SELECT 
            COUNT(*)
        FROM
            apago_top.ariticle AS t1,
            apago_top.ariticle_preview AS t2
        WHERE
            t1.id = t2.id AND t2.acttype = '点赞') AS likeNum,
             (SELECT 
            COUNT(*)
        FROM
            apago_top.ariticle AS t1,
            apago_top.ariticle_preview AS t2
        WHERE
            t1.id = t2.id AND t2.acttype = '评论') AS commentNum
FROM
    apago_top.ariticle;
  • 使用子查询数据作过滤
-- 普通写法
select * from table where age in [16,17,18];
-- 当[16,17,18] 值在其他表时,就需要使用子查询
select * from table where age in (select age from otherTable);

组合查询 UNION

MySQL也允许执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回.这些组合查询通常称为并( union )或复合查询(compound query);UNION从查询结果集中自动去除了重复的行;

-- 多个where and 转为组合查询
select * from table where sex = 'man' and age = 18;
-- 组合查询. 
select * from table where sex = 'man'
UNION
select * from table where age = 18;

数据处理函数

  • 字符串处理函数
  • date 日期类型处理函数
  • 数值处理函数

具体使用时,再查文档

触发器,增删

触发器(参考勾子函数)是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句):DELETE、INSERT、UPDATE;其他MySQL语句不支持触发器;配合 AFTER/BEFORE 一个表最多6种触发器。

  • 触发器中虚拟表
在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行
在DELETE触发器代码内,你可以引用一个名为OLD的虚拟表,访问被删除的行
在UPDATE触发器代码中
-- 你可以引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,
-- 引用一个名为NEW的虚拟表访问新更新的值
  • 新增触发器
-- 关键词 CREATE TRIGGER;新建触发器名称 newproduct; 修改另一个表数据
CREATE TRIGGER newproduct AFTER INSERT ON tableName FOR EACH ROW 
BEGIN
update tabel set age = 30 where id=123;
END;
-- BEGIN END 非必需,当需要执行多条时,必不可少。
  • 删除触发器
DROP TRIGGER newproduct;
  • 使用触发器格式化数据
CREATE TRIGGER newproduct BEFORE INSERT ON tableName FOR EACH ROW 
SET NEW.name = Upper(NEW.name)

触发器不能更新或覆盖。为了修改一个触发器,必须先删除它,然后再重新创建。

存储过程

存储过程(参考函数)简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。

BEGIN和END语句用来限定存储过程体;

  • 创建存储过程
CREATE PROCEDURE proname() 
BEGIN
select * from table;
END;
  • 执行存储过程
CALL proname();
  • 删除存储过程

已经存在的重名的存储过程,需要删除后重新创建,无法修改。

DROP PROCEDURE proname;

事务处理

事务处理(transaction processing)可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。关键在于将SQL语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应该回退。INSERT、UPDATE和DELETE语句。你不能回退SELECT语句

事务(transaction)指一组SQL语句;

回退(rollback)指撤销指定SQL语句的过程;

提交(commit)指将未存储的SQL语句结果写入数据库表;

保留点(savepoint)指事务处理中设置的临时占位符(place-holder),你可以对它发布回退(与回退整个事务处理不同)

  • 使用ROLLBACK
START TRANSACTION
delete from table  where id=123; --删除的数据 ROLLBACK 后将会还原
ROLLBACK;
  • 使用COMMIT
START TRANSACTION
delete from table  where id=123;
delete from table  where id=123;
COMMIT; 
-- COMMIT语句仅在不出错时写出更改,只要有一条语句错误 ,所有语句将会回退。
  • 使用保留点 SAVEPOINT
-- 使用保留点处理部分提交或回退
SAVEPOINT pointName; -- 定义一个保留点
ROLLBACK TO pointName; -- 回退到指定保留点
RELEASE SAVEPOINT pointName; --明确地释放保留点

全文本搜索

全文本搜索的一个重要部分就是对结果排序。具有较高等级的行先返回

  • 启用全文本搜索 FULLTEXT
CREATE TABLE tableName (age int null,name var(50) null, fulltext(marker));
  • 进行全文本搜索Match()和Against()
-- 使用两个函数Match()和Against()执行全文本搜索
select marker from tableName where Match(marker) Aginst('keyword');
  • 使用查询扩展
-- 查询扩展用来设法放宽所返回的全文本搜索结果的范围,查询扩展极大地增加了返回的行数
select marker from tableName 
where Match(marker) Aginst('keyword' WITH QUERY EXPANSION);

不要在导入数据时使用FULLTEXT 更新索引要花时间

SELECT子句顺序

SELECT 要返回的列或表达式 是
FROM 从中检索数据的表 仅在从表选择数据时使用
WHERE 行级过滤 否
GROUP BY 分组说明 仅在按组计算聚集时使用
HAVING 组级过滤 否
ORDER BY 输出排序顺序 否
LIMIT 要检索的行数 否
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容