mysql学习笔记

该博客围绕MySQL展开,介绍了基本入门语句、insert、update&delete、select等操作。深入剖析了数值、字符等数据类型的存储范围、所占字节等特性。还讲解了表修改、group分组、子查询、连接语法、union用法等,同时提及函数使用注意事项、视图与表的关系及编码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

视频链接: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不能

truncatedeletetruncate相当于删表重建一张同样结构的表, 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);
  1. 空值是不占用空间的,而NULL是占用空间的。打个比方来说,你有一个杯子,空值代表杯子是真空的,NULL代表杯子中装满了空气,虽然杯子看起来都是空的,但是区别是很大的
  2. NULL 其实并不是空值,而是要占用空间,所以mysql在进行比较的时候,NULL 会参与字段比较,所以对效率有一部分影响,而且B树索引时不会存储NULL值的,所以如果索引的字段可以为NULL,索引的效率会下降很多。(Q:数据库中的B树索引?)
  3. 筛选非空的字段经常会用到"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三大类型

  1. 数值型
    1. 整型
      1. tinyint 1字节
      2. smallint 2字节
      3. int 4字节
    2. 小数型
      1. Float(M,D)
      2. decimal(M,D)
  2. 字符串型
    1. char(M)
    2. varchar(M)
    3. Text 文本类型
  3. 日期时间类型
    1. Date 日期
    2. Time 时间
    3. Datetime 日期时间类型
    4. 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)实占空间利用率
charMMiMi/M <= 100%
varcharMMii + (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 Bleft/right join的关系

内连接是左右连接的交集

34 union用法深入讲解

语法:sql1 union sql2

union合并的是“结果集”,不区分来自于哪一张表

对于取出的结果集,列名不一样,会以第一条sql为准

只要结果集中的列数一致就可以合并

sql1 union sql2 order by 字段

  1. order by是针对合并后的结果集排的序;
  2. 内层的order by语句,在执行期间就被mysql的代码分析器给优化掉了
  3. order by后面有limit时,就不会被优化掉,因为limit会实际影响结果集

:内层的order by必须能够影响结果集时,才有意义。比如 配合limit使用

union的结果中有重复的值时,会去重。如果想保留所有结果,可使用union all

38 mysql函数使用注意事项

如果mysql函数和java函数都能实现某个功能,优先使用哪一个?

  1. mysql函数肯定会影响查询速度。应在建表时,通过合理的表结构减少函数使用
  2. 如果确实要用函数,优先放在业务逻辑层处理
  3. 在查询时使用函数,最大的坏处:date_format(A),则A列的索引将无法使用

39 视图详解及与表的关系

view可以看成一张虚拟表,是表通过某种运算得到的一个投影

创建视图时,不需要指定视图的列名与类型

既然视图只是表的某种查询的投影,所以主要步骤在查询表上,查询的结果命名为视图就可以了

语法:

create view 视图名
as
select ...

view的作用:

  1. 简化查询
  2. 更精细的权限控制
  3. 数据多,分表时可用到

view是表的一个影子,表与view数据变化时相互影响的问题:

  1. 表的数据变化,要影响到视图的变化
  2. 当视图的数据和表的数据是一一对应的时候,视图是可以修改的

41 GB2312与UTF8编码

牵涉到数据库,想不乱码

  1. 正确指定客户端的编码
  2. 合理选择连接器的编码
  3. 正确指定返回内容的编码

网页文件本身编码,meta信息,client/connection/results的编码指定——如果这三者都保持一致,则不会乱码

utf8bom头问题,可能会对程序产生影响。存储文件时,将格式指定为utf8而不是utf8+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值