设计原则


第一范式:原子性不可拆分
第二范式:属性完全依赖于主关键字
第三范式:关系表中不包含已在其他表中包含的非主关键字信息(相当于python类的概念)

MySQL信息

—默认端口 3306

cmd中查看mysql的版本号
mysql —version

cmd中登录mysql
mysql -u 输入用户名 -p
输入密码

数据库命名规则
任意字母、阿拉伯数字、下划线和美元符,不能已数字开头,关键字

MySQL存储引擎

(可以简单理解为表的类型)

用于:存储数据、为存储的数据建立索引、更新和查询数据

默认存储引擎:
InnoDB功能:给MySQL的表提供了事务、回滚、崩溃修复能力和多版本并发控制的事务安全。
InnoDB优势:对事务的处理能力是MySQL其他存储引擎无法比拟的。(要处理事务的时候就必须使用InnoDB引擎)。
支持自动增长列AUTO_INCREMENT。MySQL中自增长列必须为主键。
InnoDB是具有外键约束的表引擎。
InnoDB存储引擎中,表结构存储在.frm文件中,数据和索引存储在innodb_data_home_dir和innodb_data_file_path表空间中。

优点:良好的事务管理、崩溃修复能力、并发控制
缺点:读写效率差、占用的数据空间相对比较大

什么时候使用InnoDB:更新密集的表、事务、自动灾难恢复

MyISAM存储引擎:
文件类型:.frm .MYD .MYI

MyISAM文件存储形式:
1.MyISAM静态格式
如果所有表列的大小都是静态的(即不适用xBLOB、xTEXT或VARCHAR数据类型),MySQL就会自动使用静态MyISAM格式。
2.MyISAM动态格式
如果有表列定义为动态的(使用了xBLOB、xTEXT或VARCHAR数据类型),MySQL就会自动使用动态格式。

尽可能使用静态数据类型。
经常使用OPTIMIZE TABLE语句,它会整理表的碎片,恢复由于表更新和删除而导致的空间丢失。
3.MyISAM压缩格式
对于只读表,可以用myisampack工具将其转换为MyISAM压缩表来减少空间。

优点:占用空间小、处理速度快
缺点:不支持事务

MEMORY存储引擎:
特殊的存储引擎,使用存储在内存中的内容来创建表,而且所有数据也放在内存中。

MEMORY文件存储形式:
1.每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名于表名相同,扩展名为.frm。
该文件中只存储表的结构,而其数据文件都是存储在内存中。
2.默认使用哈希(HASH)索引,其速度要比B型树(BTREE)索引快。

优点:表大小受限、处理速度非常快
缺点:数据易丢失、生命周期短

数据类型

  1. 数字类型
    1. 整数类型:
      1. TINYINT 取值范围0~255 一般用于存储0和1
      2. INT 取值范围-200亿~200亿 或 0~400亿 通常情况用INT
    2. 小数类型:
      1. FLOAT 通常情况下用FLOAT
      2. DECIMAL 一般用于价格

选择最小的可用类型,如果值永远不超过127,则使用TINYINT比INT要强
int 分为 int unsigned 和 int signed ,无符号就是0400亿,有符号就是-200亿200亿

  1. 字符串类型
    CHAR 长度不可变
    VARCHAR 长度可变
    TEXT 长度可变
    从速度方面考虑,要选择固定的列,使用CHAR类型;
    从节省空间,使用动态的列,可用使用VARCHAR类型;
    要将列中的内容限制在一种选择,可用使用ENUM类型;(ENUMERATE枚举类型,相当于python中的enumerate()方法)
    允许在一个列中有多于一个的条目,可用使用SET类型;
    如果要搜索的内容不区分大小写,可用使用TEXT类型;
    如果要搜索的内容区分大小写,可用使用BLOB类型。

  2. 日期和时间数据类型
    数据类型 取值范围 说明
    DATE 1000-01-01 9999-12-31 日期,格式YYYY-MM-DD
    TIME -838:58:59 835:59:59 时间,格式HH: MM: SS
    DATETIME 1000-01-01 00:00:00
    9999-12-31 23:59:59 日期和时间,格式YYYY-MM-DD HH: MM: SS
    TIMESTAMP 用现在的时间减去1970-01-01得到的一个数字,时间标签,在处理报告时使用显示格式取决于M的值
    一个时间段类的全部数字就是时间戳
    YEAR 1901-2155 年份可指定两位数字和四位数字的格式

    运算符

    算术运算符

    +加法
    -减法
    *乘法
    / 除法
    % 求余
    DIV 等同于除法
    MOD 等同于求余

    比较运算符

    = 等于

    大于
    < 小于
    !=或<> 不等于
    is null
    is not null
    between and
    in
    not in
    like
    not like
    regexp

