数据库总结

120 阅读5分钟

MySQL——数据库操作

MySQL数据类型

  • TINYINT
  • SMALLINT
  • INT
  • BIGINT
  • FLOAT(M , D) M表示的是有效数字的长度,D表示的是小数点后面的位数
  • DOUBLE(M , D)
  • DECIMAL(M , D) 这个和FLOAT差不多,也是表示小数的,但是这个比FLOAT更准确,不会存在0.1 + 0.2 != 0.3(因为IEEE 754带来的问题。)
  • NUMERIC(M , D) 这个和DOUBLE差不多,跟上面那个一样比DOUBLE更准确一点。
  • VARCHAR(SIZE) 可变长的,SIZE表示最多能包含几个字符
  • TEXT 长文本
  • MEDIUMTEXT 中等长度文本,比上面那个长。
  • BLOG 二进制形式的长文本数据
  • DATETIME 时间日期
  • TIMESTAMP 时间戳

创建数据库

创建数据库,同一个系统里面不能有同名的数据库。

(普通创建)

create database hc_learn;

或者

(如果不存在就创建,如果存在就不会有什么动作)

create database if not exists hc_learn;

创建数据库的名称的时候不能创建以关键字为名字的数据库,如果实在要用就要用到``来标记

create database hc_learn character set utf8;(创建的数据库的字符码集是utf8)

查看数据库

show databases;

可以展现系统里面都有些什么数据库

删除数据库

drop database hc_learn;

选中数据库

use hc_learn;

MySQL——配置文件

修改字符集

  1. 搜索 服务
  2. 在服务里面找到MySQL
  3. 右键属性
  4. 找到执行文件的路径
  5. 通过--defaults-file 后面的路径,找到配置文件
  6. 修改配置文件里面的character-set-server和default-character-set让他们都等于utf8
  7. 保存文件
  8. 重启MySQL服务器

MySQL——数据表操作

创建表

注意:表操作之前记得选中数据库

创建数据表,同一个数据库里面不能有同名的数据表。

create table user(id int ,username varchar(32) , password varchar(32));

查看数据库里面有什么表

show tables;

查看表结构

desc user;

删除数据表

drop table user;

MySQL——数据操作

插入数据

insert into user values(1 , "橘黄小鹿" , "0706");

插入数据的时候指定列

insert into user (username , password) values("HCLL" , "0706");

这个就是指定插入username和password

一次插入多行

insert into user (username , password) values("HC" , "0706"),("LL" , "0706");

查找数据

select * from user;

指定列查询

select id , username from user;

查询字段为表达式

select id + 10 , username from user;

排序

默认是升序排序

select * from user order by id;

降序

select * from user order by id desc;

多列排序

select * from user order by id  , username desc;

去重

select distinct password from user;

条件查询

select * from user where id > 2;

模糊查询

select * from user where username like 'H%';

%代替的是任意个任意字符

_代替的是一个任意字符

分页查询

只查询出前三条

select * from user limit 3;

查询第1条记录从第二条开始.

select * from user limit 1 offset 2;

综合查询

将上面的语句结合起来的时候,我们应该先写where后写order by最后写limit。

修改操作

update user set id = id + 10;

null加任何数都是null

删除操作

delete from user where id > 12;

MySQL——约束

not null

非空,不能是空值

unique

值唯一,不能有重复的。会给列创建索引

default

默认值,就是当不输入的时候就会将默认值输入。

primary key

主键

auto_increment

自增主键,可以手动设置,手动设置之后后面添加的是按照现在最大值之后增加的。

foreign key

外键

要在最后定义外键

create table user(
    id int ,
    username varchar(32) , 
    password varchar(32) ,
    classId int ,
  -- 外键写法
    foreign key(classId) references class(id);
);

foreign key(classId) :当前表的哪一列

references class(id) :依赖的是哪一个外部表的哪一列

在插入的时候会查询,插入到外键的值在外部表的值是否存在

外部表的主键或者unique才能当外键

MySQL——表的设计

一对一

把所有的信息都放到一个表里面,耦合度比较高。

比如一个学生里面放很多关于学生的信息。

一对多

班级和学生

一个班级可以有很多的学生

但是一个学生只能有一个班级

多对多

比如教室和老师

一个教室的学生可以有多个老师来教,一个老师也可以教多个教室的学生。

MySQL——复杂操作

新增

将查找的结果插入到表里面。

insert into user select * from student;

将select查找出来的结果插入到user里面。

注意,插入表的列的个数和类型要相互匹配的。

聚合查询

count

计算行数

select count(*) from user;

select count(id) from user;

这两个的区别就在于对于空值的计算,*是会计算空值的,如果是列的话,是不会计算空值的。

sum

求和

avg

求平均值

max

求最大值

min

求最小值

分组查询

group by

select * from user group by password;

显示的是第一行元素。

where

分组之前,使用条件筛选

select id,username,count(password) from user where username != '橘黄小鹿' group by password;

where先写后面写group by

having

分组之后,使用条件筛选

select id ,username ,count(password) from user group by password having count(password) > 1;

先写group by 后写having

多表查询

笛卡尔积

select * from student , class;

查询每个学生在什么班级

select * from student , class where student.classId = class.ClassId;

join on

select * from student join class;效果等于select * from student , class;

select * from student join class on student.classId = class.ClassId;

效果等于

select * from student , class where student.classId = class.ClassId;

left join on

如果两张表里面的数据没有完全对应,那么会让左边的数据显示完全。

mysql> select * from student left join class on student.classId = class.ClassId;

right join on

如果两张表里面的数据没有完全对应,那么会让右边的数据显示完全。

mysql> select * from student right join class on student.classId = class.ClassId;

in

select * from student where classId in (select ClassId from class where ClassName = 'java');

not in

select * from student where classId not in (select ClassId from class where ClassName = 'java');

union

select * from student where classId = 1 
union
select * from student where classId = 3;

内连接和外连接的区别:

外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完

全显示我们就说是右外连接。

内连接只会显示两张表都有的数据