MySQL学习打卡 Day3

1. MySQL表数据类型

截至目前,MySQL一共向用户提供了包括DBD、HEAP、ISAM、MERGE、MyIASM、InnoDB以及Gemeni这7种Mysql表类型。其中DBD、InnoDB属于事务安全类表,而其他属于事务非安全类表。

DBD
Berkeley DB(DBD)表是支持事务处理的表,由Sleepycat软件公司开发。它提供MySQL用户期待已久的功能–事务控制。事务控制在任何数据库系统中都是一个极有价值的功能,因为它们确保一组命令能成功地执行或回滚。

HEAP
HEAP表是MySQL中存取数据最快的表。这是因为他们使用存储在动态内存中的一个散列索引,不过如果MySQL或服务器崩溃,这些内存数据将会丢失。

ISAM
ISAM表是早期MySQL版本的缺省表类型,直到MyIASM开发出来。建议不要再使用它。

MERGE
MERGE是一个有趣的新类型,在3.23.25之后出现。一个MERGE表实际上是又一个MyISAM表的集合,合并而成的一个表,主要是为了效率的考虑,因为这样不仅仅可以提高速度、搜索效率、修复效率而且还节省了磁盘空间。

MyIASM
MyIASM基于了IASM代码,应该可以说是IASM的衍生品,不过增加了不少有用的扩展。它是MySQL的默认数据表类型,基于了传统的ISAM类型,ISAM是Indexed Sequential Access Method(有索引的顺序访问方法)的缩写,一般来说,它是存储记录和文件的标准方法。与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具。ISAM表格可以被压缩,而且它们支持全文搜索,不过它们是事务不安全的,而且也不支持外键。如果事务回滚将会造成不完全回滚,从而不具备原子性。所以假如忽略事务以及访问并发性的话,并且需要执行大量的SELECT检索语句的话,MyISAM将是最好的选择。

InnoDB
InnoDB是MySQL 4.0之后推出的一种比较新的数据表类型,这种类型是事务安全的。它与BDB类型具有相同的特性,它们还支持外键。InnoDB表格速度很快具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它。如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,同样应该使用InnoDB表。对于支持事务的InnoDB类型的表来说,影响速度的主要原因是AUTOCOMMIT默认设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动提交,严重影响了速度。可以在执行sql前调用begin,多条sql形成一个事物(即使autocommit打开也可以),将大大提高性能。

Gemeni
Gemeni表,据听说也是在MySQL 4.0之后推出的,不过截至当前,很少有针对它的介绍,同样应用也就更少了,我们暂时不作介绍。

2. 用SQL语句创建表

语句解释

创建表的通用语法

CREATE TABLE table_name (column_name column_type);

设定列类型 、大小、约束

菜鸟教程上的例子,创建一个runoob表

CREATE TABLE IF NOT EXISTS `runoob_tbl`(
   `runoob_id` INT UNSIGNED AUTO_INCREMENT,  //int是变量类型  AUTO_INCREMENT是自增长
   `runoob_title` VARCHAR(100) NOT NULL,   // NOT NULL 是非空
   `runoob_author` VARCHAR(40) NOT NULL,  
   `submission_date` DATE,  
   PRIMARY KEY ( `runoob_id` )  \\设定主键为'runoob_id'
)ENGINE=InnoDB DEFAULT CHARSET=utf8;  //设定引擎为InnoDB

设定主键

PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。

3. 用SQL语句向表中添加数据

语句解释

向表中插入数据的通用语法

INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );

多种添加方式(指定列名;不指定列名)

4. 用SQL语句删除表

语句解释

可以用drop,truncate,delete删除表
程度从强到弱
1、drop table tb
drop将表格直接删除,没有办法找回
2、truncate (table) tb
删除表中的所有数据,不能与where一起使用
3、delete from tb (where)
删除表中的数据(可制定某一行)

不同方式的区别

区别:truncate和delete的区别
1、事务:truncate是不可以rollback的,但是delete是可以rollback的;
原因:truncate删除整表数据(ddl语句,隐式提交),delete是一行一行的删除,可以rollback
2、效果:truncate删除后将重新水平线和索引(id从零开始) ,delete不会删除索引
3、 truncate 不能触发任何Delete触发器。
4、delete 删除可以返回行数

