mysql学习笔记(二)

  • 约束
    1、约束保证数据的完整性一致性
    2、约束分为表级约束(针对2个或2个以上字段的约束)和列级约束
    3、约束类型包括(按功能划分):
NOT NULL(非空约束)
PRIMARY KEY(主键约束)
UNIQUE KEY(唯一约束)
DEFAULT(默认约束)
FOREIGN KEY(外键约束)
  • FOREIGN KEY:保证数据的一致性完整性;实现一对一一对多的关系。

  • 外键约束的要求:
    1、父表(子表参照的表)和子表(具有外键列的表)必须使用相同的存储引擎,而且禁止使用临时表
    2、数据表的存储引擎只能为InnoDB
    3、外键列和参照列必须具有相似的数据类型。其中数字的长度或是否有符号位必须相同;而字符的长度可以不同
    4、外键列和参照列必须创建索引。如果参照列不存在索引,mysql将自动创建索引,而外键列则不会自动创建

  • 编辑数据表的默认存储引擎:在mysql配置文件my.ini中设置default-storage-engine=INNODB

  • 外键约束的参照操作
    1、CASCADE:从父表删除更新记录将会自动删除或更新子表中匹配的行;例如创建外键约束时添加ON DELETE CASCADE
    2、SET NULL:从父表删除或更新行,并设置子表中的外键列为NULL。若使用该选项,必须保证子表列没有指定NOT NULL,否则操作失败!
    3、RESTRICT拒绝对父表的删除或更新操作;
    4、NO ACTION:标准SQL的关键字,在mysql中与RESTRICT相同。

  • 表级约束与列级约束
    1、列级约束:对一个数据列建立的约束;
    2、表级约束:对多个数据列建立的约束;注意:NOT NULLDEFAULT不存在表级约束,只有列级约束
    3、列级约束既可以在列定义时声明,也可在列定义后声明;而表级约束只能在列定义后声明

  • 修改数据表

1、添加单列

ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name];
# 参数FIRST表示创建的字段插入表头;
# 参数AFTER 表示创建的字段插入某个列的后面;
# 若不添加上面这2个参数,则默认添加到所有列的后面。

2、添加多列

ALTER TABLE tbl_name ADD  [COLUMN] (col_name column_definition, ...),
                     ADD  [COLUMN] (col_name column_definition, ...)
                     ...;

3、删除列

ALTER TABLE tbl_name DROP [COLUMN] col_name;

4、添加主键约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...);
# symbol 为约束名称

5、添加唯一约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...)

6、添加外键约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) reference_definition;

7、添加/删除默认约束

ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT};

8、删除主键约束

ALTER TABLE tbl_name DROP PRIMARY KEY;

9、删除唯一约束

ALTER TABLE tal_name DROP [INDEX | KEY] index_name;

10、删除外键约束

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

11、修改列定义

ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name];

12、修改列名称,可同时重新定义类型和字段的位置

ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name];

13、数据库表更名

# 法一:
ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name;
# 法二:
RENAME  TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2] ...
  • 更新记录(单表更新)
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1 = {expr1|DEFAULT} [, col_name2={expr|DEFAULT}] ... [WHERE where_condition];
  • 删除记录(单表删除)
DELETE FROM tbl_name [WHERE where_condition];
  • 查找记录
SELECT select_expr [, select_expr ...]
[
  FROM table_references  # 从哪个表查询
  [WHERE where_condition]
  [GROUP BY {col_name| position} [ASC | DESC], ...]  # 将查询结果分组
  [HAVING where_condition]  # HAVING子句一般和分组语句一起使用
  [ORDER BY {col_name | expr | position} [ASC | DESC], ...]  # 排序
  [LIMIT {[offset,] row_count | row_count OFFSET offset}]   # 分页查询 
]
  • 星号(*)表示所有列tbl_name.*可以表示命名表的所有列。
  • 查询表达式可以使用[AS] alias_name为其赋予别名。
  • 别名可用于GROUP BYORDER BYHAVING子句。
  • GROUP BY:将查询结果分组
