MySQL 学习笔记

MySQL 学习笔记

1 定义

数据库中的表:一行叫一条记录。每一列叫一个属性,或一个字段。
主键:表中的某个特殊字段,具有唯一的确定的值,可以根据该字段唯一的确定一条记录
外键:表中的某个字段的值为另一张表(也可以是自身)中的某个字段的值。

2 MySQL 的数据类型

2.1 数值

  1. TINYINT 小整型
  2. INT/INTEGER 整型
  3. BIGINT 长整型
  4. FLOAT 小数
  5. DOUBLIE 双精度小数

2.2 日期

  1. DATE YYYY-MM-DD
  2. TIME HH:MM:SS
  3. YEAT YYYY
  4. DATETIME 混合
  5. TIMESTAMP 高精度

2.3 字符串

  1. CHAR 定长字符串
  2. VARCHAR 不定长
  3. BLOB 二进制文件
  4. LONGBLOB 长二进制文件
  5. TEXT 长文本数据
  6. LONGTEXT 长文本数据
    注:以上仅总结了常用类型,并不是所有类型

3 SQL语句

3.1 数据库的创建

CREATE DATABASE 数据库名 [参数]

例如创建一个名为test的数据库,设置字符集为utf-8

CREATE DATABASE test CHARACTER SET utf8;

出现下面的内容即说明创建成功。

Query OK, 0 rows affected (0.00 sec)

你可以使用下面的语句查看新创建的数据库

SHOW DATABASES;

选择需要操作的数据库

USE test;

执行完上面的语句后出现Database changed,
你所有的操作都将在test数据库中进行。

3.2 创建表

CREATE TABLE 表名 (
    列名 列数据属性 [约束],
    列名 列数据属性,
    ... ...
);

例如创建一个users表id是主键,自增长。
PRIMARY KEY:约束 主键约束
AUTO_INCREMENT:约束 自增长

CREATE TABLE users(
id INTEGER PRIMARY KEY AUTO_INCREMENT,
account VARCHAR(50),
pwd VARCHAR(50),
);

3.3 插入数据

INSERT INTO 表名 VALUES (值1, 值2,...,NULL,...);

这种插入方式一定要将所有的值都写上,如果为空的话写NULL。值与列要一一对应
主键如果设置为自增的话写NULL

也可以指定所要插入数据的列,向下面这样。

INSERT INTO 表名 (列1, 列2,...) VALUES (值1, 值2,....);

按回车后出现

Query Ok, 1 row affected (0.05 sec) 

说明成功。否则请检查SQL语句。

例如向刚刚创建的users表中插入一条数据

INSERT INTO users VALUES(NULL,'admin','admin');

第一列是id,主键自增,不需要插入。

3.4 查询数据

SELECT * FROM 表名 [WHERE 条件]  [参数];

例如查询users表里的所有数据的 account 列。

SELECT account FROM users;

3.4.1 WHERE 查询

可以给FROM后面的表起一个别名。例如:

SELECT tn.id,tn.account FROM tablename AS tn
WHERE tn.id = 1;

3.4.2 WHERE 后的条件语句

WHERE后面可以写多种条件语句。
1. 关系语句: =,>,<,!=,>=,<=
2. 逻辑语句: AND,OR,NOT
3. IS NULL: 是否为空
4. BETWEEN:在两者之间 
    WHERE u.id BETWEEN 11 AND 15;
    id 在11-15之间。
5. IN:在..之中
    WHERE u.account IN (值1,值2,...);
    查询 account 在(值1,值2,...)之中的数据
5. LIKE:模糊匹配 
    WHERE  u.id LIKE '通配符';
    
    通配符
    '%':替代零个或多个字符
    '_':替代一个字符
        WHERE u.account LIKE '%A%';查询account字段中含有'A'的数据。

    [charlist]:字符列中的任何单一字符 
        WHERE u.account LIKE '[ASD]%'; 查询以A S D 开头的数据。
    [!charlist]:不在字符列中的任何单一字符
        WHERE u.account LIKE '[!ASD]%'; 查询不以A S D 开头的数据 