—在select中使用比较运算符(满足返回1,否则返回0)
select 字段 比较运算符 值,其他字段 from 表名;

逻辑运算符

&&或and 与
||或or 或
!或not 非
xor 异或 (都为真或都为假则为0,其余为1)
优先级not 高于 and 高于 or

位运算

& 按位与。进行该运算时,数据库系统会将十进制转换为二进制数。然后对应操作数的每个二进制位上进行与运算。
| 按位或。
` 按位取反
^ 按位异或
<< 按位左移
>> 按位右移

流程语句

  1. 1. 判断流程语句
  2. if ... then ...
  3. elseif ... then ...
  4. else ...
  5. end if
  6. --例:
  7. delimiter //
  8. create procedure example_if(in x int)
  9. begin
  10. if x = 1 then
  11. select 1;
  12. elseif x = 2 then
  13. select 2;
  14. else
  15. select 3;
  16. end if;
  17. end;
  18. 2. 分支流程语句
  19. case ...
  20. when ... then ...
  21. else ...
  22. end case;
  23. --例:
  24. delimiter //
  25. create procedure example_case(in x int)
  26. begin
  27. case x
  28. when 1 then select 1;
  29. when 2 then select 2;
  30. else select 3;
  31. end case;
  32. end
  33. 3. while循环语句
  34. while ... do
  35. ...
  36. end while
  37. --例:
  38. delimiter //
  39. create procedure example_while(out sum int)
  40. begin
  41. declare i int default 1;
  42. declare s int default 0;
  43. while i <= 100 do
  44. set s = s + i;
  45. set i = i + 1;
  46. end while;
  47. set sum = s;
  48. end
  49. --调用该存储
  50. call example_while(@s)//
  51. select @s;
  52. 4. loop循环语句
  53. loop
  54. ...
  55. end loop
  56. --例:
  57. delimiter //
  58. create procedure example_loop(out sum int)
  59. begin
  60. declare i int default 1;
  61. declare s int default 0;
  62. loop_label: loop
  63. set s = s + i;
  64. set i = i + 1;
  65. if i > 100 then
  66. leave loop_label;
  67. end if;
  68. end loop;
  69. set sum = s;
  70. end
  71. //
  72. 5. repeat循环语句
  73. repeat
  74. ...
  75. until ...
  76. end repeat
  77. --例:
  78. delimiter //
  79. create procedure example_repeat(out sum int)
  80. begin
  81. declare i int default 1;
  82. declare s int default 0;
  83. repeat
  84. set s = s + i;
  85. set i = i + 1;
  86. until i > 100
  87. end repeat;
  88. set sum = s;
  89. end

数据操作

  1. 插入数据
  2. insert into 表名(字段) values ...; --插入一条
  3. insert into 表名(字段) values ... , ...; --插入多条
  4. insert into 表名(字段) set ...; --插入一条
  5. insert into 表名(字段) select ...; --插入一个结果集
  6. --更新数据
  7. update 表名 set ... where ...;
  8. --删除数据
  9. delete from 表名 where [order by ...][limit 行数];
  10. --清空表
  11. truncate table 表名;
  12. --查询语句
  13. select ... from 表名 where [group by ... having ...][order by ...][limit 行数];
  14. --查询结果行数为表1.字段行数*表2.字段行数,相当与oraclefull join
  15. select 1.字段,表2.字段 from 1,表2 where ...;
  16. --单表查询
  17. select ... from 表名 where 字段 between ... and ...;
  18. select ... from 表名 where 字段 like ...; --其中%代表0或多个,_代表1
  19. select group_concat(分组字段1),聚合函数(分组字段2) from 表名 group by 分组字段1,分组字段2;
  20. select ... from 表名 limit ...; --limit在最后面
  21. --聚合函数
  22. count() 用于对除*以外的任何参数,返回所选择集合中非null值的行的数目。
  23. --内连接
  24. select * from 1,表2 where 1.字段 = 2.字段;
  25. --外连接
  26. select * from 1 left join 2 on 1.字段 = 2.字段;
  27. /子查询/
  28. --带in关键字的子查询
  29. select * from 1 where 1.字段 in (select 2.字段 from 2 where ...);
  30. --带比较运算符的子查询
  31. select * from 1 where 1.字段 = (select 2.字段 from 2 where ...);
  32. --带exists关键字的子查询(用于检查子查询是否至少返回一行数据)
  33. select * from 1 where [not]exists (select 1 from 2 where 1.字段 = 2.字段);
  34. --带any关键字的子查询(表示满足其中任意一个条件)
  35. select * from 1 where 1.字段 > any (select 2.字段 from 2);
  36. --带all关键字的子查询(表示满足所有条件)
  37. select * from 1 where 1.字段 > all (select 2.字段 from 2);
  38. --合并查询
  39. union --去重
  40. union all --不去重
  41. --正则表达式查询
  42. select * from 1 where 1.字段 regexp '正则表达式';
  43. /函数/
  44. --数学函数(用于处理数字,其中包括绝对值函数、正弦函数、余弦函数获取随机数函数等)
  45. abs(x) 返回x的绝对值
  46. ceil(x) 返回不小于x的最小整数
  47. ceiling(x) 返回不小于x的最小整数
  48. floor(x) 返回不大于x的最小整数
  49. rand(x) 返回0-1的随机数
  50. pi() 返回pi
  51. truncate(x,2) 截取函数
  52. sqrt(x) 求平方根函数
  53. --字符串函数(用于处理字符串,其中包括字符串连接函数、字符串比较函数、字符串中字母大小写转换函数等)
  54. select insert('mrsoft',3,4,'book'); soft替换成book
  55. select insert('mrsoft',3,2,'book'); so替换成book
  56. select upper('mrsoft'); 转大写
  57. select ucase('mrsoft'); 转大写
  58. select left('mrsoft',2); 截取左边两位
  59. select right('mrsoft',2); 截取右边两位
  60. select rtrim('mrsoft '); 去除空格
  61. select substr('mrsoft',1,2); 指定截取
  62. select reverse('mrsoft'); 反转函数
  63. select field('mrsoft','mr','mrsss','mrsoft'); 查找后续与第一个相匹配的,返回第几个
  64. select locate('you','i love you'); 查找you在后面字符串中的第几个位置
  65. select position('mr' in 'mrsoft'); 查找mr在后面字符串中的第几个位置
  66. select instr('mrsoft','mr'); 子串在后面
  67. --日期和时间函数(用于处理日期和时间,其中包括获取当前时间的函数、获取当前日期的函数、返回年份的函数和返回日期的函数)
  68. select current_date(); 返回当前日期
  69. select curdate();
  70. select current_time(); 返回当前时间
  71. select curtime();
  72. select datediff('2021-01-01','2020-01-01'); 返回相隔多少天
  73. select adddate('2021-01-01',interval '1 2'year_month); 加上12个月
  74. select subdate('2021-01-01',interval '1 2'year_month); 减去12个月
  75. --条件判断函数(用于在SQL语句中控制条件选择,其中包括if case when)
  76. case when ... then ... else ... end
  77. --系统信息函数(用于获取MySQL数据库的系统信息,其中包括获取数据库名的函数、获取当前用户的函数和获取数据库版本的函数)
  78. select version(); 查看版本号
  79. select user(); 查看当前用户
  80. select database(); 查看当前数据库
  81. select connection_id(); 查看当前连接id
  82. select session_usr(); 当前会话用户
  83. select charset('aaa'); 查看当前字符集
  84. select collation('bbb'); 查看当前排序方式
  85. --加密函数(用于对字符串进行加密解密,其中包括字符串加密函数和字符串解密函数)
  86. --其他函数(包括格式化函数和锁函数)
  87. select format('3.1415926',2); 保留两位小数
  88. select charset(convert('aaa' using gbk)); 改变字符集
  89. select cast(字段 as 类型); 修改字段类型输出

视图

视图是一个虚拟的表,是从数据库中一个或多个表中导出来的表,其内容由查询定义。(相当于一个linux硬链接)数据库只存放了视图的定义,而并没有存放视图中的数据。
作用:安全性(比如说客户身份证信息之类)、可用使复杂的逻辑简单化易于理解和使用

--查看创建视图的权限
select select_priv,create_view_priv from mysql.user where user = '用户名';

--创建视图
create view 视图名(字段1,字段2...) as select ... from 表名 where ...;

--查看视图
describe 视图名;
show view;
show table status like '视图名';
show create view 视图名\G; --其中\G是分行展示便于查看

--修改视图
create or replace view 视图名(字段1,字段2...) as select ... from 表名 where ...;
alter view 视图名(字段1,字段2...) as select ... from 表名 where ...;

--更新视图
update 视图名 set 字段1 = '值' where ...;   更新视图表原表的数据也会变化

--不能更新的情况
视图中有聚合函数,分组,union,union all,子查询,类型为algorithm和temptable时,以及常量视图

--删除视图
drop view if exists 视图名;