文章目录
- MySQL表数据类型
- 用SQL语句创建表
- 用SQL语句向表中添加数据
- 用SQL语句删除表
- 用SQL语句更新表
- MySQL别名
- SQL JOIN表联结
在掌握了SQL语句的基本语法之后,我们下面将进入实操阶段。在实际工作当中,SLQ语句应用最频繁的地方就是对表(TABLE)的各种操作。在关系型数据库当中,绝大部分任务都是根据业务需求编写SQL代码从数据库中各种表中增删改查所需数据,有时候是对一个表操作,大部分时候是在多个表之间进行联合操作。不过,学习表操作之前我们先来了解下,在MySQL数据当中都包括哪些数据类型。
MySQL表数据类型
在MySQL中数据类型大致可以分为三类,分别是数值、日期时间和字符串。
- 数值类型
MySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。下面的表显示了需要的每个整数类型的存储和范围。
类型 | 大小 | 范围(有符号) | 范围(无符号)) | 用途 |
TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 字节 | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 字节 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | "单精度 浮点数值 |
DOUBLE | 8 字节 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 |
浮点数值 | ||||
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
- 日期时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
类型 | 大小 (字节) | 范围 | 格式 | 用途 |
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | "1970/1/1 0:00:00结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | " YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
- 字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
类型 | 大小 | 用途 |
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
用SQL语句创建表
利用CREATE TABLE创建表,需要给出三项信息,分别是表名、字段名以及定义字段。我们来结合示例来看下。
CREATE TABLE World (
name VARCHAR(50) NOT NULL PRIMARY KEY,
continent VARCHAR(50) NOT NULL,
area INT NOT NULL,
population INT NOT NULL DEFAULT 1,
gdp INT NOT NULL
);
创建一个名为World的表,里面包含name、continent、area、population与gdp五个字段,设定name为主键,然后分别设定它们各自的数据类型,且约束这5列都不接受空值,还设定了population字段拿的默认值为1。
从示例我们可以看到,表名紧跟CREATE TABLE关键字,表定义所有列并用圆括号括起来,各列之间用逗号分隔,最后整条语句以圆括号后的分号结束。
用SQL语句向表中添加数据
添加数据使用INSERT,通过这个SQL语句我们将行插入或添加到数据库插入有几种方式:1.插入完成德夯;2.插入行的一部分;3.插入某些查询的结果。我们接着对上面示例进行操作,看看具体如何做的。
INSERT INTO World VALUES ( 'Afghanistan', 'Asia', 652230, 25500100, 20343000 );
INSERT INTO World VALUES ( 'Albania', 'Europe', 28748, 2831741, 12960000 );
INSERT INTO World VALUES ( 'Algeria', 'Africa', 2381741, 37100000, 188681000 );
INSERT INTO World VALUES ( 'Andorra', 'Europe', 468, 78115, 3712000 );
INSERT INTO World VALUES ( 'Angola', 'Africa', 1246700, 20609294, 100990000 );
输出结果:
NAME | continet | area | population | gdp |
+-------------+----------+---------+------------+-----------+
| Afghanistan | Asia | 652230 | 25500100 | 20343000 |
| Albania | Europe | 28748 | 2831741 | 12960000 |
| Algeria | Africa | 2381741 | 37100000 | 188681000 |
| Andorra | Europe | 468 | 78115 | 3712000 |
| Angola | Africa | 1246700 | 20609294 | 100990000 |
| Afghanistan | Asia | 652230 | 25500100 | 20343000 |
| Albania | Europe | 28748 | 2831741 | 12960000 |
| Algeria | Africa | 2381741 | 37100000 | 188681000 |
| Andorra | Europe | 468 | 78115 | 3712000 |
| Angola | Africa | 1246700 | 20609294 | 100990000
示例中将几个国家的信息插入表中。存储到表中每一列数据在VALUES子句中给出,必须给每一列提供一个值。各列必须以它们在表定义中出现的次序·填充。有人可能会问,每次都对一一对照,数据少还可以要是多了很容易弄错。的确,所以以上语法很简单但不安全,后面还会学习其他语句来进行得到同样的结果还可以避免VALUES语句不安全的缺陷。
用SQL语句删除表
MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失。
我们用SQL语句来删除刚才创建的World表。
mysql> drop table world;
Query OK, 0 rows affected (0.49 sec)
刷新navicat,我们可以直观地看到刚刚创建的World表已经消失不见。如果是删除部分数据可不可以?当然可以,使用我们前面已经掌握WHERE子句按需求进行筛选即可。还有,如果我在只是删除表中的数据而保留表本身。这个也是可以做到,需要用到一个新语句TRUNCATE TABLE。
TRUNCATE TABLE World ;
# 系统将会返回
Empty set (0.00 sec)
用SQL语句更新表
更新表定义可以使用ALTER TABLE语句。更改或删除列、增加约束或增加键,这些操作也使用类似的语法。我们重新再创造一次World表,然后对表中的一些信息进行更改,结合SQL代码仔细体会下其中的变化。
alter table world drop column continent;
输出结果:
+-------------+---------+------------+-----------+
| name | area | population | gdp |
+-------------+---------+------------+-----------+
| Afghanistan | 652230 | 25500100 | 20343000 |
| Albania | 28748 | 2831741 | 12960000 |
| Algeria | 2381741 | 37100000 | 188681000 |
| Andorra | 468 | 78115 | 3712000 |
| Angola | 1246700 | 20609294 | 100990000 |
+-------------+---------+------------+-----------+
MySQL别名
在MySQL中通过使用 SQL,可以为表名称或列名称指定别名,以便让表或列的可读性更强。
# 列的 SQL 别名语法
SELECT column_name AS alias_name
FROM table_name;
# 表的 SQL 别名语法
SELECT column_name(s)
FROM table_name AS alias_name;
我们队World表中的name与area字段的列名起个别名再输出,我们对比下最终结果。
+-------------+---------+
| NA | AR |
+-------------+---------+
| Afghanistan | 652230 |
| Albania | 28748 |
| Algeria | 2381741 |
| Andorra | 468 |
| Angola | 1246700 |
SQL JOIN表联结
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。常用的语句有INNER JOIN , LEFT JOIN , CROSS JOIN , 自联结 ,UNION。我们先来看一张图:
一图胜千言。各种联结如果容易搞混的话,结合上图多练几次自然就会上手。下面对主要JOIN语句做一了解。
- INNER JOIN
INNER JOIN 关键字在表中存在至少一个匹配时返回行,如果没有没有匹配到则不会列出。
SELECT *
FROM table1 INNER JOIN table2
ON table1.column_name = table2.column_name;
- LEFT JOIN
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
SELECT *
FROM table1
LEFT [OUTER] JOIN table2
ON table1.column_name = table2.column_name;
- CROSS JOIN
如果没有与CROSS JOIN一起使用WHERE子句,则SQL CROSS JOIN会生成一个结果集,即第一个表中的行数乘以第二个表中的行数。这种结果称为笛卡尔积。
SELECT *
FROM table1
CROSS JOIN table2;
如果WHERE子句与CROSS JOIN一起使用,则其功能类似于INNER JOIN。
实现相同结果的另一种方法是在SELECT之后使用逗号分隔的列名,并在FROM子句之后提及所涉及的表名。
- 自联结(SELF JOIN)
自连接是表与自身连接的连接(也称为一元关系),尤其是当表具有引用其自己的PRIMARY KEY的FOREIGN KEY时。连接表本身意味着表的每一行都与自身以及表的每一行结合。
可以将自联接视为同一表的两个副本的联接。该表实际上并未复制,但SQL执行命令,就像它一样。
用于将表连接到自身的命令的语法与用于连接两个不同表的命令的语法几乎相同。为了区分列名,使用实际表名的别名,因为两个表都具有相同的名称。表名别名在SELECT语句的FROM子句中定义。
SELECT a.column_name,b.column_name ...
FROM table1 a,table1 b
WHERE a.common_filed = b.common_field;
- UNION
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
需要注意的是,UNION操作符选取不同的值,如果允许重复值,需要在UNION后面加上ALL 。