Skip to content

bc4897f64b5f25fb9a36ec094d5fc293_MD5

启动

  • net start mysql

登录

73b83f656521ce74730f4d5d29bfb609_MD5 - -p后面可以不跟密码,这样会接着让你输密码. - 默认端口3306 数据都在 /data之下.

数据模型

一个mysql服务器里可以有多个数据库. - create database db01; 这样在/data文件夹当中就会有db01这个文件夹(数据库)了. 一个数据库里可以有多张表.每个表也是一个文件夹.

sql语句

分类: 6936765f41c20385f8bf3854810c7b83_MD5 最后一类主要是DBA(数据库管理员)负责的.

DDL - 数据库级别

e28236019288bc43f747f02baae00443_MD5 其中,select database()中,database()是一个mysql提供的函数.

查询数据库

c7b4bb5e1a361f49c57d0379f78c831e_MD5 多的都是系统自带的数据库. 另外,大小写是不区分的.

使用/查询当前数据库

95935f967fe0634a815b25d4b267c818_MD5

创建数据库

如果有重名,那么就会报错.因此可以使用create database if not exists db01; 另外还可以指定字符集.实际上我们最常用的就是utfmb4,这是最常用的,可以存诸如表情字符等. mysql8以上,默认就是utf8mb4.

删除数据库

如果不存在,那么就会报错.因此可以使用drop database if not exists db01; 506db0028126e18cdd81ce7435f6e0b7_MD5 也就是说schema和database是一个意思. - schema又翻译成"架构"

mysql客户端图形化工具 - datagrip

4b5b7c5bd78a3f23784f34cf49730637_MD5 a856f8ca888c1b1db3213bd08ff1bad8_MD5 000dddd69fd9f90fa740a052eaae8987_MD5 选择展示哪些数据库: 6637476392fda0e92667f5bbffc71702_MD5 注释是两个--并且空一格. 550273cb6f756104892571610a05d70a_MD5 想执行哪句就选中,点击运行: 6ea163a262f1082fedfb15238b07b2d7_MD5 查看历史: a89a468f3076c310a09a437bf3b5a5c1_MD5 切换数据库: 7327f0d55d0639a5faca5708cd33485b_MD5 这样就不需要对应的sql语句了.以及诸如创建/删除数据库的操作都可以.

DDL - 表结构

创建表结构

57b553888dee0ba4094ad044da9a5b5b_MD5 字符串一般使用单引号. verchar(50) 最长50个字符的字符串 char(1) 固定一个字符的字符串 fc0cf37d6492fa077a6e413f35455355_MD5

添加字段

b86ad491b2d80707fecc39c6fa8b32b4_MD5 可以这样通过图形化的方式添加.

约束

如何保证id的唯一性?使用约束 4ccbea05419e063053d64efeaf01b1c4_MD5 79114b0e485dfaa96899cccf7d3f0d09_MD5 多个约束之间通过空格隔开 d83baddd16d18fba5a840d067fa50127_MD5 自增:auto_increment 49e6f8f8bb1572b9d592f1d27a3dd95f_MD5 930784da8d2dd9f0cfa80c7d5b38172c_MD5 generated表示自动增长,从0开始. 也可以手动指定(如10),但是仍然不能重复.下一次增长时,会从上一个开始(也就是11) 另外,如果过程中曾删除过某个条目,那么它之前拥有的id是不会被重新赋给别人的,而是直接跳过.

  • 与not null对应的还有个null:表示默认就是null.

数据类型

数值

605b4d5d0e864c7382bfb839c324956b_MD5 常用就是tinyint int bigint(分别对应byte int long) float(5,2)表示总位数为5(整数+小数位)标度(也就是小数位)为2 数值类型的选取原则:在满足业务需求的前提下,尽可能选择占用磁盘空间小的数据类型. 如: age:tinyint unsigned id:int unsigned

字符串

