文章目录
MySQL基础知识
基础表操作
MySQL基本数据类型
类型 | 大小(字节) | 说明 |
---|---|---|
TINYINT | 1 | 小整数值 |
SMALLINT | 2 | 大整数值 |
MEDIUMINT | 3 | 大整数值 |
INT | 4 | 大整数值 |
BIGINT | 8 | 极大整数值 |
FLOAT | 4 | 单精度浮点数值 |
DOUBLE | 8 | 双精度浮点数值 |
CHAR | 0-255 | 定长字符串 |
VARCHAR | 0-65535 | 变长字符串 |
TINYBLOB | 0-255 | 二进制形式的短文本数据 |
BLOB | 0-65535 | 二进制形式的长文本数据 |
MEDIUMBLOB | 0-16777215 | 二进制形式的中等长度文本数据 |
LONGBLOB | 0-4294967295 | 二进制形式的极大文本数据 |
TINYTEXT | 0-255 | 短文本数据 |
TEXT | 0-65535 | 长文本数据 |
MEDIUMTEXT | 0-16777215 | 中等长度文本数据 |
LONGTEXT | 0-4294967295 | 极大文本数据 |
DATE | 3 | 日期值(YYYY-MM-DD) |
TIME | 3 | 时间值或持续时间(HH:MM:SS) |
YEAR | 1 | 年份值(YYYY) |
DATETIME | 8 | 日期加时间值(YYYY-MM-DDhh:mm;ss) |
TIMESTAMP | 8 | 时间戳(YYYYMMDDhhmmss) |
创建和操纵表
每个DBMS(数据库管理系统)的操作语句有所不同,不过差得不多。以下是标准SQL语句,某些语句若无法在你的DBMS运行,请参阅相应DBMS文档。
- 创建表CREATE TABLE
CREATE TABLE 新表名
(
列名 列的定义
);
CREATE TABLE products
(
prod_id CHAR(10) NOT NULL,
prod_name CHAR(254) NOT NULL
);
- 更新表ALTER TABLE
#增加列
ALTER TABLE 表名
ADD 列名 数据类型;
ALTER TABLE products
ADD vend_id CHAR(10);
#删除列
ALTER TABLE 表名
DROP COLUMN 列名;
ALTER TABLE products
DROP COLUMN prod_name;
#删除表
DROP TABLE 表名;
DROP TABLE products;
插入数据
- 插入完整的行
INSERT INTO 表名
VALUES(依序符合规范的各列数据,用逗号隔开);
INSERT INTO customers
VALUES('10001',
'Tom',
'New York',
'USA',
NULL);
- 插入部分行
INSERT INTO 表名(希望插入数据的列名,用逗号隔开)
VALUES(对应列的规范数据,用逗号隔开);
INSERT INTO customers(
cust_id,
cust_country
)
VALUES(
'10001',
'UAS'
);
- 插入检索出的数据
INSERT INTO 表名1(检索出的数据存放的列名,用逗号隔开)
SELECT 检索的列名
FROM 表名2;
INSERT INTO customers(
cust_id,
cust_name)
SELECT new_cust_id,
new_cust_name
FROM newcust;
- 从一个表复制到另一个表SELECT INTO
SELECT 列名
INTO 表名1
FROM 表名2;
SELECT *
INTO cust_copy
FROM customers;
更新和删除数据
- 更新数据UPDATE
UPDATE 表名
SET 列名=新值
WHERE 过滤条件;
UPDATE customers
SET cust_email = '[email protected]'
cust_contact = 'roberts'
WHERE cust_id = '10001';
#删除某个值,可以设置它为NULL
UPDATE customers
SET cust_email = NULL
WHERE cust_id = '10002';
- 删除数据DELETE
#删除某一行数据
DELETE FROM 表名
WHERE 过滤条件;
DELETE FROM customers
WHERE cust_id ='10004';
DELETE删除整行而不是删除列,如果想要删除列使用UPDATE语句,如果删除整个表使用TRUNCATE TABLE
表联结
如果数据存储在多个表中,怎样用一条 SELECT语句就检索出数据呢?答案是使用联结。 简单说, 联结是一种机制,用来在一条 SELECT语句中关联表,因此称为联结。使用特殊的语法,可以联结多个表返回一组输出, 联结在运行时关联表中正确的行。
创建联结
SELECT 需要显示的列名,可以来自不同表
FROM 表名
WHERE 不同表的关联方式;
SELECT vend_name,prod_name,prod_price
FROM vendors,products
WHERE vendors.vend_id = products.vend_id;
叉联结(cross join)
返回笛卡儿积的联结,也称叉联结( cross join)。
内联结(inner join)/等值联结(equijoin)
等值联结( equijoin),它基于两个表之间的相等测试。 这种联结也称为内联结( inner join)。
SELECT vend_name,prod_name,prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
自联结(self-join)
自联结通常作为外部语句,用来替代从相同表中检索数据的使用子查询语句。
自然联结(natural join)
标准的联结(内联结)返回所有数据,相同的列甚至多次出现。自然联结排除多次出现,使每一列只返回一次。
自然联结要求你只能选择那些唯一的列,一般通过对一个表使用通配符( SELECT*),而对其他表的列使用明确的子集来完成。
外联结(outer join)
联结包含了那些在相关表中没有关联行的行。 这种联结称为外联结。
在使用 OUTERJOIN语法时,必须使用 RIGHT或 LEFT关键字指定包括其所有行的表( RIGHT指出的是OUTERJOIN右边的表,而LEFT指出的是OUTERJOIN左边的表)。
不同联结之间的关系可参阅这篇文章:一文搞懂SQL中的各种联结——内联结、自然联结、自联结、交叉联结
以上内容参考于《SQL必知必会》提取码: xymn,如需更深入了解可以查看书籍,这本书简短明了,你可以在十分钟以内看完你希望了解的某一章节。
实践项目(我使用的是navicat for mysql)
基础表操作
练习一:创建一个courses表,查询出所有超过或等于5名学生的课。
- 创建表
- 输入数据
- 查询操作及结果
练习二:创建一个 salary表,如下所示,有m=男性 和 f=女性的值 。
id | name | sex | salary |
---|---|---|---|
1 | A | m | 2500 |
2 | B | f | 1500 |
3 | C | m | 5500 |
4 | D | f | 500 |
交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求使用一个更新查询,并且没有中间临时表。**
- 创建表
- 输入数据
- 交换操作
表联结
练习三:组合两张表
- 创建两张表Person\Address
- 分别在两张表中插入数据
- 联结表并输出查询信息
练习四:删除如下email 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小的那个
Id | |
---|---|
1 | [email protected] |
2 | [email protected] |
3 | [email protected] |
-
创建表
-
输入数据
-
删除重复邮箱(自联结方法)