一. 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的值 | 小数值 |
日期/时间类型
类型 | 大小(字节) | 范围 | 格式 | 用途 |
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-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDDHHMMSS | 混合日期和时间值,时间戳 |
字符串类型
类型 | 大小 | 用途 |
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字节 | 极大文本数据 |
来源:http://www.runoob.com/mysql/mysql-data-types.html
二. 用SQL语句创建表
创建一个表名为courses为例,创建语法:
CREATE TABLE IF NOT EXISTS courses
(student VARCHAR(2) NOT NULL PRIMARY KEY,
class VARCHAR(10) NOT NULL
)ENGINE=InnoDB;
其中IF NOT EXISTS在创建前判断是否存在,存在则不创建。不想字段为空则设置字段属性为NOT NULL,PRIMARY KEY为主键,可以多列定义。
三. 用SQL语句向表中添加数据
1、指定列名添加
insert into courses(student,class) values('C','Math');
2、不指定列名添加
insert into courses values('A','Math');
四. 用SQL语句删除表
1、DELETE
delete from courses where student='A';
2、DROP
drop table courses;
3、TRUNCATE
truncate table courses;
4、 不同方式的区别:delete是删除表内数据;drop是删除表,truncate是删除表内所有数据。
五. 用SQL语句修改表
1、修改列名:将courses修改为course
alter table courses rename course;
2、修改表中数据:修改数据时带上where限制修改哪一行,否则会将class一列全部修改成English
update courses set class='English' where student='B';
3、删除行
delete from course where student='A';
4、删除列
alter table course drop class;
5、新建列
alter table course add class char(10) not null;
6、新建行
insert into course values('C','Math');
#作业#
项目三:超过5名学生的课(难度:简单)
创建如下所示的courses 表 ,有: student (学生) 和 class (课程)。
例如,表:
编写一个 SQL 查询,列出所有超过或等于5名学生的课。
select distinct class from courses group by class having count(class)>=5;
应该输出:
Note:
学生在每个课中不应被重复计算。
项目四:交换工资(难度:简单)
创建一个 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=(case when sex='m' then 'f'else 'm' end);
MySQL 基础 (三)- 表联结
#学习内容#
1、MySQL别名
为表取别名:
select * from salary as sa;
为字段取别名:
select salary as sal from salary;
2、INNER JOIN内连接
mysql inner join子句将一个表中的行与其他表中的行进行匹配,并允许从两个表中查询包含列的行记录。
3、LEFT JOIN左连接
left join子句从匹配的左右表中查询选择行记录,连接左表中的所有行,在右表中找不到的也显示出来,使用NULL代替。
select student,sex,salary,class from courses left join salary on student=salary;
4、CROSS JOIN交叉连接
连接两个表,结果集包括两个表中的所有行,其中结果集中的每一行都是第一个表中行与第二个表中的行的组合。
select * from courses cross join salary;
5、自连接:单个表内处理数据。
6、UNION:连接两个及以上的select语句,多个select会删除重复的数据。
#作业#
项目五:组合两张表 (难度:简单)
在数据库中创建表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
mysql> create table person(
-> Personld int,
-> FirstName varchar(10),
-> LastName varchar(10)
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> create table Address(
-> Addressld int,
-> Personld int,
-> City varchar(10),
-> State varchar(10)
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> insert into person values(1,'zhang','zhan'),(2,'li','l'),(3,'zhou','zho');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> insert into Address values(1,1,'南京','江宁'),(3,2,'湖南','怀化'),(2,3,'郑州','中原区');
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select FirstName,LastName,City,State from person inner join Address on person.Personld=Address.Personld;
+-----------+----------+--------+-----------+
| FirstName | LastName | City | State |
+-----------+----------+--------+-----------+
| zhang | zhan | 南京 | 江宁 |
| li | l | 湖南 | 怀化 |
| zhou | zho | 郑州 | 中原区 |
+-----------+----------+--------+-----------+
3 rows in set (0.00 sec)
mysql>
项目六:删除重复的邮箱(难度:简单)
编写一个 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 |
+----+------------------+
mysql> select * from email;
+----+---------+
| id | Email |
+----+---------+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
+----+---------+
3 rows in set (0.00 sec)
mysql> delete e1 from email e1,email e2 where e1.email=e2.email and e1.id>e2.id;
Query OK, 1 row affected (0.01 sec)
mysql> select * from email;
+----+---------+
| id | Email |
+----+---------+
| 1 | a@b.com |
| 2 | c@d.com |
+----+---------+
2 rows in set (0.00 sec)