这是MySQL系列笔记的第一部分,本系列笔记但愿能按照笔者本身学习MySQL技术的经从来记录,避免纯粹按照内容一块一块总结,也就是不一样于通常按内容分配章节的书籍的结构,有一个平滑的阅读曲线。内容比较丰富的技术点会按照专题在多个学习笔记中逐渐深刻。html
这部分的标题叫比CRUD多一丁点儿,比起最基础的w3c的SQL教程以外,只多一点的扩展,知足应付从纯粹阅读入门资料到能够上手完成一个简单的工做的需求。mysql
第二篇的主要内容是基础SQL语句,会根据我工做中的经验,每一个语句多介绍一点实际开发中比较常见的用法。sql
SQL是Structure Query Language
的简写。SQL并不仅是用来跟数据库,而是一种完备编程语言,在各类编程语言排行榜上也都是名列前茅。SQL语言的历史和C语言同样长,从1970年Codd博士将数据库领域逐渐发扬光大至今近半个世纪,已经能够算是编程语言中的老人了。笔者认为伴随着关系数据库(RDBMS)产生的SQL语言随着软件底层技术的日益成熟,软件应用日益渗透到生活方方面面,软件开发教育也愈来愈普及(好比前段时间有江苏省已经将Python语言列入高考),将来可能掌握SQL语言的工程师会远远多于掌握C语言的工程师。数据库
同其余语言相似,SQL有标准组织出具的规范,但不一样的数据库也有本身的不一样的实现。可类比为各类语言有本身的标准,也有不一样的编译器(或解释器等)的实现,相信作C++开发的都会被微软的VC编译器和GNU组织的GCC编译器的细微不一样而苦恼的经历。这个问题在SQL语言领域应该是更大一些,不一样的数据库SQL实现有不小的区别,但基本的看SQL语言能够分为三类:编程
DML(Data Manipulation Language):数据操纵语句,用户增删查改数据库记录,包括insert, select, update, delete,也就是咱们文章标题里面常说CRUD(create read update delete)时候指代的这四个语句。可能入门学习时候通常说的SQL就是指这种类型的。本篇基础SQL语句
其实也只会介绍此类。数组
DDL(Data Definition Language):数据定义语言,定义数据库、数据表、列、索引等。包括create, drop, alter等。安全
DCL(Data Control Language):数据控制语句,用于控制不一样数据的访问权限,配置密码等。暴扣grant, revoke。编程语言
本文下来分别介绍DML中的INSERT
,SELECT
,UPDATE
,DELETE
。函数
最简单的形式以下:学习
insert into table_name(id, cardno, `name`, `desc`) values('1', 100001, "good", "good boy");
复制代码
第一个括号里是列名,第二个括号里是对应顺序的值。
一次插入多条数据:
insert into table_name(id, cardno, `name`, `desc`) values('1', 100001, "good", "good boy"),('2', 100002, "bad", "bad girl");
复制代码
顺带说几个常见的小问题,在上面的写法里出现的:
desc
,select
这种SQL的关键字和保留字时候必须使用,不然是会报语法错误的。select
是关键字,desc
是保留字具体可看手册。实际上人脑也不会记忆这些关键字,因此在使用时候就全都使用转义就行了。学海无涯,每种技术的缩写、特例等等层出不穷,笔者的习惯是记忆一种比较通用和安全的用法,始终去使用便可。由于不少技术点的多种方法也是一项技术发展的历史缘由形成的,并非说都记着多种办法会有切实的场景。若是表本身建立时候,推荐的作法就仍是要过一遍上述连接中的保留字,直接不要使用这些词为好,毕竟这个选名字的时间在建表作设计阶段总的时间比起来并不会占用多少比例。笔者遇到的一些ORM库之类对这些关键字可能并非处理的十全十美,因此不用是最佳。'
引发来。用'
不用"
还有一个好用的地方是当输入字符串里面有双引号"
时候,能够免于写一级转义。这是很经常使用的技巧,当进行数据导入时候会碰到插入的数据须要从另外一个表中获取,可使用insert into ... select
的写法。
例若有供应商和顾客两张表,有一部分列内容是重合的,就以下写法
INSERT INTO Customers (CustomerName, City, Country)
SELECT SupplierName, City, Country FROM Suppliers;
复制代码
但注意,在statement-based的同步中,这种语句是并不安全的。相似的用法还有 INSERT ... ON DUPLICATE KEY UPDATE , INSERT IGNORE。能够看手册中的详细介绍。
最基础的再也不赘述,SELECT用法的内容最丰富,后续会专门开一个题。这里说几个常见的Tips。
首先是注意NULL,建表应该避免用NULL值,全部列均可以赋予一个默认值。由于NULL在SELECT、索引、统计函数等不少场合都会有一些让人Surprise的现象,后续可能会单独写一篇关于NULL的博客。
查找NULL时候用IS NULL
, IS NOT NULL
,若是NULL值须要转换,须要用好关于NULL的几个函数IFNULL()
, ISNULL()
, COALESCE()
IFNULL(exp,value)
能够用在语句中代替exp的位置,表示当exp不为NULL时候使用value中的值替代。ISNULL(exp)
作逻辑判断COALESCE(....)
函数是个多值函数,意思是返回这多个参数中按顺序第一个非NULL的值。在各类操做符号如>
,<
,=
后使用ANY和ALL能够表示任意一个和全部的意思。
好比查询比任意Alert表中id大的Account表值:
select id from Account where id > ANY (select id from Alert);
复制代码
好比查询比本身的id还大的(^_^结果固然是没有)
select id from Account where id > ALL (select id from Account);
复制代码
GROUP BY的基本用法比较常见,但统计函数除了count,sum等还有几个经常使用的聚合函数(Aggregate Function)。
链接函数 group_concat会将分组内的值组装为一个逗号分隔的数组
select ag.id, ag.name, group_concat(a.id) as resource_ids from AccountGroup ag left join AccountGroup_Account aga on ag.id=aga.account_group_id left join Account a on aga.account_id=a.id group by ag.id;
复制代码
返回会是相似
+----+------------------------------------+--------------+
| id | name | resource_ids |
+----+------------------------------------+--------------+
| 1 | admin | 1,2,3 |
+----+------------------------------------+--------------+
复制代码
count函数能够加distinct表示去重
SELECT COUNT(DISTINCT results) FROM student;
复制代码
更多能够看手册