数据库复习
数据类型
数值类型,作用:存储年龄,等级,id,手机号,身高,薪水等数字。
无符号类型
=========有符号和无符号tinyint==========
#tinyint默认为有符号
MariaDB [db1]> create table t1(x tinyint); #默认为有符号,即数字前有正负号
MariaDB [db1]> desc t1;
MariaDB [db1]> insert into t1 values
-> (-129),
-> (-128),
-> (127),
-> (128);
MariaDB [db1]> select * from t1;
+------+
| x |
+------+
| -128 | #-129存成了-128
| -128 | #有符号,最小值为-128
| 127 | #有符号,最大值127
| 127 | #128存成了127
+------+
#设置无符号tinyint
MariaDB [db1]> create table t2(x tinyint unsigned);
MariaDB [db1]> insert into t2 values
-> (-1),
-> (0),
-> (255),
-> (256);
MariaDB [db1]> select * from t2;
+------+
| x |
+------+
| 0 | -1存成了0
| 0 | #无符号,最小值为0
| 255 | #无符号,最大值为255
| 255 | #256存成了255
+------+=========有符号和无符号tinyint==========
#tinyint默认为有符号
MariaDB [db1]> create table t1(x tinyint); #默认为有符号,即数字前有正负号
MariaDB [db1]> desc t1;
MariaDB [db1]> insert into t1 values
-> (-129),
-> (-128),
-> (127),
-> (128);
MariaDB [db1]> select * from t1;
+------+
| x |
+------+
| -128 | #-129存成了-128
| -128 | #有符号,最小值为-128
| 127 | #有符号,最大值127
| 127 | #128存成了127
+------+
#设置无符号tinyint
MariaDB [db1]> create table t2(x tinyint unsigned);
MariaDB [db1]> insert into t2 values
-> (-1),
-> (0),
-> (255),
-> (256);
MariaDB [db1]> select * from t2;
+------+
| x |
+------+
| 0 | -1存成了0
| 0 | #无符号,最小值为0
| 255 | #无符号,最大值为255
| 255 | #256存成了255
+------+显示长度和存储字节
mysql> create table test(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> desc test;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)int(11)是默认的显示宽度,因为int是用4个字节存储,所以能存储的最大数就是4294967295,是一个十位数字,对于无符号类型,所以默认显示宽度就是11;
同理:tinyint的默认显示宽度是4位。decimal类型
float:浮点型,含字节数为4,32bit, 数值范围为-3.4E38~3.4E38(7个有效位)
double:双精度实型,含字节数为8,64bit 数值范围-1.7E308~1.7E308(15个有效位)
decimal:数字型,128 数值范围 ±1.0 × E28 to ±7.9 × E28(28个有效位)decimal的精度比double大,所能储存的最大数却比double要小 。decimal是存在精度损失的,只不过较小而已!
BIT
BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。
注意:对于位字段需要使用函数读取
bin()显示为二进制
hex()显示为十六进制mysql> create table t(id bit);
Query OK, 0 rows affected (0.03 sec)
mysql> desc t;
+-------+--------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| id | bit(1) | YES | | NULL | |
+-------+--------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> insert t values (1);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t;
+------+
| id |
+------+
| |
+------+
1 row in set (0.00 sec)
mysql> select bin(id) from t;
+---------+
| bin(id) |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)mysql> alter table t modify id bit(5);
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> insert into t values(8);
Query OK, 1 row affected (0.00 sec)
mysql> select bin(id),hex(id) from t;
+---------+---------+
| bin(id) | hex(id) |
+---------+---------+
| 1 | 1 |
| 1000 | 8 |
+---------+---------+
2 rows in set (0.00 sec)字符串类型
存储字符串:
CHAR系列 :CHAR VARCHAR
TEXT系列 : TINYTEXT TEXT MEDIUMTEXT LONGTEXT存储二进制数据:
BINARY系列: BINARY VARBINARY
BLOB 系列: TINYBLOB BLOB MEDIUMBLOB LONGBLOB解析:
/*
char (m)
CHAR列的长度固定为创建表时声明的长度: 0 ~ 255。其中m代表字符串的长度。
PS: 即使数据小于m长度,也会占用m长度
varchar(m)
VARCHAR列中的值为可变长字符串,长度: 0 ~ 65535。其中m代表该数据类型所允许保存的字符串
的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度
更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡text
text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 − 1)个字符。mediumtext
A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.longtext
A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1)
characters.*/
注意:
在查询的时候,CHAR列删除了尾部的空格,而VARCHAR则保留这些空格。
mysql> create table t1(x char(5),y varchar(5));
mysql> insert into t1 values('你瞅啥 ','瞅你妹 ');
mysql> select x,length(x),y,length(y) from t1;
+--------+-----------+----------+-----------+
| x | length(x) | y | length(y) |
+--------+-----------+----------+-----------+
| 你瞅啥 | 9 | 瞅你妹 | 11 |
+--------+-----------+----------+-----------+日期类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等
year
============year===================
create table t_year(born_year year);insert into t_year values (1901),
(2155);
select * from t_year;
+-----------+
| born_year |
+-----------+
| 1901 |
| 2155 |
+-----------+
2 rows in set (0.00 sec)date time datetime
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2017-08-01 19:38:54 |
+---------------------+
1 row in set (0.00 sec)============date,time,datetime===========
create table t_mul(d date,t time,dt datetime);
insert into t_mul values(now(),now(),now());
select * from t_mul;
mysql> select * from t_mul;
+------------+----------+---------------------+
| d | t | dt |
+------------+----------+---------------------+
| 2017-08-01 | 19:42:22 | 2017-08-01 19:42:22 |
+------------+----------+---------------------+
1 row in set (0.00 sec)timestamp
create table t_stamp(t TIMESTAMP);
insert into t_stamp values();
insert into t_stamp values(NULL );
select * from t_stamp;
+---------------------+
| t |
+---------------------+
| 2017-08-01 19:46:24 |
| 2017-08-01 19:46:24 |
+---------------------+
2 rows in set (0.00 sec)枚举类型与集合类型
字段的值只能在给定范围中选择,如单选框,多选框
enum 单选只能在给定的范围内选一个值,如性别 sex 男male/女female
set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)解析:
/*
枚举类型(enum)
An ENUM column can have a maximum of 65,535 distinct elements.
(The practical limit is less than 3000.)
示例:
CREATE TABLE shirts (
name VARCHAR(40),
size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);
INSERT INTO shirts (name, size) VALUES ('dress shirt','large'),
('t-shirt','medium'),
('polo shirt','small');
集合类型(set)
A SET column can have a maximum of 64 distinct members.
示例:
CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
INSERT INTO myset (col) VALUES ('a,d'),
('d,a'),
('a,d,a'),
('a,d,d'),
('d,a,d');
*/
数据库的操作
创建
create database database_name [character set utf8];
删除
drop database [if exists] db_name; 删除数据库
修改
alter database db_name [character set xxx] 修改数据库的字符集
查看
show databases; 显示所有数据库名称
show create database database_name; 查看数据库的创建信息
表操作
1 创建表:
create table table_name (
filed 字段类型 [完整性约束],
filed 字段类型 [完整性约束],
filed 字段类型 [完整性约束],
);
2 查看表
desc table_name; 查看表结构
show tables; 是该数据库下所有的表名
show create table table_name ; 查看数据库的表创建信息
3 修改表:
alter table table_name add field type 完整性约束
alter table table_name modify field type 完整性约束
alter table table_name change field type 完整性约束
alter table table_name drop field type 完整性约束
4 删除表
drop table tab_name;
表记录操作
1 增加记录:
insert [into] tab_name (field1,field2....) values (values1,values2....) ,
(values1,values2....),
... ;
insert tab_name set field=value, field=value,..... ;
2 修改记录
update tab_name set field=value where 子句
3 删除表记录:
delete from tab_name where 子句
清空表记录: 1 delete from tab_name
2 truncate tab_name (数据量大时推荐使用)
4 查询表记录(******)
select * from tab_name : 显示所有的记录的所有字段信息
select [distinct] filed,filed2,..... from tab_name
where 子句
group by 分组 key : 分组条件
having 子句 : 过滤
order by
limit
查询 每一个省份的平均工资
select city,avg(salary) from emp group by city;
查询 平均工资大于8000的省份的名称
select city,avg(salary) from emp group by city having avg(salary) > 8000
多表查询:
内连接查询:
select * from emp inner join dep on emp.dep_id=dep.id;
左外连接查询:
select * from emp left join dep on emp.dep_id=dep.id;
完整性约束:
定义:完整性约束是对字段进行限制,从而符合该字段达到我们期望的效果比如字段含有默认值,不能是NULL等 。直观点说:如果插入的数据不满足限制要求,数据库管理系统就拒绝执行操作
唯一约束:唯一约束可以有多个但索引列的值必须唯一,索引列的值允许有空值
如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE。
自增约束:
MySQL 每张表只能有1个自动增长字段,这个自动增长字段通常作为主键,也可以用作非主键使用,但是请注意将自动增长字段当做非主键使用时必须必须为其添加唯一索引,否则系统将会报错。
主键约束:
primary key : 非空(not null )且 唯一 (unique)
外键约束(关联字段):