b25e477509073686a7cd7a2c70752241_MD5 11378c21c287a7fb8c30ebaf2274d4e1_MD5 如果固定长度就用char,不固定就varchar 如:username就varchar 后面的有blob后缀都是二进制数据,test后缀都是文本数据.我们一般不会在数据库里直接存这个的数据.相反,我们一般是存访问路径.

时间

8f5bd9e379414cb56eeb341f0f00309e_MD5 timestamp由于2038就到期了,因此不常用.我们常用的也就date和datetime

样例

如果是存性别,用tinyint,并且规定映射关系:4eb13b5dee679564b3b3093293e5241e_MD5 如果是类似于枚举类型,都这么处理: 1fc52fcbdc33bf88725bec3094397337_MD5 存password有的人会用varchar(32),因为md5就是32位的.(当然,这样不安全).

基础字段

我们设计表的时候,一般都会包括这三个字段: 6ac34c51c87a4d3d64cb70db95fa2705_MD5 d35354b22620efa69262df99329bdc10_MD5 8a0c7b79abe397051dae3837cff78e29_MD5

表的增删查改

c449274316d41162b4db207373f340db_MD5 字段类型是modify,字段名与字段类型是change 当然,这些其实不需要掌握,因为有图形化界面.

DML

insert (into)

591cc24e03c5bd02815a5571bb9ec5e2_MD5

也就是:insert into 表名开头(实测容易忘into) 如果表名后有括号那么就指定某个列,否则就是全部 然后使用values(),() 来描述添加的具体内容.

其实一般来说,即使是插入全部,我们也可以把字段都写出来. 088ebf849718470e859ddd90e92b0d16_MD5 注意,时间也可以使用引号来表示:'2020-01-01' 当前时间:使用函数now()表示当前时间

注意字符串和时间的引号,双引号可以,单引号也可以.当然,sql语句中推荐单引号,因此如果使用双引号,那么datagrip会报错(实际上执行sql语句不会)

update (set)

f0c39c4c96cfbeacf2b67bc79e66deaf_MD5 注意多个项之间通过逗号隔开. b21626d030f563a4937cdbb78521ca42_MD5 不带条件的更新是一种危险的操作. where语句:b5f438ac7d3523f25fa3414d254a8306_MD5

delete (from)

727c10d0571a3656a9f6c0e8a66e908a_MD5 c9449e7bfc2a7f6197e71a330a625132_MD5

DQL

SELECT(使用频率占90%) 80f5ce2d37f6c6b4a8b197542a71c43c_MD5 前两条表示基本查询: 1e5a1c5f76cd48cf6bf2e915a5e1cfd6_MD5 b74eb758259fc7468aa10bfad8820826_MD5 分组查询: 82b68fcd6bd309091544b6d9eb625f0f_MD5 排序查询: f7414a349e5406911af87956ebf231a0_MD5 分页查询: ff7c0390c35e94489fe022ead761b5d0_MD5

基本查询

d06757ce4a969ec6371f935a1ac72062_MD5 如果查询的时候自动补全这样: 6c01ca61a8f5b61804932cacf9cc92f9_MD5 这个emp.entry_date表示是在emp这个表的entry_date字段.

全表查询

另外,全表查询: 6f3836b16f184ddae57c160ebfc15930_MD5 第一种方式性能更高.并且更加直观

别名

另外,起别名会在结果中体现: 84788cdfafdcdf3ba0acbb92bf9cecaf_MD5 ad4d7d54c28ea00b747fff819db2c1df_MD5 起别名是可以不加引号的: fd95d3d5a01ad3a1685965d043191c5f_MD5 如果当中有空格,那么必须加引号: 5e4825380ea061b9805ef1c34a63dfec_MD5 当然,这会导致结果有些怪异: 36563d220a9e75214e79765194936200_MD5

去重

select distinct job from emp;

条件查询