3.4.3 聚合函数

SELECT AVG(列名) FROM 表名
1. AVG(列名):返回某一列的平均值
2. COUNT(列名):返回匹配指定条件的行数
3. FIRST(列名):返回指定的字段中第一个记录的值。
4. LAST(列名):返回指定的字段中最后一个记录的值。
5. MAX(列名):返回一列中的最大值。NULL 值不包括在计算中。 
6. MIN(列名):返回一列中的最小值。NULL 值不包括在计算中。
7. SUM(列名):返回数值列的总数(总额)。
8. UCASE(列名):把字段的值转换为大写。
9. LCASE(列名):把字段的值转换为小写。 
10. MID(列名,开始位置,截取长度):用于从文本字段中提取字符。
SELECT MID(account,1,3) as uname FROM users;
11. LEN(列名):返回文本字段中值的长度。
12. ROUND(列名,小数位数):用于把数值字段舍入为指定的小数位数。
13. CURDATE():返回当前日期。YYYY-MM-DD。
14. CURTIME():返回当前时间。HH:MM:SS。
15. NOW():返回当前时间。YYYY-MM-DD HH:MM:SS。
16. YEAR(d),MONTH(d),DAY(d):分别返回参数的年,月,日。
17. ADDDATE(d,n):在d的时间上加n天。
18. SUBDATE(d,n):在d的时间上减n天。
19. DATE_FORMAT(d,f):格式化时间d。
%a 缩写星期名
%b 缩写月名
%c 月,数值
%D 带有英文前缀的月中的天
%d 月的天,数值(00-31)
%e 月的天,数值(0-31)
%f 微秒
%H 小时 (00-23)
%h 小时 (01-12)
%I(大写的i) 小时 (01-12)
%i 分钟,数值(00-59)
%j 年的天 (001-366)
%k 小时 (0-23)
%l(小写的L) 小时 (1-12)
%M 月名
%m 月,数值(00-12)
%p AM 或 PM
%r 时间,12-小时(hh:mm:ss AM 或 PM)
%S 秒(00-59)
%s 秒(00-59)
%T 时间, 24-小时 (hh:mm:ss)
%U 周 (00-53) 星期日是一周的第一天
%u 周 (00-53) 星期一是一周的第一天
%V 周 (01-53) 星期日是一周的第一天,与 %X 使用
%v 周 (01-53) 星期一是一周的第一天,与 %x 使用
%W 星期名
%w 周的天 (0=星期日, 6=星期六)
%X 年,其中的星期日是周的第一天,4 位,与 %V 使用
%x 年,其中的星期一是周的第一天,4 位,与 %v 使用
%Y 年,4 位
%y 年,2 位

3.4.4 分组查询

GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。

SELECT 列名, 聚合函数
FROM 表名
WHERE 条件
GROUP BY 列名

例如根据用户表中的role属性分组统计每组的人数

SELECT role, COUNT(id)
FROM users
GROUP BY role;

3.4.5 分组过滤

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
例如根据用户表中的role属性分组统计每组的人数,查找人数大于10的role

SELECT role, COUNT(id)
FROM users
GROUP BY role
HAVING COUNT(id)>10;

3.4.6 结果排序

ORDER BY 语句用于根据指定的列对结果集进行排序。
默认为升序,降序使用关键字DESC。
例如根据用户表中的role属性分组统计每组的人数,按照人数降序排列

SELECT role, COUNT(id) count
FROM users
GROUP BY role
ORDER BY count DESC;

3.5 更新数据

UPDATE 表名 SET 列名 = 新值 WHERE 条件

WHERE的修改条件是可选的,不写的话修改表的所有数据

例如修改users表里的数据,将admin用户的密码改为root

UPDATE users SET pwd = 'root' WHERE account = 'admin';

3.6 删除数据

DELETE FROM 表名 WHERE 条件

WHERE的修改条件是可选的,不写的话删除表的所有数据

4 表属性的修改

4.1 表重命名

