MySQL 基础 (二)- 表操作

MySQL表数据类型

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

数值类型

 TINYINT------------>小整数值

SMALLINT---------->大整数值

MEDIUMINT--------->大整数值

INT或INTEGER------>大整数值

BIGINT----------------->极大整数值

FLOAT------------------->浮点数值

DOUBLE---------------->双精度浮点数值

DECIMAL--------------->小数值

日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR

DATE-------------->YYYY-MM-DD---------->日期值

TIME--------------->HH:MM:SS--------------->时间值或持续时间

YEAR--------------->YYYY--------------------->年份值

DATETIME-------->YYYY-MM-DD HH:MM:SS---->混合时间和日期

TIMESTAMP------>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字节---->二进制形式的中等长度文本数据

2.用SQL语句创建表

create table 表名(列名 类型(大小) 约束)

mysql>CREATE TABLE t_student(
            student_id INT PRIMARY KEY,
            student_name VARCHAR(10) NOT NULL,
            student_birthday DATETIME,
            student_phone INT UNIQUE,
            student_score FLOAT);

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

INSERT INTO 表名称 VALUES (值1, 值2,....)
指定列的话是在表名后添加列的名称,以下是不指定列的添加

方式一:单条插入,

INSERT INTO t_student  VALUES ('lilly', '20', '10', '90')

方式一:多条插入,  

INSERT INTO t_student  VALUES ('lilly', '20', '10', '90'),('bobo', '20', '10', '90'),('any', '20', '10', '90')

4. 用SQL语句删除表

 1、drop table 表名称   

drop table  t_student                   

2、truncate table 表名称                 

truncate  table  t_student        

  3、delete from 表名称 where 列名称 = 值   

delete from  t_student  where test='test'  

区别:

drop(删除表):删除内容和定义,释放空间,drop语句将删除表的结构被依赖的约束,触发器,索引;依赖于该表的存储过程、函数将被保留,但状态会变为invalid

truncate(清空表中的数据):删除内容,释放空间但不删除定义(保留表的数据结构),不能删除行数据,要删就要把表清空。

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

truncate table 删除表中的所有行,但表结构及其列约束,索引等保持不变,新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用delete。如果要删除表定义及其数据,请使用 drop table 语句。

对于由foreign key约束引用的表,不能使用truncate table ,而应使用不带where子句的delete语句。由于truncate table 记录在日志中,所以它不能激活触发器。

执行速度,一般来说: drop> truncate > delete。

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

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

5. 用SQL语句修改表

修改列名

修改表中数据

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

删除列

DELETE FROM 表名称 WHERE 列名称 = 值

    新建列

alter table 表名 add 列名 数据类型。

  

    新建行

创建如下所示的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       |

+---------+------------+                     

创建一个 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,反之亦然)。要求使用一个更新查询,并且没有中间临时表。

update
    salary
set
    sex = if(sex='f','m','f')

  

                            

 

表联结

mysql别名

使用MySQL别名来提高查询的可读性。支持两种别名,列别名和表别名

使用as

#要给列添加别名,可以使用AS关键词后跟别名。
SELECT 列名称 as 别名 FROM 表名

#如果别名包含空格,则必须引用:
SELECT  列名称  as 别名	FROM 'descriptive name'

#因为AS关键字是可选的,可以在语句中省略它。

#给表添加别名
SELECT  列名称 	FROM 表名 as 表别名

INNER JOIN (内连接)

取得两个表中存在连接匹配关系的记录。 

SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2 
ON table_name1.column_name=table_name2.column_name
SELECT 列名称  FROM 表1名  INNER JOIN 表2名  ON 表1.列名=表2.列名   

  

LEFT JOIN(左连接)

关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。

SELECT
	*
FROM
	t_organization AS o
LEFT JOIN t_department AS d ON o.organization_id = d.organization_id

CROSS JOIN  

又称为笛卡尔乘积,实际上是把两个表乘起来。

SELECT * FROM [TABLE 1] CROSS JOIN [TABLE 2]

或者:SELECT * FROM [TABLE 1], [TABLE 2]  

自连接

自连接是连接的一种用法,但并不是连接的一种类型,因为他的本质是把一张表当成两张表来使用。

 

SELECT b.*
from shopping as a,shopping as b
where a.name='lily'
and a.price<b.price
order by b.id2019-04-03

UNION

操作符用于合并两个或多个 SELECT 语句的结果集。  

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2  

在数据库中创建表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

SELECT
p.FirstName,p.LastName,A.City,A.State
FROM
person p
JOIN 
Address A
ON
p.PersonId=A.PersonId

 

编写一个 SQL 查询,来删除 email 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。

+----+---------+

| Id | Email |

+----+---------+

| 1 | a@b.com |

| 2 | c@d.com |

| 3 | a@b.com |

+----+---------+

Id 是这个表的主键。

例如,在运行你的查询语句之后,上面的 Person表应返回以下几行:

+----+------------------+

| Id | Email |

+----+------------------+

| 1 | a@b.com |

| 2 | c@d.com |

+----+------------------+

DELETE e1
FROM email e1, email e2  
WHERE e1.email = e2.email 
AND  
e1.id > e2.id

  

 

 

原文地址:https://www.cnblogs.com/MsHibiscus/p/10646553.html