数据库基本概念
数据库:信息存储的仓库,包括一系列的关系措施!
表:一个数据库中可以有若干张表(形式上你可以看出我们日常生活中建立的表)
字段:表里面的信息会分若干个栏目来存,这些栏目呢,我们在数据库技术中叫"字段",栏目里面存的具体信息叫"字段值"
记录:一条信息我们叫一条记录一个数据库管理系统中可以建立若干个数据库,每个数据库中又可以建立若干张表,每张表中可以有若干条记录。
MySQL支持的数据类型
数值类型、日期类型、字符串类型
数值类型
类型 大小 范围(有符号) 范围(无符号) 用途 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的值 小数值 无符号数需要在后面加上unsigned,例如int unsigned。
日期类型
类型 大小(字节) 范围 格式 用途 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
YYYYMMDD HHMMSS 混合日期和时间值,时间戳
字符串类型
类型 大小 用途 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字节 极大文本数据
MYSQL语言分类
1)DDL(Data Definition Languages),数据定义语句
数据定义语句,通过这类语言可以对数据库进行创建删除更改
2)DML(Data Manipulation Language),数据操纵语句
数据操纵语句,用于添加、删除、更新和查询数据库记录并检查数据完整性
3)DCL(Data Control Language),数据控制语句
数据控制语句,通过此类语句可以对数据库的相关权限进行设置,对数据库内部的对象进行创建、删除、修改等操作的语言,DDL语句更多的是由数据库管理员(DBA)使用,开发人员一般很少使用
DDL,数据定义语句
1)创建、选择、查看数据库
1>创建数据库
create database 数据库名;
2>选择要操作的数据库
use 数据库名;
3>查看数据库中所有的数据表
show tables;
4>查看数据库
show databases;
2)删除数据库
drop database 数据库名;
3)创建表
1>创建表
create table 表名(
字段1名 字段1类型 [列的约束条件],
字段2名 字段2类型 [列的约束条件],
...
)
注:在哪个数据库里面创建表需要先使用use选择到那个要操作的数据库。
2>查看表的定义
desc 表名;
3>查看创建表的SQL语句
show create table 表名 \G
注:\G选项使得记录能够按照字段竖向排列,
以便更好地显示内容较长的记录,
\G后面无需再加分号
4)删除表
drop table 表名;
5)修改表
1>修改表的字段类型
alter table 表名 modify [column] 字段定义 [first|after 字段名];
2>增加表字段
alter table 表名 add [column] 字段定义 [first|after 字段名];
3>删除表字段
alter table 表名 drop [column] 字段名;
4>字段改名
alter table 表名 change [column] 旧的字段名 字段定义 [first|after 字段名];
注:change与modify都可以修改表的定义,
不同的是change后面需要接两次列名,不方便,
但是优点是change可以修改字段名称
5>修改字段排列排序
alter table 表名 modify 要修改的字段名 数据类型 first;
alter table 表名 modify 要修改的字段名 数据类型 after 字段名;
注:前面介绍的字段增加和修改语法(add/change/modify)中,
都有一个可选项first|after 字段名,这个选择可以用来修改,
字段在表中的位置新增的字段默认是加载在表中最后位置,
而change/modify 默认都不会改变字段的位置
change/first|after 字段名 这些关键字都是属于MySQL在标准SQL上的扩展,
在其他的数据库上不一定适用
6)更改表名
alter table 表名 rename [to] 新的表名;
DML,数据操纵语句
插入、更新、删除记录
1)插入记录
1>插入记录
insert into 表名[(字段1,...,字段n)] values (值1,...,值n);
也可以不用指定字段名,但是values后面的顺序应该和字段的排序一致
2>一次插入多条记录
insert into 表名[(字段1,字段2,字段3,...,字段n)]
values
(值1,值2,值3,...,值n),
(值1,值2,值3,...,值n),
(值1,值2,值3,...,值n);
2)更新记录
1>更新一个表
update 表名 set 字段1=值1,...字段n=值n [where 条件];
2>更新多个表中数据
update 表1,...,表n set 表1.字段1=值1,...,表n.字段n=值n [where 条件];
注:多表更新更多的用在根据一个表的字段来动态的更新另外一个表的字段
例:update t1,t2 set t1.age=2000,t2.age=3000 where t1.id=1 and t2.id=1;
3)删除记录
1>删除单表中的数据
delete from 表名 [where 条件];
不加条件就是删除表中所有的数据。
2>删除多个表中的数据
delete 表1,表2,...表n from 表1,表2,...表n [where 条件];
不管是单表还是多表,不加where条件将会把表中的所有记录删除,
所以操作时一定要小心。
查询记录
0>一般查询
select 字段1,...,字段n from 表名;
select * from 表名;
1>查询不重复的记录
select distinct 字段1,字段2 from 表名;
只要 字段1,字段2 任何一个字段有不同就会被选择!
一般使用distinct,只筛选一个字段!
2>条件查询
select * from 表名 where 条件;
注:条件字段比较符号:=,<,>,>=,<=,!=等比较运算符
多个条件之间可以使用or and等
例:select * from t1 where age >22;
3>排序和限制
排序:
asc:由低到高,也是默认值
select * from 表名 order by 字段名 asc;
desc:由高到底
select * from 表名 order by 字段名 desc;
多个字段排序
select * from 表名 order by 字段1 desc,字段2 desc;
限制:
语句 limit 数字1,数字2
在语句的最后面 加上limit 数字1,数字2 来进行查询数量的限制。
数字1代表从第几条记录开启取(是从0开始的),数字2代表取几条!
4>聚合
①sum求和
select sum(字段名) from 表名;
②count记录总数
select count(*|字段名) from 表名;
③max最大值
select max(字段名) from 表名;
④min最小值
select min(字段名) from 表名;
⑤group by分类聚合
select department,sum(salary) from employee group by department;
⑥with rollup分类聚合后的结果进行再汇总
select sum(salary) from employee group by department with rollup;
⑦having
注:having和where的区别在于,having是对聚合后的结果进行条件过滤,
而where是在聚合前就对记录进行过滤,应该尽可能的对记录进行先过滤!
select sum(salary) from employee group by department having sum(salary)>1000;
在一起使用:select sum(id),max(id),min(id),count(*) from a1;
5>表连接
需求:显示多个表中的字段的时候即可使用表连接
内连接:选取两张表中相互匹配的记录
select 表1.字段1,...,表n.字段n from 表1,...,表n [where 条件];
外连接:不仅仅选取两张相互匹配的记录,并且会选出其他不匹配的记录
1)左连接
概念:包含左边表中的所有记录(包括右表中没有和它匹配的记录)
select 字段1,字段2 from 表1 left join 表2 on 表1.字段n=表2.字段m;
2)右连接
概念:包含右边表中的所有记录(包括左表中没有和它匹配的记录)
连接和右连接是可以相互转换的!
6>子查询
需求:一个查询需要另外一个查询的结果参与的时候
用于子查询的关键字:
in
语法:select * from 表1 where 字段1 in(select 字段2 from 表2);
in 在..里面
注意点 in后面的子语句必须只返回一个字段
若查询结果唯一(只有一条)可以使用=代替in
not in
与in相反
exists
语法:select语句 where exists(select 语句);
exists:后面那个子语句有没有查询出记录来,
如果查询出记录来返回true,
否则就是false并且查询出来的记录的具体的值是NULL也是没有关系,
也是返回true.
not exits
与exists相反
7>记录联合
union 和 union all
例:select * from t1 union select * from t2;
将两个表或者多个表的数据按照一定的查询条件查询出来后,
将结果合并到一起显示这是就需要用到记录联合,
多个select 语句用union或者union all 隔开即可实现
区别:union会将多个查询结果合并后并且进行去除重复后返回
union all则直接合并并不去除重复
联合的条件:查询的列个数要相等。
DCL,数据控制语句
字段常见的属性
1.UNSIGNED 无符号
2.auto_increment
自增(默认从1开始),用于整数类型和带索引的字段,
比如:配合主键使用(其他类型的索引我们以后再说)
create table 表名(字段1 类型 auto_increment,...);
3.主键:
主键可以唯一标识某条记录的一个字段或者多个字段
注意点:
1)主键最好不要设置在某个与实际信息相关的字段上,
主键的作用应该明确且单一
2)主键最好设置在整数类型的字段上面(处理或查询起来效率较高)
3)主键必须不同,并且不能为null
4)既然主键必须不同所以我们会配合 auto_increment属性
5)一个表只能有一个主键,最好只设置在一个字段上
6)根据主键的值来查询记录时可以获得极快的速度
(因为设置了主键的字段已经创建了索引)!
设置主键方法:
在创建表的时候
primary key(字段)
primary key(字段1,字段2)
例如:
create table 表名(
字段1 类型,
...,
字段n 类型n,
primary key(字段i),
...,
primary key(字段j));
也可以直接写在需要创建主键的字段后面
创建表之后设置
alter table 表名 add primary key(字段名);
删除主键:
alter table 表名 drop primary key;
注:如果字段具有auto_increment属性
必须先删除auto_increment属性
4.null 和 not null
alter table 表名 modify 字段名 类型 null;
alter table 表名 modify 字段名 类型 not null;
null规定字段的值是否可以为null
not null即不可以为null,
该属性也可用于其他类型的字段
5.default
alter table 表名 modify 字段名 类型 default 默认值;
设置默认值,该属性也可用于其他类型的字段。