SQL Structured Query Language,是专门用来查询关系型数据库的语言。也就是说不是关系型数据库,就不能用SQL查询了。MySQL的主要学习,其实都是集中在SQL上的。另外一部分,才是数据库的配置和速度优化。SQL语句的分类:DQL: 数据查询语句,如selectDML: 数据操作语句,如update/insert/deleteTPL: 事务处理语句,如commit/rollback/begin transactionDCL: 数据控制语句,即权限管理,如grant/revokeDDL: 数据定义语句,如create/dropCCL: 指针控制语句,通过指针完成表操作,如declare cursor语法结构一些特点:SQL不区分大小写每句话以;结束断行、缩紧无需任何符号,解释器在解释时会把所有空符号都会合并为一个空格。单行注释采用– ,多行注释采用/* … /值的引号可以同时用"和’,但是"兼容性更强。数据库名、表名、列名,都可以用反引号来包起来SQL的语法,是将一条语句拆分成几个组成部分:Clauses:主要命令,如 update/set/whereExpressions: 能产生值的语句,如"Jason",或age + 12。Predicates: 条件判断,即如果True则使用A值,否则B值。Queries: 即Select查询读取数据库的语句。Statements: 即一整条以;结尾的SQL语句SQL Style 编写风格参考 Simon Holywell:SQL Style Guide参考 Simon Holywell:SQL样式指南 · SQL Style Guide常用语句参考W3School:SQL Tutorial服务器查询:– 显示服务器中所有的数据库show databases ;– 进入一个数据库use 数据库名 ;– 显示当前所在数据库的信息select database() ;– 显示当前数据库所有表名 (MySQL)show tables;– 显示指定数据库所有表名 (MySQL)select table_name from information_schema.tables where table_schema=‘数据库名’ and table_type=‘base table’;– 显示指定表格的所有字段名(MySQL)select column_name from information_schema.columns where table_schema=‘数据库名’ and table_name=‘表名’;– 查看某表结构DESC 表名 ;数据库操作:– 创建一个数据库CREATE DATABASE 数据库名 CHARSET=utf-8 ;– 查看数据库的创建信息SHOW CREATE DATABASE 数据库名 ; – 删除数据库DROP DATABASE 数据库名 ;– 或,用反引号包起来DROP DATABASE 数据库名数据表操作:– 显示当前数据库中的所有表show tables ;– 创建表CREATE TABLE 表名 (字段 类型 约束, 字段 类型 约束, 字段 类型 约束….) ;– 如CREATE TABLE staff ( id int primary key not null auto_increment, name varchar(30));– 删除表DROP TABLE 表名 ;– 查看表的创建语句SHOW CREATE TABLE 表名 ;– 查看表结构DESC 表名 ;– 修改表:添加一个字段ALTER TABLE 表名 ADD 字段 类型 约束 ;– 修改表:修改一个字段ALTER TABLE 表名 MODIFY 字段 类型 约束 ;– 修改表:删除一个字段ALTER TABLE 表名 DROP 字段 ;– 添加一条记录INSERT INTO 表名 VALUES(字段1, 字段2, , 字段4) ;– CRUD 增删改查Create / Read / Update / Delete查询 SELECTselect查询永远是SQL中学习时间最长的。因为增删改都是固定模式,语句也很简单。但是查询拥有极多的方式方法和关键字,能够创造超多的组合搭配查询,且每种查询方式效率速度不一。所以SQL主要学的就是SELCT。最简单的select查询:SELECT filed1, field2, field3 FROM table_name ;SELECT filed1 AS age, field2 AS gender, field3 FROM table_name ;SELECT table_name.filed1, table_name.field2, table_name.field3 FROM table_name ;SELECT t.filed1, t.field2, t.field3 FROM table_name as t ;– 删除重复行SELECT DISTINCT field1 FROM table_name ;以下为各种Select语句的方式方法总结。条件 WHERE比较运算符:小于<, 大于>, 小于等于<=, 大于等于>=, 等于=, 不等于!=或<>逻辑运算符:and, or, not模糊查询:like: 用%替换1个字或多个字,_替换1个字,word包含指定的字wordrlike: 正则查询,如^周.$范围查询:field in (v1, v2, v3…), not in (…), between v1 and v2, not between v1 and v2空判断:field is null, field is not nullSELECT filed1, field2 FROM table_name WHERE field3 > 10;… WHERE field1 = “hello” AND field2 = “world” ;… WHERE filed1 LIKE “Hel%” or filed2 LIKE “Hel__” ;… WHERE field1 RLIKE “^He.$” ;… WHERE filed1 IN (12, 18, 19) and NOT IN (30, 40, 50) ;… WHERE field1 BETWEEN 10 AND 20 and NOT BETWEEN 40 AND 50 ;… WHERE filed1 IS NULL OR field3 IS NOT NULL ;排序 ORDER BY… WHERE … ORDER BY age, gender ;… WHERE … ORDER BY age ASC ;… WHERE … ORDER BY age ASC, id DESC, gender ASC ;内置聚合函数 FUNCTIONS内置函数能够处理一些很简单的计算问题。但是切记,查询一个函数值时不要查询其它字段,除非使用GROUP分组等方法。SELECT COUNT() FROM …SELECT MAX(age) FROM …SELECT SUM(age) FROM …SELECT AVG(age) FROM …SELECT ROUND( SUM(age)/COUNT(), 2 ) FROM …SELECT MAX(age) FROM …– 不允许:(因为逻辑不通,需要用到分组才行)– SELECT name, age, ROUND( SUM(age)/COUNT(), 2 ) FROM …分组 GROUP BYSQL分组是一个比较容易混淆的概念。SQL的分组是会完全破坏原先表结构的,然后生成一个统计表,纯粹是为了数量统计用的。分组GROUP单独使用是没什么意义的,除非是和聚合函数Functions一起用。分组的做法是:如果按gender分组,就只把gender一列取出来,做成一个unique的唯一gender列表,如男; 女,然后再创建一列,值对应的是每一种gender的记录条数。如果要查看各组的其它信息,需要用到特殊的函数group_concat(filed1):– 报错:– SELECT name FROM … GROUP BY gender ;– SELECT * FROM … GROUP BY gender ;– 显示gender的每种分组类别以及其下的记录条数!SELECT gender, COUNT() FROM … GROUP BY gender ;– 显示分组的平均SELECT gender, AVG() FROM … GROUP BY gender ;– 显示分组最大值SELECT gender, MAX() FROM … GROUP BY gender ;– 显示分组所包含的其它信息SELECT gender, GROUP_CONCAT(name) FROM … GROUP BY gender ;SELECT gender, GROUP_CONCAT(name, “_”, age) FROM … GROUP BY gender ;分组还有一个配合的关键字having,类似与where的筛选功能:SELECT gender, COUNT() FROM … GROUP BY gender HAVING COUNT() > 3 ;分页 LIMIT– 限制显示结果的条数SELECT … FROM … LIMIT 2 ;– 分页 格式为:LIMIT (第N页-1)每页个数, 每页个数– 第1页,每页2条SELECT … FROM … LIMIT 0,2 ;– 第2页,每页2条SELECT … FROM … LIMIT 2,2 ;– 第3页,每页2条SELECT … FROM … LIMIT 4,2 ;– 第4页,每页2条SELECT … FROM … LIMIT 6,2 ;连接 JOINSQL中的JOIN连接,实际上是用了数学上的集合概念。其中:Inner Join 内连接: 相当于A and B,代表两个集合(表)的交集,即表中某字段匹配上的条目。Full Outer Join 全连接:相当于A or B`,代表两个表的并集,即两表合并所有字段和数据为一个表,未匹配的数据中的空字段以null填充。Right Join 右连接:使用left表里所有数据,而right表中只保留匹配数据,且未匹配数据条目中的right表字段以null填充。Left Join 左连接:使用right表里所有数据,而left表中只保留匹配数据,且未匹配数据条目中的left表字段以null填充。怎么理解Left Join和Right Join?首先,两表匹配,各表都会有各自的未匹配数据条目。那么怎么处理这些未匹配数据,就是这些左右的考量目标。Left join,保留左表的未匹配数据。Right join,保留右表中的未匹配数据。Full join,保留所有未匹配数据。那么保留下的这些未匹配数据,肯定会有几个来自外面的字段是空的,这时候都统一以null填充。另外,SQL连接两表,不光要指定连接方式,还要指定主键-外键的对应关系,使用ON关键字。– 内连接SELECT … FROM tb1 INNER JOIN tb2 ON tb1.key = tb2.id ;– 左连接SELECT … FROM tb1 RIGHT JOIN tb2 …– 右连接SELECT … FROM tb1 LEFT JOIN tb2 …– 全连接 (MySQL不支持)SELECT … FROM tb1 FULL OUTER JOIN tb2 …– 差集连接 (MySQL不支持)SELECT … FROM tb1 FULL OUTER JOIN tb2 ON tb1.key = tb2.id WHERE tb1.key IS NULL OR tb2.id IS NULL;自关联自连接,连接的两个表都是同一个表,同样可以由内连接,外连接各种组合方式,按实际应用去组合。SELECT a., b. FROM tb1 a, tb2 as b WHERE a.[name] = b.[name] 联合 UnionUNION 操作符用于合并两个或多个 SELECT 语句的结果集。使用Union联合的前提条件:UNION 内部的 SELECT 语句必须拥有相同数量的列对应位置的列必须拥有相似的数据类型每条 SELECT 语句中的列的顺序必须相同。列出所有在中国和美国的不同的雇员名:SELECT E_Name FROM Employees_ChinaUNIONSELECT E_Name FROM Employees_USAUNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。列出在中国和美国的所有的雇员:SELECT E_Name FROM Employees_ChinaUNION ALLSELECT E_Name FROM Employees_USA子查询实际上就是用( select …)子语句返回一个值,来方便主句查询。相当于bash脚本中的$(…)功能。SELECT … FROM … WHERE height = (SELECT MAX(height) FROM …)