MySQL基础表操作与表联结

MySQL基础知识

基础表操作

MySQL基本数据类型
类型大小(字节)说明
TINYINT1小整数值
SMALLINT2大整数值
MEDIUMINT3大整数值
INT4大整数值
BIGINT8极大整数值
FLOAT4单精度浮点数值
DOUBLE8双精度浮点数值
CHAR0-255定长字符串
VARCHAR0-65535变长字符串
TINYBLOB0-255二进制形式的短文本数据
BLOB0-65535二进制形式的长文本数据
MEDIUMBLOB0-16777215二进制形式的中等长度文本数据
LONGBLOB0-4294967295二进制形式的极大文本数据
TINYTEXT0-255短文本数据
TEXT0-65535长文本数据
MEDIUMTEXT0-16777215中等长度文本数据
LONGTEXT0-4294967295极大文本数据
DATE3日期值(YYYY-MM-DD)
TIME3时间值或持续时间(HH:MM:SS)
YEAR1年份值(YYYY)
DATETIME8日期加时间值(YYYY-MM-DDhh:mm;ss)
TIMESTAMP8时间戳(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 = 'tom@store.com'
	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=女性的值 。

idnamesexsalary
1Am2500
2Bf1500
3Cm5500
4Df500

交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求使用一个更新查询,并且没有中间临时表。**

  • 创建表
    在这里插入图片描述
  • 输入数据
    在这里插入图片描述
  • 交换操作
    在这里插入图片描述

表联结

练习三:组合两张表

  • 创建两张表Person\Address
    在这里插入图片描述
  • 分别在两张表中插入数据
    在这里插入图片描述
  • 联结表并输出查询信息
    在这里插入图片描述

练习四:删除如下email 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小的那个

IdEmail
1a@b.com
2c@d.com
3a@b.com
  • 创建表
    在这里插入图片描述

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值