ALTER TABLE 表名 RENAME 新表名;

4.2 添加新的一列

ALTER TABLE 表名 ADD 列名 列数据类型 [AFTER 插入位置]

例如在users表的pwd字段后面添加一个role字段类型是INTEGER

ALTER TABLE users ADD role INTEGER AFTER pwd;

4.3 修改列

ALTER TABLE 表名 CHANGE 列名称 新列名称 新数据类型;

例如修改users表里的pwd字段改为password,类型是varchar(20)

ALTER TABLE users CHANGE pwd password varchar(20);

5 完整性约束

约束:对表中的列添加的一些限制条件。只有满足这些条件时才能数据才能插入。

5.1 实体完整性

主键不能为空

5.2 参照完整性

外键的值必须是某张表中存在的值,可以为空

5.3 用户自定义完整性

唯一性约束,某一列虽然不为主键,但是依然不能重复。

5.4 添加约束

ALTER TABLE 表名
    ADD CONSTRAINT 约束名 约束类型(列名);

例如,给users表的role列添加外键约束,引用自roles表的id列

ALTER TABLE users
    ADD CONSTRAINT uq_phone FOREIGN KEY (`role`) 
    REFERENCES `roles` (`id`);

5.5 常见约束类型

1. PRIMARY KEY: 主键 
2. CHECK:限制列中的值的范围。MySQL好像不支持
3. UNIQUE:唯一性约束
4. NOT NULL:非空约束
5. FOREIGN KEY:外键约束

6 范式

函数依赖:如果A依赖B,那么当确定A值后,B值也就确定了。
例如,在一张表中由于主键是唯一确定且不重复的。所以,当主键的值确定了,那么其他列的值也就确定了。我们便说,其他列都依赖主键。

完全函数依赖:如果B函数依赖于A,并且对于A的任何一个真子集A1,都有 B不依赖与A1,称A对B完全函数依赖。

部分函数依赖:如果B函数依赖于A,但是B不完全函数依赖于A,称B对A部分函数依赖。
例如,在一张表中,有两列,一列是用户名,而另一列里某些行里记录的是用户的id,而某些行里在这一列里记录的是用户所在部门的id,那么用户名列便部分函数依赖于id列,因为存在某些行依赖于id列的子集(记录是部门id的行)。

传递函数依赖:如果A函数依赖于B,B函数依赖于C,则称A传递函数依赖于C。

6.1 1NF(第一范式)

确保列不可分,即每一列只描述一个属性,即达到1NF

6.2 2NF(第二范式)

在1NF的基础上消除部分函数依赖即达到2NF。即每一个非主属性(非主键列)完全函数依赖于主键。
例如,可以将上面部分函数依赖的例子中的表,改成两张表,一张用户表,一张部门表,所有的用户名列都完全依赖于主键。便达到2NF。

6.3 3NF(第三范式)

在2NF的基础上消除传递函数依赖便达到3NF。即每一个非主属性(非主键列)即不部分依赖于主键,也不传递依赖于主键。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容

  • 目录 MySQL简介 基本输入查询 创建并使用数据库 SELECT语句 选择特殊行 条件 通配符 选择特殊列 排序...
    鬼宇书生阅读 1,031评论 2 1
  • 数据库操作(DDL) 数据库的创建 例如: 查看当前服务器下的数据库列表 查看数据库的定义 查看上一步操作的警告信...
    Cheng0917阅读 559评论 0 0
  • 参考资料 慕课网——与MySQL的零距离接触 前言 本人菜鸟,入IT只为当鼓励师。本编文章主要对 MySQL的一些...
    BeYanJin阅读 318评论 0 2
  • MySQL学习笔记---基础概念和一些基础SQL语句(一) 作者:zhangjunqiang MySQL学习笔记,...
    Omit03阅读 686评论 1 3
  • 时间是上苍赐给我们最好的礼物,我们每个人对待这份礼物的态度不尽相同。 有的人认为时间是我们的奴隶,它是可以管理的,...
    渔洋芳子阅读 173评论 0 0