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