MySql
命令行
- 所有的语句都以; 结尾
- show databases --查看数据库所有的表
数据库xxx语言
CRUD 增删查改
- DDL 定义
- DML 操作
- DQL 查询
- DCL 控制
操作数据库
操作数据库 > 操作数据库中的表 > 操作数据库中表的数据
mysql关键字不区分大小写
操作数据库
- 创建数据库
如果表名或者字段名是一个特殊字符,需要带 ` 符号(table键上边)
CREATE DATABASE IF NOT EXISTS westos
- 删除数据库
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;
事务
要么都成功,要么都失败
- SQL执行 A给B转钱 A 1000 -----> 200 B 200
- SQL执行 B收到A的钱 A 800 -----> B 400
将一组SQL放在一个批次中去执行
- 原则: ACID原则
- 原子性:两个步骤一起成功或者一起失败,不能只发生其中一个动作
- 一致性:针对一个事务操作前与操作后的状态一致
- 隔离性:针对多个用户同时操作,主要是排除其他事务对本次事务的影响
- 持久性:事务结束后的数据不随着外界原因导致数据丢失
- 脏读:指一个事务读取了另一个事务未提交的数据
- 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。(不一定错误,只是某些场合不对)
- 虚读(幻读):指在一个事务内读取到了别的事务的插入的数据,导致前后读取不一致。(一般是多读了一行)
索引
索引(index)是帮助MySQL高效获取数据的数据结构。提取句子主干,可以得到索引的本质,索引是数据结构。
索引的分类
- 主键索引(PRIMARY KEY):唯一的标识,主键不可重复,只能有一个
- 唯一索引(UNIQUE KEY):避免重复的列出现,唯一索引可以重复,多个列都可以标识 唯一索引
- 常规索引(KEY/INDEX):默认的,index。key关键字来设置
- 全文索引(FullText):在特定的数据库引擎下才有,用于快速定位数据。
索引原则
- 索引不是越多越好
- 不要对进程变动索引加数据
- 小数据量的表不需要加索引
- 索引一般加在常用来查询的字段上
规范数据库设计
糟糕的数据库设计
- 数据冗余,浪费空间
- 数据库插入和删除都会麻烦,异常【屏蔽使用物理外键】
- 程序的性能差
良好的数据库设计
- 节省内存空间
- 保证数据库的完整性
- 方便我们开发系统
软件开发中,关于数据库的设计
- 分析需求:分析业务和需要处理的数据库的需求
- 概要设计:设计关系图 E-R 图
- 数据库不区分大小写,驼峰命名无效
数据库设计三大范式
- 要求数据的每一列都是不可分的原子数据项(原子性) 保证每一列不可再分
- 确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言) 每张表只描述一件事情
- 需要确保数据库中的每一列都和主键直接相关,而不能间接相关
规范性和性能的关系
关联查询的表不能超过三张表
- 考虑商业化的需求和目标
- 规范性能的时候可以适当的考虑一下规范性
排错笔记:
#1166 - Incorrect column name ‘id’
表的栏位名字后如果是有空格会报错