2320c7bb89a9c5ee0edc5f05615eaae0_MD5 78345ef21a729842b9aebfe92ea1a09f_MD5 - 注意between既包含最小值,也包含最大值. - 判断null值不能通过=null/!=null,而是必须通过is null/is not null - <>表示不等于,认识即可,自己还是写!= - between and是放在字段后面修饰的: 25ef6d6a664cda244cf9da34a67383ff_MD5 - between A and B,必须确保A是<B的,否则啥都查询不出来. - eedc26874368a0ff4b8b586c1f5fcbae_MD5 会发现这样两个and虽然看起来怪异,但是是对的. 为了可读性,可以加括号: ac261b73cd19d723771013bc278c09c2_MD5 - in也是放在字段后面修饰字段的: 725847e04e75417285724be8e1c5b5ae_MD5 - like可以这样用: 13eb596b4363c22d92c5f64c10c72135_MD5 acf5af467b8efb559e3d7ab5669dd171_MD5 06a5b5ea5a7517fb343c479d58afba5d_MD5 也就是说,除号是可以匹配0个字符的.

分组查询

分组:按照某些属性把数据分组,然后在分组里操作. 聚合: 5ba26a5d7409aeb9339fa0bfcd6c1f91_MD5 注意,所有的聚合函数不参与null值的统计.如count时,遇见null会忽略掉. 下面仅仅列出一些特殊的.

count

三种用法: 4226eedbfd97210f7511ecb11f37ec47_MD5 id是非空的,因此可以. 82ba8c91625628a91790503a358a8141_MD5 统计的是总数据量. 90d268e8f63909eb90eacd6b0cdbde51_MD5 只要count的不是null,那么结果都是正确的.原理:会扫描整张表,每扫描到1行,就标记为1,最后统计总共有多少个1. 推荐使用第二种,因为底层优化了,效率更高.第三种也可以.

其他

60169571ffcec409c56ad7350463fdbe_MD5 我们可以看出,其实就是把一般的sql语句 select salary from emp中的字段salary变成了聚合函数.

分组查询的语法

6d16f96236ce9f2a7cd9ec09d0e60b5b_MD5 45fbaef91216505b14c11c1b583ceba1_MD5 最后相当于是输出满足条件的分组内容.

示例

注意: 78bd366856ab95f4a508d37d617e07b8_MD5 结果: c520cacf48934befa2e70341c8e8a256_MD5 390a2d1f2418dd6911e5eabb6a7e3003_MD5 如何理解:我们一般查询的返回结果是张表.使用group by 之后,就会得到两张表.一张是所有"男"的表,一张是所有"女"的表.接着,对两张表的gender列分别使用count处理. c99b26d6223625ba3558771a2c72a961_MD5 还要处理获得员工数量大于等于2的职位: a3894fcd7ba20885e9fb09dfc7b345ee_MD5 因此,having是对分组之后的结果进行过滤处理的. 78b47bf732b557dc24fb57fde77cd52c_MD5 敲一下熟悉一下: select job,count(*) from emp where entry_date<='2015-01-01' group by job having count(*) >=2;

排序查询

344fddc9a10ff177eea1713decb2b025_MD5 b11cfa74396df9bbd0b46bb346e7dc1c_MD5 根据多个字段进行排序:只需要在第一个字段排序完成之后,加个逗号,继续第二个字段的排序. b4632c5a10810578c917ba39cf518a02_MD5 2a0ef9667725226140c77825a4e3fc62_MD5 07d1995261be816f2f0d6042e382a85b_MD5 因此,asc/desc只是用来修饰前面一个字段的.

分页查询

988ceb52cbfd0bb656c62a887b0decdf_MD5 起始索引默认从0开始,表示从哪开始查. f1c9e439e493939cffc3ffbfc8f1e7a7_MD5 22f915888ae0ec970900aa65eb7cede2_MD5 拿到前端数据页码: 67d7ba060046c7186dcbf6b7b26c90af_MD5