最近在看《深入浅出MySQL++数据库开发、优化与管理维护+第2版+唐汉明》,做个记录,这里只列出了关键的内容。
1, Sql 基础语句
-
查看所有数据库
- show databases
-
查看所有表
- show tables
-
查看表信息
- show create table account (查看表的创建语句,account 是表名)
- desc account (查看表定义,输出表的列信息,account 是表名)
-
字段修改
- alter column: 设置或删除列的默认值(Only)
- alter table film alter column rental_duration set default 5;
- alter talbe film alter column rental_duration drop default;
- change column : 列的重命名、列类型的变更以及列位置的移动
- alter table mytable change column old_column new_column varchar(32) not null first;
- alter table mytable change column old_column new_column varchar(32) not null after baz;
- modify column: 除了不能给列重命名之外,它干的活和change column 是一样的
- alter talbe mytable modify column foo varchar(32) not null after name; 注意:change和modify都可以修改表的定义,不同的是change可以修改列名,modify则不行
- alter column: 设置或删除列的默认值(Only)
-
多表更新
-
基础用法:
原始数据:
-
UPDATE emp a,
dept b
SET a.dept_name = b.deptname,
b.BACKUP = 'test01'
WHERE
a.dept_no = b.deptno
执行多表更新后:
可以看到 emp 表和 dept表都被更新了。
多表更新这种语法还可以用来做单表批量更新,比如
UPDATE emp,
( SELECT '张三' ename, '3000' sal UNION SELECT '李四', '3000' ) emp_list
SET emp.sal = emp_list.sal
WHERE
emp.ename = emp_list.ename
运行后:
可以发现,我们用一条update 语句就可以将 张三和李四的sal同时修改了,这就是使用一条语句的mysql批量更新
-
多表删除
delete a,b from emp a, dept b where a.dept_no= b.deptno and a.dept_no=2
该操作会同时删除emp表和dept表中符合条件的数据,如果delete后面 只有a的话,则只删除emp表
-
聚合
with rollup
是可选语法,表明是否对分类聚合后的结果进行再汇总- having和where的区别在于,having是对聚合后的结果进行条件过滤,而where是在聚合前就对记录进行过滤, 如果逻辑允许,我们尽可能先用where过滤记录,这样因为结果集减少,将对聚合的效率大大提高,最后再根据逻辑看是否用having进行再过滤。
-
连接
-
内连接
内连仅选出两张表中互相匹配的记录
-
外连接
- 左连接
- 右连接
-
-
子查询
- exists、not exists
-
记录联合
- union 和 union all的区别,union去重,union all 不会去重
2.字段类型
- 整数类型
整数类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
tinyint | 1 | 有符号 -128 无符号 0 | 有符号 127 无符号 255 |
smallint | 2 | 有符号 -2^15 无符号 0 | 有符号 2^15 -1 无符号 2^16-1 |
mediumint | 3 | 有符号 -2^23 无符号 0 | 有符号 2^23 -1 无符号 2^24 -1 |
int、integer | 4 | 有符号 -2^31 无符号 0 | 有符号 2^31 -1 无符号 2^32 -1 |
bigint | 8 | 有符号 -2^63 无符号 0 | 有符号 2^63 -1 无符号 2^64 -1 |
有这样一种写法 id int(5) 这里的字段id占用空间还是4个字节,这里的5是显示宽度,在字段设置无符号且填充零时,当数值位数未达到设置的显示宽度时,会在数值前面补充零直到满足设定的显示宽度
-
浮点数
浮点数类型 字节 构成 float 4 1个符号位,8位二进制指数,23位尾数 double 8 1个符号位,11位二进制指数,52位尾数 -
定点数
定点数类型 字节 描述 dec(P,D) decimal(P,D) M+2 P表示有效数字数的精度(1 65),D表示小数点后的位数,D的范围是030,mysql要求 D 小于或等于P -
bit 位类型
位类型 字节 最小值 最大值 bit(M) 1~8 bit(1) bit(64) -
日期类型:
日期和时间类型 字节 最小值 最大值 备注 DATE 4 1000-01-01 9999-12-31 DATETIME 8 1000-01-01 00:00:00 9999-12-31 23:59:59 TIME 3 -838:59:59 838:59:59 TIMESTAMP 4 1970010108001 2038年的某个时刻 和时区相关 YEAR 1 1901 2155 -
字符串类型:
类型 说明 char(n) 定长,char(n)中的n表示字符数,最大长度是255个字符; 如果是utf8编码方式, 那么char类型占255 * 3个字节。 数据超出后用空格替代,查询的时候会自动去掉空格 varchar(n ) 变长, varchar(n)中的n表示字符数。最大空间是65535个字节,存放字符数量跟字符集有关系。VARCHAR类型的实际长度是它的值的实际长度+1。为什么"+1"呢?这一个字节用于保存实际使用了多大的长度 text 变长,跟varchar基本相同, 理论上最多保存65535个字符, 实际上text占用内存空间最大也是65535个字节; 考虑到字符编码方式, 一个字符占用多个字节, text并不能存放那么多字符; 跟varchar的区别是text需要2个字节空间记录字段的总字节数。 注意:
Mysql 5.0版本以下:
varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)
Mysql 5.0版本以上:
varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节
-
ENUM类型
create table t( gender enum('M','F'))
;- 忽略大小写,插入不在ENUM指定范围的数据时,不返回警告,而是插入第一个值,并且插入的时候只允许从值集合中选取单个值,不能一次取多个值
- 1-255个成员的枚举需要1个字节存储,255-65535个成员需要两个字节存储,最多允许65535个成员
-
SET类型
- 和ENUM最主要的区别就是SET类型一次可以选区多个成员,ENUM只能选一个
5. 常用函数
5.1 字符串函数
函数 | 功能 |
---|---|
CONCAT(S1,S2,...Sn) | 连接S1,S2,...Sn 为一个字符串 |
INSERT(str,x,y,instr) | 将字符串str从第x位置开始,y个字符长的子串替换为字符串instr |
LOWER(str) | 将字符串str中所有字符变为小写 |
UPPER(str) | 将字符串str中所有字符变为大写 |
LEFT(str,x) | 返回字符串str最左边的 x 个字符 |
RIGHT(str,x) | 返回字符串str最右边的 x 个字符 |
LPAD(str,n,pad) | 用字符串pad对str最左边进行填充,直到长度为 n |
RPAD(str,n,pad) | 用字符串pad对str最右边进行填充,直到长度为 n |
LTRIM(str) | 去掉字符串 str 左侧的空格 |
RTRIM(str) | 去掉字符串 str 右侧的空格 |
REPEAT(str,x) | 返回 str 重复 x 次的结果 |
REPLACE(str,a,b) | 用字符串 b 替换字符串 str 中所有出现的字符串 a |
STRCMP(s1,s2) | 比较字符串 s1 和 s2 (返回 -1,0,1) |
TRIM(str) | 去掉字符串行尾和行头的空格 |
SUBSTRING(str,x,y) | 返回从字符串 str x 位置起 y 个字符长度的字符串 |
5.2 数值函数
函数 | 功能 |
---|---|
ABS(x) | 返回 x 的绝对值( -1 和 1 的绝对值都是1) |
CEIL(x) | 返回大于 x 的最小整数值 |
FLOOR(x) | 返回 小于 x 的最大整数值 |
MOD(x,y) | 返回 x/y 的模 |
RAND() | 返回0~1内的随机值 |
ROUND(x,y) | 返回参数 x 的四舍五入的有 y 位小数的值 |
TRUNCATE(x,y) | 返回数字 x 截断为 y 位小数的结果 |
5.3 日期和时间函数
函数 | 功能 |
---|---|
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前的日期和时间 now(3)表示带毫秒且毫秒精确到3位 (最高6位) |
UNIX_TIMESTAMP(date) | 将日期类型转换为时间戳类型 |
FROM_UNIXTIME(timestamp) | 将时间戳类型转换为日期类型 |
WEEK(date) | 返回日期为一年中的第几周 |
YEAR(date) | 返回日期date的年份 |
HOUR(date) | 返回日期date的小时值 |
MINUTE(time) | 返回time的分钟值 |
MONTHNAME(date) | 返回date 的月份名 |
DATE_FORMAT(date,fmt) | 返回按字符串fmt 格式化 日期date值 |
DATE_ADD(date,INTERVAL expr type) | 返回一个日期或时间值加上一个时间间隔的时间值 |
DATEDIFF(expr,expr2) | 返回起始时间expr 和 结束时间 expr2之间的天数 |
例子:
获取当前时间,当前时间31天后的时间,当前时间一年零两个月后的时间
5.4 流程函数
函数 | 功能 |
---|---|
IF(value,t,f) | 如果value是真,返回 t ;否则返回 f |
IFNULL(value1,value2) | 如果value1不为空,返回 value1,否则返回 value2 |
CASE WHEN [value1] THEN [result]...ELSE [default] END | 如果value1是真,返回result,否则返回default |
CASE [expr] WHEN [value1] THEN[result1]... ELSE[default] END | 如果expr等于value1,返回result1,否则返回default |
6 存储引擎的选择
8 选择合适的数据类型
10 索引的设计和使用
拷贝表:
create table address_1 like address; (拷贝表结构和索引,不包含数据)
insert into address_1 select *from address; (将address的数据拷贝到address_1中)
pageNum:202