MySQL基础表操作与表联结

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 Email
1 [email protected]
2 [email protected]
3 [email protected]
  • 创建表
    在这里插入图片描述

  • 输入数据
    在这里插入图片描述

  • 删除重复邮箱(自联结方法)
    在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章