视频链接:https://www.bilibili.com/video/av19538278/
文章目录
3 基本入门语句
-uusername -ppasswd 连接
show databases;
use database_name;
show tables;
create database database_name charset utf8;
drop database database_name;
drop table table_name;
rename table old_name to new_name;
create table_name ...
insert into table_name values ...
truncate table_name; //清空表
MySQL
中,表、列可以改名,database
不能
truncate
和delete
:truncate
相当于删表重建一张同样结构的表, delete
是从删除所有的层面操作
4 问题
乱码:客户端与mysql编码不一致,使用 set names encoded_style
1064 error
:语法错误
5 insert详解
# 查看表结构
desc table_name
# 向那个表插入
insert into class
# 插入哪些列
(id, sname, gender, company, salary, fanbu)
# 值是什么
values
(1, 'zhangsan', 'm', 'baidu', 8888.88, 100);
# 如果插入所有列,则可以不声明待插入的列
# 此情况下,id虽是自增的,但仍然要写上
insert into class values (5, 'a', 'm', 'google', 9996.66, 300);
# 一次插入多行
insert into class
(sname, company, salary)
values
('b', 'facebook', 100)
('c', 'amazon', 200);
问题:mysql中null和空值的区别(参考链接:https://blog.youkuaiyun.com/dhfzhishi/article/details/80150525)
# 数据中的空值
+----+----------+--------+----------+---------+-------+
| id | sname | gender | company | salary | fanbu |
+----+----------+--------+----------+---------+-------+
| 1 | zhangsan | m | baidu | 8888.88 | 100 |
| 2 | lisi | f | baidu | 6666.66 | 200 |
| 3 | 王五 | m | 网易 | 66.66 | 300 |
| 4 | 麻子 | m | | 66.66 | 0 |
| 5 | a | m | google | 9996.66 | 300 |
| 6 | b | | facebook | 100.00 | 0 |
| 7 | c | | amazon | 200.00 | 0 |
+----+----------+--------+----------+---------+-------+
# 表结构中的not null
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| sname | varchar(10) | NO | | | |
| gender | char(1) | NO | | | |
| company | varchar(20) | NO | | | |
| salary | decimal(6,2) | NO | | 0.00 | |
| fanbu | smallint(6) | NO | | 0 | |
+---------+--------------+------+-----+---------+----------------+
# 下面的语句就无法插入数据,因null
insert into class (sname, company, salary) values ('c', null, 100);
- 空值是不占用空间的,而
NULL
是占用空间的。打个比方来说,你有一个杯子,空值代表杯子是真空的,NULL
代表杯子中装满了空气,虽然杯子看起来都是空的,但是区别是很大的 NULL
其实并不是空值,而是要占用空间,所以mysql
在进行比较的时候,NULL
会参与字段比较,所以对效率有一部分影响,而且B树
索引时不会存储NULL
值的,所以如果索引的字段可以为NULL
,索引的效率会下降很多。(Q:数据库中的B树
索引?)- 筛选非空的字段经常会用到"
is not null
“和”!=null
",但是这两种方法是不一样的。"null
" 表示什么也不是, 用“=、>、< ...
” 所有的判断,结果都是false
,所有只能用is null
进行判断。默认情况下,推荐使用IS NOT NULL
去判断,因为SQL
默认情况下对。"!= Null
"的判断会永远返回0行,但没有语法错误。
6 update&delete详解
# 改哪张表
update class
# 哪几列
set fanbu=123, gender='f'
# 哪几行
where sname='c';
# 从哪张表删
delete from class
# 删哪几行
where salary > 8800;
7 select基本入门
# 查哪几列
select salary
# 从哪张表查
from calss
# 哪几行
# 将where后看成表达式
where gender='m';
9 深入剖析int列的存储范围与所占字节
MySQL三大类型
- 数值型
- 整型
- tinyint 1字节
- smallint 2字节
- int 4字节
- 小数型
- Float(M,D)
- decimal(M,D)
- 整型
- 字符串型
- char(M)
- varchar(M)
- Text 文本类型
- 日期时间类型
- Date 日期
- Time 时间
- Datetime 日期时间类型
- year 年类型
10 整型列M-unsgined-zerofill详解
不加说明,默认是有符号;加unsigned
表无符号,可影响存储范围
M
必须和zerofill
配合才有意义:M表示补零后的宽度,同时也默认为了unsigned
11 浮点与定点列讲解
float(M,D)、decimal(M,D)
M叫精度
,代表总位数
D叫标度
,代表小数位
float如果M<=24,占4字节,否则占8字节,默认是有符号的
float(6,2):-9999.99 到 +9999.99,当使用unsigned时,为0到+9999.99
decimal是定点, 就是把整数部分和小数部分分开存储,比float精确
12 字符型列详解
char(M):定长,不论够不够指定长度,实际都会占据M个长度;如果不够M个长度,会用空格在末尾补齐,取出时再把右侧空格删掉;数据读取时,可通过行数与行的长度计算出来文件指针的偏移量
varchar(M):不用空格补齐,而在列内容前,有1-2字节来标志改列内容长度
PS:如果右侧本身有空格,将会丢失
类型 | 宽度 | 可存字符 | 实存字符(i<=M) | 实占空间 | 利用率 |
---|---|---|---|---|---|
char | M | M | i | M | i/M <= 100% |
varchar | M | M | i | i + (1到2) | i/(i+1到2) < 100% |
注意:char(M),varchar(M)限制的是字符,不是字节
text:文本类型,可存比较大的文本段,搜索速度较慢。因此如果不是特别大的内容,建议用char,varchar代替
text不用加默认值
blob是二进制类型,用于存储图像,音频等二进制信息
意义:在2进制中,0-255都有可能出现,blob在于防止因为字符集的问题导致信息丢失
比如:一张图片中有0xFF字节,这个在ascii字符集中认为非法,在入库的时候被过滤了
15 表修改语法之列的增删改
# 增加列
alter table table_name add 列名称 列类型 列参数 [加的列在表的最后]
alter table table_name add 列名称 列类型 列参数 after 某列 [加在某列后]
alter table table_name add 列名称 列类型 列参数 first [加在表最前面]
# 删除列
alter table table_name drop 列名
# 修改列类型
alter table table_name modify 列名 新类型 新参数
# 修改列名及列类型
alter table table_name change 旧列名 新列名 新类型 新参数
19 sql之group分组及统计函数详解
# 查询的是绝对的行数,哪怕某一行所有字段全为null,也计算中在内
select count(*) from table_name;
# 查询的是该列不为null的所有行的行数
select count(列名) from table_name;
以group a,b,c
为例,则select
的列,只能在a,b,c
里面选择,语义上才没有矛盾
24 -26 子查询
where
型子查询:
如果where 列 = (内层sql)
,则内层sql
必是单行单列
如果where 列 in (内层sql)
,则内层sql
只能返回单列,可以多行
from
型子查询:
内层sql
的查询结果,当成一张临时表,供外层sql
再次查询
exists
型子查询:
把外层sql
的结果,拿到内层sql
去测试,如果内层sql
成立,则该行取出
30 左连接语法及应用
对于两张表的笛卡尔乘积,生成的临时表可能会太大,导致效率过低
假设A表
在左,不动,B表
在A表
的右边滑动
A表
与B表
通过一个关系来筛选B表
的行
语法:
A left join B on 条件
条件为真,则B表对应的行取出
对于A left join B on 条件
:
这一块形成一个结果集,可以看成一张表,设为C表
因此,可以对C表
作查询,where、group、having、order by、limit
仍可使用
在C表
中,A、B表
的所有列都可以查
31 左右内连接的区别
左右连接是可以互换的:A left join B
等价于 B right join A
注意:既然左右连接可以互换,尽量用左连接,出于移植时兼容性的考虑
如果从集合的角度:A inner join B
和left/right join
的关系
内连接是左右连接的交集
34 union用法深入讲解
语法:sql1 union sql2
union合并的是“结果集”,不区分来自于哪一张表
对于取出的结果集,列名不一样,会以第一条sql为准
只要结果集中的列数一致就可以合并
sql1 union sql2 order by 字段
:
order by
是针对合并后的结果集排的序;- 内层的
order by
语句,在执行期间就被mysql
的代码分析器给优化掉了 - 当
order by
后面有limit
时,就不会被优化掉,因为limit
会实际影响结果集
注:内层的order by
必须能够影响结果集时,才有意义。比如 配合limit
使用
当union
的结果中有重复的值时,会去重。如果想保留所有结果,可使用union all
38 mysql函数使用注意事项
如果mysql
函数和java
函数都能实现某个功能,优先使用哪一个?
mysql
函数肯定会影响查询速度。应在建表时,通过合理的表结构减少函数使用- 如果确实要用函数,优先放在业务逻辑层处理
- 在查询时使用函数,最大的坏处:
date_format(A)
,则A
列的索引将无法使用
39 视图详解及与表的关系
view
可以看成一张虚拟表,是表通过某种运算得到的一个投影
创建视图时,不需要指定视图的列名与类型
既然视图只是表的某种查询的投影,所以主要步骤在查询表上,查询的结果命名为视图就可以了
语法:
create view 视图名
as
select ...
view
的作用:
- 简化查询
- 更精细的权限控制
- 数据多,分表时可用到
view
是表的一个影子,表与view数据变化时相互影响的问题:
- 表的数据变化,要影响到视图的变化
- 当视图的数据和表的数据是一一对应的时候,视图是可以修改的
41 GB2312与UTF8编码
牵涉到数据库,想不乱码
- 正确指定客户端的编码
- 合理选择连接器的编码
- 正确指定返回内容的编码
网页文件本身编码,meta信息,client/connection/results的编码指定
——如果这三者都保持一致,则不会乱码
utf8
的bom
头问题,可能会对程序产生影响。存储文件时,将格式指定为utf8
而不是utf8+