第 11.5 节 MySQL 数据库
UNIX 中连接到数据库、执行 SQL 脚本
建立数据库
数据库命名
数据库命名区分大小写,最长 64 字符,别名最长 256 字符,不能使用数据库关键字。
数据库重命名
查看数据库
进入数据库
删除数据库
更改数据库字符集
SQL 数据类型
tinyint
(1B), smallint
(2B), mediumint
(3B), int
(4B), bigint
(8B)
float
(4B), double
(8B), decimal(整体位数, 小数点后位数)
char
是字符类型,想存字符串用 char(字符数)
unsigned+数据类型
可以设置为无符号的数据类型。
建立表
表重命名
查看数据库有哪些表
展示表结构
显示表全部信息(select 后面细说)
SQL 语法:注释
写脚本加注释是一个好习惯,防止你过一段时间不知道自己写的什么...
主键、唯一、不许为空、自动编号
信息写入表
表新增列
表删除列
表修改列数据类型
表添加主键
表删除主键
表添加唯一性约束
表删除唯一性约束
表添加外键
表删除外键
外键的概念
父表:外键引用的表。父表中的被引用列通常是主键(PRIMARY KEY)或唯一键(UNIQUE)。例如上面的黄色表。
子表:包含外键的表。子表中的外键列指向父表中的主键或唯一键。例如上面的绿色表。
删除父表数据时失败
原因:子表中存在引用该数据的记录。
解决:使用
ON DELETE CASCADE
或先删除子表中的记录。ON DELETE CASCADE
又是一堆内容,先略过。看往下数三个章节。
下面是一个父、子表格和外键的示例
创建父表 customers: 包含列: id:主键,用于唯一标识客户。 name:客户姓名。 email:唯一约束,用于防止重复的电子邮件地址。
创建子表 orders: order_id:主键,用于唯一标识订单。 order_date:记录订单日期。 customer_id:外键列,用于关联客户。 amount:订单金额。
设置外键:
FOREIGN KEY (customer_id) REFERENCES customers(id)
表示子表的 customer_id 列引用父表的 id 列。ON DELETE CASCADE
删除父表记录时,子表中引用该记录的行也会被删除。ON UPDATE CASCADE
更新父表主键时,子表外键列会自动更新。
修改列数据类型
修改表信息、删除行
注:set 你选择了一整列,想修改单个或多个位置的值,就需要 where 的条件来限定,你是要修改整列,还是其中哪个。类似横竖交叉定位一个坐标点。
下面给几个示例:
翻译成人话:把表 book_table
中 Publisher
值为 "人民邮电出版社"
的行,Price 值全乘以 1.2
(就是增加 20%)
“Where 子句”
如果
Price
值小于 50,就...如果
author
值是王阳或者刘天洋,就...如果
name
值是张三或者李四,就... where 接收写在后面的表达式,表达式会运算出一个布尔值。
这里就需要一个知识:SQL 运算符
算术运算符
+
加法运算符-
减法运算符*
乘法运算符/
除法运算符%
取模运算符
比较运算符
=
等于(也是赋值运算符)!=
不等于<
小于>
大于<=
小于等于>=
大于等于<=>
NULL 安全等于,NULL <=> NULL,返回结果是 TRUE
逻辑运算符
and
两条件都为真才返回真,否则为假or
两条件有一个为真就是真,全是假才为假not
反转真假xor
仅一个条件为真才返回真,否则返回假。
特殊运算符
in
:“值在列表中”运算符,用来筛选符合条件的表项,并对符合的项返回一个“真”的布尔值,交给前面 update 或者 delete 进行操作。例如5 in (1, 3, 5)
返回真。between
范围匹配:例如5 between 1 and 10
返回真。like
模式匹配:'abc' like 'a%'
返回真。百分号在这里类似 sh 的通配符。IS NULL
”判断表项是否为 NULL“:NULL IS NULL
返回 TRUE。 例子:查看书名有没有叫《xxx 设计 xxx》的
在一个书籍管理库中会返回类似《mysql 数据库设计》的书名。
这样一来,上面 where 后面的东西不就能看懂了?
自动维护父表和子表之间的参照完整性
CASCADE 级联操作:父表记录删除/更新时,子表中相关记录也被删除/更新。 SET NULL 将子表中的外键列设置为 NULL(要求外键列允许 NULL)。 RESTRICT 拒绝操作:不允许删除/更新父表中被引用的记录(立即返回错误)。 NO ACTION 类似 RESTRICT,但延迟到事务结束时才检查完整性。 SET DEFAULT 设置为默认值,MySQL 不支持。
SELECT 语句
select 后面是列名,写上 *
则是选择所有列
显示 student_table 中,年龄为“student_table 中‘年龄为最大值’的条目”
升序输出和降序输出
ASC 升序,DESC 降序。
LIMIT a, b
截取内容。a 是索引,从 0 开始,b 是偏移量,写几就偏移几。
怎么把别的表给带上(连接查询)
显式连接
name
取自 stu_table
score
取自 score_table
隐式连接
显然隐式连接更加简洁,所以这里推荐大家使用。
最后更新于