MySql学习笔记

MySql

命令行

  • 所有的语句都以; 结尾
  • show databases --查看数据库所有的表

数据库xxx语言

CRUD 增删查改

  • DDL 定义
  • DML 操作
  • DQL 查询
  • DCL 控制

操作数据库

操作数据库 > 操作数据库中的表 > 操作数据库中表的数据

mysql关键字不区分大小写

操作数据库

  1. 创建数据库
    如果表名或者字段名是一个特殊字符,需要带 ` 符号(table键上边)
CREATE DATABASE IF NOT EXISTS westos
  1. 删除数据库
DROP DATABASE IF EXISTS westos

日期格式:

timestamp 时间戳,1970.1.1到现在的毫秒数

null

  • 没有值,未知
  • 不要使用null进行运算,运算结果为null

创建数据库中的表

CREATE TABLE IF NOT EXISTS 'big' (
`id` INT(4) NOT NULL  COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`emial` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(`id`)
 
)ENGINE=INNODB DEFAULT CHARSET=utf8

BETWEEN…AND… : 在某个范围内 [2,5]

辨析

delete与TRUNCATE 区别

  • 相同点:都能删除数据,都不会删除表结构
  • 不同点:
    • TRUNCATE 重新设置 自增列 计数器会归零
    • TRUNCATE 不会影响事务
运算符 语法 描述
IS NULL a is null 如果操作符为NULL,结果为真
IS NOT NULL a is not null 如果操作符不为NULL,结果为真
BETWEEN a between b and c 若a在b和c之间,则结果为真
LIKE a like b SQL匹配,如果a匹配b,则结果为真
IN a in (a1,a2,a3…) 假设a在a1,或者a2…其中的某一个值中,结果为真
语法 描述
join (连接的表) on(判断的条件) 连接查询
where 等值查询
操作 描述
Inner join 如果表中至少有一个匹配,就返回行
left join 即使右表中没有匹配,也会从左表中返回所有的值
right join 即使左表中没有匹配,也会从右表中返回所有的值

左连接以左边的表为基准

右连接以右边的表为基准

自连接

自己的表和自己的表连接,核心:一张表拆成两张一样的表

SELECT select_list 
[ INTO new_table ] 
FROM table_source 
[ WHERE search_condition ] 
[ GROUP BY group_by_expression ] 
[ HAVING search_condition ] 
[ ORDER BY order_expression [ ASC | DESC ] ] 

ASC:升序
DESC:降序

show tables: show tables作用显示数据库中有哪些数据表

desc table: 作用是显示数据表的表都定义了哪些字段,及各个字段的类型大小,及哪些是主键,哪些有约束条件,以及各个字段是否定义了默认值。

SQL函数

--常用函数
SELECT ABS(-8)  --绝对值
SELECT CEILING(9.4)   --向上取整
SELECT FLOOR(9.4) --向下取整
SELECT RAND() --返回一个 0-1 之间的随机数
SELECT SIGN(10) -- 判断一个数的符号 0-0 负数返回-1,正数返回1

--字符串函数
SELECT CHAR_LENGTH('孤帆远影碧空尽') --字符串长度
SELECT CONCAT('五','角','星') --拼接字符串
SELECT LOWER('KUANG') --小写字母
SELECT UPPER('kuang') --大写字母

--时间函数
SELECT CURDATE() --获取当前日期
2022-03-01

SELECT NOW() --获取当前的时间
2022-03-01 16:25:52

--聚合函数
SELECT COUNT(studentname) FROM student; -- Count(指定列),会忽略所有的null值 速度快
SELECT COUNT(*) FROM student; --   不会忽略null值,本质  计算行数
SELECT COUNT(1) FROM student; --  不会忽略所有的null值 本质 计算行数



SELECT SUM(studentresult) AS 总和 FROM result;
SELECT AVG(studentresult) AS 平均分 FROM result;
SELECT MAX(studentresult) AS 最高分 FROM result;
SELECT MIN(studentresult) AS 最低分 FROM result;


事务

要么都成功,要么都失败

  1. SQL执行 A给B转钱 A 1000 -----> 200 B 200
  2. SQL执行 B收到A的钱 A 800 -----> B 400
    将一组SQL放在一个批次中去执行
  • 原则: ACID原则
    • 原子性:两个步骤一起成功或者一起失败,不能只发生其中一个动作
    • 一致性:针对一个事务操作前与操作后的状态一致
    • 隔离性:针对多个用户同时操作,主要是排除其他事务对本次事务的影响
    • 持久性:事务结束后的数据不随着外界原因导致数据丢失
    • 脏读:指一个事务读取了另一个事务未提交的数据
    • 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。(不一定错误,只是某些场合不对)
    • 虚读(幻读):指在一个事务内读取到了别的事务的插入的数据,导致前后读取不一致。(一般是多读了一行)

索引

索引(index)是帮助MySQL高效获取数据的数据结构。提取句子主干,可以得到索引的本质,索引是数据结构。

索引的分类

  • 主键索引(PRIMARY KEY):唯一的标识,主键不可重复,只能有一个
  • 唯一索引(UNIQUE KEY):避免重复的列出现,唯一索引可以重复,多个列都可以标识 唯一索引
  • 常规索引(KEY/INDEX):默认的,index。key关键字来设置
  • 全文索引(FullText):在特定的数据库引擎下才有,用于快速定位数据。

索引原则

  • 索引不是越多越好
  • 不要对进程变动索引加数据
  • 小数据量的表不需要加索引
  • 索引一般加在常用来查询的字段上

规范数据库设计

糟糕的数据库设计

  • 数据冗余,浪费空间
  • 数据库插入和删除都会麻烦,异常【屏蔽使用物理外键】
  • 程序的性能差

良好的数据库设计

  • 节省内存空间
  • 保证数据库的完整性
  • 方便我们开发系统

软件开发中,关于数据库的设计

  • 分析需求:分析业务和需要处理的数据库的需求
  • 概要设计:设计关系图 E-R 图
  • 数据库不区分大小写,驼峰命名无效

数据库设计三大范式

  1. 要求数据的每一列都是不可分的原子数据项(原子性) 保证每一列不可再分
  2. 确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言) 每张表只描述一件事情
  3. 需要确保数据库中的每一列都和主键直接相关,而不能间接相关

规范性和性能的关系
关联查询的表不能超过三张表

  • 考虑商业化的需求和目标
  • 规范性能的时候可以适当的考虑一下规范性

排错笔记:
#1166 - Incorrect column name ‘id’
表的栏位名字后如果是有空格会报错

上一篇:Python字符串(Json)转换为对象


下一篇:MySQL中concat以及group_concat的使用