MySQL笔记,MySQL创建数据库表
目录
- 著名数据库(了解)
- 概念
- 组成(了解即可)
- 注意点
- DDL操作
- 操作数据库
- 数据类型(列类型)
- 操作表
- DML(Data Manipulation Language)
- DCL(Data Control Language)
- DQL(Data Query Language)
- 编码
- 备份与恢复
- 约束
- 主键约束
- 非空约束和唯一约束
- 外键
- 多表查询
- 合并结果集
- 连接查询(一次查询多张表)
著名数据库(了解)
公司 | 数据库软件 |
---|---|
IBM | DB2 |
微软 | SQL Server、Access[1] |
Oracle | Oracle、MySQL |
Sybase | Sybase |
概念
组成(了解即可)
注意点
DDL操作
操作数据库
数据类型(列类型)
必须为每一列指定数据类型
注意:MySQL中字符串只能加单引号
数据类型 | 说明 |
---|---|
int | 整型 |
double(5,2) | 浮点型,5表示最大总位数(不包括小数点),2表示小数点后位数 |
decimal | 浮点型,不损失精度,表单中钱用得较多 |
char(255) | 固定长度字符,长度不足时补足,超出长度报错。最大支持255个字节 |
varchar(65535) | 变长字符,长度不足时不补足,超长报错。最大支持65535 bytes。会额外使用1个字节存储长度信息 |
text | 不在SQL标准中(标准里的是clob),分tinytext (2^8^-1,255B)、text (2^16^-1,65k)、mediumtext (2^24^-1,16M)、longtext (2^32^-1,4G) |
blob | 用于存储二进制数据,分tinyblob (2^8^-1)、blob (2^16^-1)、mediumblob (2^24^-1)、longblob (2^32^-1) |
date | 格式:YYYY-MM-DD |
time | 格式:hh:mm:ss |
timestamp | date + time |
... | ... |
操作表
DML(Data Manipulation Language)
DCL(Data Control Language)
DQL(Data Query Language)
查询不会修改数据库表记录
更多函数及用法可参阅:MySQL常用函数大全
起别名:(AS
可以省略),也可用于给表起别名
SELECT 列名 (AS) 别名 FROM 表名; # as关键字可以省略
-- 如 SELECT salary*1.5 as 工资 FROM employees;
条件控制
-
条件查询 (添加WHERE条件)
-
模糊查询:通过
LIKE
关键字和_%
通配符实现(_
匹配一个字符;%
匹配0到n个字符,但不匹配NULL
)- 模糊搜索的时间开销相比一般条件查询更大
- 不要过度使用通配符,若能用其他操作符实现,应使用其他操作符
- 使用通配符时,除非绝对有必要,否则不要将通配符放置在搜索模式的开始处,这样搜索起来最慢
SELECT * FROM employees WHERE name LIKE '张%'; #匹配如张、张三、张某某 SELECT * FROM employees WHERE name LIKE '张__'; # 匹配如张某某,但不匹配张三
-
正则表达式:通过
REGEXP 匹配字符串
实现-
与LIKE的区别:LIKE是整行匹配;REGEXP只要行内字串满足匹配字符串即可,若匹配字符串首尾同时添加
^
和$
则变成整行匹配 -
与多数其他软件不同,匹配特殊字符,如
.[]()|
等,需要添加两个反斜杠\\
,如\\.
,\\n
,\\\
(匹配\
本身)、\\1
(反向引用)等(一个\
自己解释一个,正则表达式库解释另一个) -
字符集
类 说明 [:alpha:]
任意字符(同 [a-zA-Z]
)[:digit:]
任意数字(同 [0-9]
)[:alnum:]
任意字符和数字(同 [a-zA-Z0-9]
)[:xdigit:]
任意十六进制数字(同 [a-fA-F0-9]
)[:lower:]
任意小写字母(同 [a-z]
)[:upper:]
任意大写字母(同 [A-Z]
)[:blank:]
空格和制表符(同 [ \\t]
)[:space:]
包含空格在内的任意空白字符(同 [\\f\\n\\r\\t\\v]
)[:print:]
任意可打印字符 [:graph:]
除空格外的任意可打印字符 [:cntrl:]
ASCII控制字符(ASCII 0-31和127) [:punct:]
即不在 [:alnum:]
,也不在[:cntrl:]
中的字符 -
正则表达式内容较多,用法可参见 正则表达式30分钟入门教程
-
MySQL中可用
SELECT '待匹配字符串' REGEXP '匹配样式字符串'
简单测试(结果1为匹配,0为不匹配)
-
-
排序:
ORDER BY 列名1 [ASC/DESC], ...
(ASC升序,DESC降序,省略时默认ASC)- 先按第一个条件排序,第一个条件相同时,按第二个条件,依此类推。
-
聚合查询:利用聚合函数纵向查询某一列的非空行数
COUNT
、SUM
、MAX
、MIN
、AVG
注意:COUNT(列名)
记录该列非NULL
的行数,若为COUNT(*)
则为包含NULL
的所有行数;- 聚合查询一般忽略NULL值
- 函数参数可为
DISTINCT 列名
,此时重复值只计算一次
SELECT COUNT(salary) 计数,SUM(DISTINCT salary) 总和, MAX(salary) 最高, MIN(salary) 最低, AVG(salary) 平均 FROM employees WHERE department = '财务部';
-
分组查询
GROUP BY
-- 只用于查询组信息- 用法:SELECT 列名1[,列名2,...], 聚合函数 FROM 表名 GROUP BY 列名1[,列名2,...]`
- 在
GROUP BY
前通过WHERE 列条件
过滤行,之后则使用HAVING
关键字过滤组信息(除位置外,HAVING
用法与WHERE
基本相同) GROUP BY 列
可接WITH ROLLUP
,增加一行汇总行- 结果不一定有序,最好结合
ORDER BY
-- 列出各个岗位里工资大于15000的人数,且满足要求的岗位人数必须大于1人 SELECT job, COUNT(job) FROM employees WHERE salary > 15000 GROUP BY job HAVING count(job) > 1;
-
MySQL方言之LIMIT(仅MySQL支持)
LIMIT [row - 1,] n
显示从第row行(下标0为第一行)开始的n行数据
编码
备份与恢复
约束
主键约束
非空约束和唯一约束
外键
多表查询
合并结果集
-
用于将两个结果集拼接在一起显示
-
要求结果集列数&列类型相同
-
语法: (通过
UNION [ALL]
拼接多个SELECT ... FROM ...
语句,不加ALL
会对紧邻的两个结果集的行进行去重)CREATE TABLE ab(a INT, b VARCHAR(50)); CREATE TABLE cd(c INT, d VARCHAR(50)); ... # 此处添加数据 SELECT * FROM ab UNION ALL SELECT * FROM cd; SELECT a FROM ab UNION SELECT c FROM cd UNION ALL SELECT a FROM ab;
连接查询(一次查询多张表)
多表查询注意使用表名对列进行限定
(未完待续...)
Access为桌面型数据库,主要用于局域网;其余的为C/S型(客户端/服务器型) ↩︎
函数在不同DBMS间可移植性较差,编写sql脚本时最好标注清楚 ↩︎
笛尔积:{a, b, c} x {1, 2} = {a1, a2, b1, b2, c1, c2} ↩︎