【MySQL】3. MySQL基础 - 表操作

1. MySQL数据类型

MySQL中定义数据字段的类型对你数据库的优化是非常重要的。

MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型

数值类型

类型大小范围(有符号 signed)范围(无符号 unsigned)用途
TINYINT1 字节(-128,127)(0,255)小整数值
SMALLINT2 字节(-32 768,32 767)(0,65 535)大整数值
MEDIUMINT3 字节(-8 388 608,8 388 607)(0,16 777 215)大整数值
INT或INTEGER4 字节(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值
BIGINT8 字节(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值
FLOAT4 字节(-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)单精度
浮点数值
DOUBLE8 字节(-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的值小数值

日期和时间类型

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

类型大小
(字节)
范围格式用途
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值
TIME3'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间
YEAR11901/2155YYYY年份值
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP4

1970-01-01 00:00:00/2038

结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07

YYYYMMDD HHMMSS混合日期和时间值,时间戳

字符串类型

类型大小用途
CHAR0-255字节定长字符串
VARCHAR0-65535 字节变长字符串
TINYBLOB0-255字节不超过 255 个字符的二进制字符串
TINYTEXT0-255字节短文本字符串
BLOB0-65 535字节二进制形式的长文本数据
TEXT0-65 535字节长文本数据
MEDIUMBLOB0-16 777 215字节二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215字节中等长度文本数据
LONGBLOB0-4 294 967 295字节二进制形式的极大文本数据
LONGTEXT0-4 294 967 295字节极大文本数据

2. 创建表 CREATE TABLE 

创建表时需要给出的信息:表名、表字段名、定义每个表字段

通用语法

CREATE TABLE table_name (column_name column_type);

实例:

CREATE TABLE IF NOT EXISTS `runoob_tbl`(
   `runoob_id` INT UNSIGNED AUTO_INCREMENT,
   `runoob_title` VARCHAR(100) NOT NULL,
   `runoob_author` VARCHAR(40) NOT NULL,
   `submission_date` DATE,
   PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
  • AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
  • PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
  • ENGINE 设置存储引擎,CHARSET 设置编码。

如果已经有一个表 table,希望创建的新表与 table 有同样的结构,可以用以下语法复制:

CREATE TABLE table_copy LIKE table;

3. 添加数据 INSERT INTO

通用语法

-- 插入单行;
INSERT INTO table_name(field1, field2,...fieldN)
VALUES (value1, value2,...valueN);
-- 插入多行;
INSERT INTO table_name(field1, field2,...fieldN)
VALUES (value1, value2,...valueN),
       (value1, value2,...valueN),
       ...;

注意:

  • 如果数据是字符型,必须使用单引号或双引号。
  • 不必为自动递增列(例如上文提到的runoob_id列)指定值,因为MySQL会自动为自动递增列生成值。

如果要为表中所有列指定值,则可以忽略 INSERT 语句中的列名:

-- 插入单行;
INSERT INTO table_name
VALUES (value1, value2,...valueN);
-- 插入多行;
INSERT INTO table_name
VALUES (value1, value2,...valueN),
       (value1, value2,...valueN),
       ...;

使用 SELECT 子句进行插入

INSERT INTO table_1
SELECT c1, c2, FROM table_2;

4. 删除数据

删除部分数据 DELETE

DELETE FROM table_name
WHERE condition;
  • 如果指定 where 子句 则删除满足记录的行,如果不指定,则删除表中的所有行。
  • 除了删除表中的数据之外, DELETE 语句返回删除的行数
  • 如果需要限制删除的行数,则使用 LIMIT 子句,一般与 ORDER BY 共用:
    DELETE FROM table_name
    ORDER BY c1, c2, ...
    LIMIT row_count;

     

删除全表数据 TRUNCATE

TRUNCATE TABLE table_name;
  • TRUNCATE TABLE语句允许您删除表中的所有数据。
  • 语句后面不需要跟 WHERE 子句,一般比 DELETE 语句跟高效。
  • 如果表中有 自增列,则会将此重置为零

删除表 DROP

DROP TABLE table_name ;
  • 删除表及表中的所有数据

三者区别

  1. delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存,以便进行进行回滚操作。

  2. 执行速度一般来说:drop>truncate>delete

  3. delete语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。

  4. runcate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发trigger。

  5. truncate语句执行以后,id标识列还是按顺序排列,保持连续;而delete语句执行后,ID标识列不连续

5. 修改表结构 ALTER

ALTER TABLE 语句可用来添加列,删除列,更改列的数据类型,添加主键,重命名表等等。 以下说明了ALTER TABLE语句语法:

ALTER TABLE table_name action1[,action2,…]

修改列名及类型 CHANGE、MODIFY

使用 CHANGE 关键字修改表名与类型:

ALTER TABLE tasks
CHANGE task_id task_id_new INT(11) NOT NULL AUTO_INCREMENT;
  •  CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型

如果不需要更改列名,也可以使用 MODIFY 关键字:

ALTER TABLE tasks
MODIFY task_id INT(11) NOT NULL AUTO_INCREMENT;

新建列 ADD

ALTER TABLE tasks 
ADD col_name DECIMAL(2,1) NULL
AFTER col_name1;
  • 若不指定位置,则默认插入到最后一列。若要插入在第一列,可以使用 FIRST 关键字

删除列 DROP

ALTER TABLE tasks 
DROP col_name;

重命名表名

ALTER TABLE tasks
RENAME TO tacks2;

6. 修改数据 UPDATE

通用语法

UPDATE table_name SET field1=new_value1, field2=new_value2
[WHERE Clause]
  • 你可以同时更新一个或多个字段。
  • 你可以在 WHERE 子句中指定任何条件,不指定 WHERE 子句将进行全表更新。
  • 你可以在一个单独表中同时更新数据。

实例

1. 超过5名学生的课:

创建如下所示的 courses 表;编写一个SQL查询,列出所有超过或等于5名学生的课,学生在每个课中不应被重复计算。

表内容:
+---------+------------+
| student | class      |
+---------+------------+
| A       | Math       |
| B       | English    |
| C       | Math       |
| D       | Biology    |
| E       | Math       |
| F       | Computer   |
| G       | Math       |
| H       | Math       |
| I       | Math       |
| A       | Math       |
+---------+------------+
超过或等于5名学生的课:
+---------+
| class   |
+---------+
| Math    |
+---------+

代码:

-- 创建表
CREATE TABLE IF NOT EXISTS courses (
	student CHAR (10),
	class CHAR (20)
);

-- 插入数据
INSERT INTO courses
VALUES
	("A", "Math"),
	("B", "English"),
	("C", "Math"),
	("D", "Biology"),
	("E", "Math"),
	("F", "Computer"),
	("G", "Math"),
	("H", "Math"),
	("I", "Math"),
	("A", "Math")
;

-- 查询语句
SELECT class FROM courses GROUP BY class HAVING COUNT(DISTINCT student) >= 5;

2. 交换工资

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

原始表格:
+----+------+------+--------+
| id | name | sex  | salary |
+----+------+------+--------+
|  1 | A    | m    |   2500 |
|  2 | B    | f    |   1500 |
|  3 | C    | m    |   5500 |
|  4 | D    | f    |    500 |
+----+------+------+--------+
交换后:
+----+------+------+--------+
| id | name | sex  | salary |
+----+------+------+--------+
|  1 | A    | f    |   2500 |
|  2 | B    | m    |   1500 |
|  3 | C    | f    |   5500 |
|  4 | D    | m    |    500 |
+----+------+------+--------+

代码:

-- 创建表
CREATE TABLE
IF NOT EXISTS salary (
	`id` INT UNSIGNED AUTO_INCREMENT,
	`name` CHAR (10),
	`sex` CHAR (5),
	`salary` INT,
	PRIMARY KEY (id)
);

-- 插入数据
INSERT INTO salary (`name`, `sex`, `salary`)
VALUES
	("A", "m", 2500),
	("B", "f", 1500),
	("C", "m", 5500),
	("D", "f", 500);

-- 交换 f 和 m 的值
UPDATE salary
SET sex = (CASE sex WHEN "f" THEN "m" ELSE "f" END);

参考:

  1. 数据库:drop、truncate、delete三者删除的区别
  2. MySQL 教程 | 菜鸟教程
  3. MySQL教程 | 易百教程
  4. 《SQL必知必会》

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值