[GROUP BY {col_name| position} [ASC | DESC], ...]
# col_name:字段名;position:查询字段的位置;
# ASC:升序;DESC:降序。
  • 分组条件,要么为一个聚合函数,要么出现在select语句中,否则会出错!
[HAVING where_condition]
  • ORDER BY:对查询结果进行排序
[ORDER BY {col_name | expr | position} [ASC | DESC], ...]
  • 限制查询结果返回的数量
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
# limit 2 表示返回前2条记录
# limit 4, 3 从第5条记录开始返回3条记录
  • 子查询指嵌套在查询内部,且必须始终出现在圆括号内。
  • 子查询可以包含多个关键字或条件,如DISTINCTGROUP BYORDER BYLIMIT函数等。
  • 子查询的外层查询可以是SELECTINSERTUPDATESETDO
  • 子查询返回值:标量一行一列子查询
  • 使用比较运算符的子查询:=><>=<=<>!=<=>
  • ANYSOME、或ALL修饰的比较运算符
operand comparison_operator ANY(subquery);
operand comparison_operator SOME(subquery);
operand comparison_operator ALL(subquery);
ANY SOME ALL
>、>= 最大值 最小值 最大值
<、<= 最大值 最大值 最小值
= 任意值 任意值 -
<>、!= - - 任意值
  • 使用[NOT] IN的子查询,语法结构:operand comparison_operator [NOT] IN (subquery)
  • = ANY运算(任意值)与IN等效。
  • != ALL<> ALL运算与NOT IN等效。
  • 使用[NOT] EXISTS的子查询:若子查询返回了结果,EXISTS则返回TRUE,否则返回FALSE
  • 查看表结构的详细信息
DESC tbl_name; 
  • 多表更新
UPDATE table_references SET col_name1 = {expr1 | DEFAULT} [, col_name2={expr2|DEFAULT}]... [WHERE where_condition];
# table_references 多个表之间的连接
  • table_reference(多表连接):{[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN } ON condition_expr
  • 连接类型:OUTER JOIN(外连接),CROSS JOIN(交叉连接)和INNER JOIN(内连接)
  • 左外连接:LEFT [OUTER] JOIN
  • 右外连接:RIGHT [OUTER] JOIN
  • 使用ON关键字来设定连接条件,也可以使用WHERE 来代替,但WHERE一般用来过滤结果集记录
  • 现有两张表,Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的:
    1、INNER JOIN 查询结果是AB的交集;
    2、LEFT [OUTER] JOIN 产生表A的完全集,而B表中匹配查询条件才有值,没有匹配的则以null值取代。
    3、RIGHT [OUTER] JOIN产生表B的完全集,而A表中匹配查询条件才有值,没有匹配的则以null值取代。
    4、FULL [OUTER] JOIN 产生A和B的并集。对于没有匹配的记录,则会以null做为值。
    5、CROSS JOIN把表A和表B的数据进行一个N*M的组合,即笛卡尔积。如本例会产生4*4=16条记录,这种连接方式很少用!
  • 自身连接:同一个数据表对其自身进行连接。
  • 创建数据表并将查询结果写入数据表中
CREATE TABLE [IF NOT EXISTS] tbl_name [(create_definition, ...)] select_statement;
  • mysql在SELECT语句多表更新多表删除语句中支持JOIN操作
  • 数据库表参照,数据库表可以使用tbl_name AS alias_nametbl_name alias_name赋予别名table_subquery可作为子查询使用在FROM子句中,注意:这样的子查询必须为其赋予别名
tbl_name [[AS] alias] | table_subquery [AS] alias
  • 多表删除
DELETE tbl_name[.*] [, tbl_name[.*]] ... FROM table_references [WHERE where_condition]; 
# 删除自身一些重复记录需用到表别名
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容