5. 用SQL语句修改表

修改列名

可以在 ALTER TABLE 语句中使用 RENAME 子句来实现修改表名的目的。

mysql> alter table user rename to user_test;
Query OK, 0 rows affected (0.05 sec)

修改表中数据

update 表名 set 字段名=‘新内容’ + where条件

删除行

可以用上面提到的DELET+WHRER

删除列

可以用alter table 表名 dorp 要删除的列名

alter table user drop user_id;

新建列

可以用alter table 表名 add column 列名 列的属性

alter table TABLE_NAME add column NEW_COLUMN_NAME varchar(20) not null;

新建行

可以用INSERT INTO 语句向表中添加行

INSERT INTO 表名 (字段名1,字段名2,...)
        VALUES(值1,值2,...);

#作业#
项目三:超过5名学生的课(难度:简单)
创建如下所示的courses 表 ,有: student (学生) 和 class (课程)。
例如,表:
±--------±-----------+
| student | class |
±--------±-----------+‘’
| A | Math |
| B | English |
| C | Math |
| D | Biology |
| E | Math |
| F | Computer |
| G | Math |
| H | Math |
| I | Math |
| A | Math |
±--------±-----------+

编写一个 SQL 查询,列出所有超过或等于5名学生的课。
应该输出:
±--------+
| class |
±--------+
| Math |
±--------+
Note:
学生在每个课中不应被重复计算。

答案

SELECT class FROM `courses` GROUP BY class 
HAVING count(DISTINCT student)>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,反之亦然)。要求使用一个更新查询,并且没有中间临时表。
运行你所编写的查询语句之后,将会得到以下表:

id name sex salary
1 A f 2500
2 B m 1500
3 C f 5500
4 D m 500

答案

UPDATE `salary` SET sex= IF(sex = 'f','m','f');

2.2 MySQL 基础 (三)- 表联结
#学习内容#
MySQL别名
INNER JOIN
LEFT JOIN
CROSS JOIN
自连接
UNION
以上几种方式的区别和联系

LEFT JOIN 左连接
按照匹配字段(外键),b表记录与a表记录进行逐一匹配,若有n条匹配,则形成n行。若无匹配,则左表中得记录是全的,即使右表没有匹配的字段存在

INNER JOIN
按照匹配字段(外键)进行逐一匹配,至少有一条匹配,才形成一行,若有n条匹配,则形成n行。(即:外键匹配形成行)

CROSS JOIN
全部匹配。即:生成笛卡尔积连接

UNION
Union和union all表示把查询的结果集并集起来,而不是交集限制: union和union all进行并集的字段必须是同一数据类型union 是去掉重复值 union all不去掉重复值

作业(还没写完)
项目五:组合两张表 (难度:简单)
在数据库中创建表1和表2,并各插入三行数据(自己造)
表1: Person
±------------±--------+
| 列名 | 类型 |
±------------±--------+
| PersonId | int |
| FirstName | varchar |
| LastName | varchar |
±------------±--------+
PersonId 是上表主键

表2: Address
±------------±--------+
| 列名 | 类型 |
±------------±--------+
| AddressId | int |
| PersonId | int |
| City | varchar |
| State | varchar |
±------------±--------+
AddressId 是上表主键

编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:FirstName, LastName, City, State

项目六:删除重复的邮箱(难度:简单)
编写一个 SQL 查询,来删除 email 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
±—±--------+
| Id | Email |
±—±--------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
±—±--------+
Id 是这个表的主键。
例如,在运行你的查询语句之后,上面的 Person表应返回以下几行:
±—±-----------------+
| Id | Email |
±—±-----------------+
| 1 | [email protected] |
| 2 | [email protected] |
±—±-----------------+

DELETE FROM email where id not in (SELECT t.id FROM (SELECT min(id) as id FROM email GROUP BY Email) t );

你可能感兴趣的:(MySQL学习打卡 Day3)