MySQL 基础语法快速入门

mysql基础

三大范式

第一范式(1NF):要求数据库表的每一列都是不可分割的原子数据项。

第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)

第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。

第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

常用数据类型

数值类型

类型有符号无符号
tinyint-128~1270~255
int-2^31 ~ 2^31-10~2^32-1

浮点型

类型大小
float4字节
double8字节

时间日期

类型格式
DatetimeYYYY-mm-dd HH:MMss
DateYYYY-mm-dd
TimeHH:MM:ss
Timestamp时间戳,从1970/1/1开始,格式与Datetime一致

字符串型

格式长度
char最大长度255
varchar可变字符串,最大长度65536
Text通常超过255就会使用

数据库语法

查询已有数据库列表:

show databases;

创建数据库:

create database 数据库库名 [选项];

查看建库语句:

show create database 数据库名;

修改数据库(数据库名不可更改):

alter database 数据库名 [选项];

删除数据库:

drop database [if exists] 数据库名;

进入/使用数据库:

use 数据库名;

数据库约束

约束类型语法举例
非空约束not null
唯一约束unique
主键约束primary kry
条件约束check$ check(id>0)
默认值default$ default ‘ ‘
自增约束auto_increment

表级约束:

字符集:charser/ character set 具体字符集

校对集:collate 具体校对集

存储引擎:engine 具体存储引擎(InnoDB MyISAM)


表语法

例子:

create table t_user(
	id int primary key auto_increment,
  	name char(32) default '',
  	age int
)engine=InnoDB charset=utf8

查看所有表:

show tables;

查询带关键字的表:

show tables like '%关键字%';

查看建表语句:

show create table 表名;

查看表结构:

#三种方式:
desc 表名;
describe 表名;
show columns from 表名;

删除表(可多表删除):

drop table [if exists] 表名1,表名2...;

修改表名:

rename table 旧表名 to 新表名;

修改表选项(字符集,校对集,存储引擎):

alter table 表名 表选项=值;

新增表字段:

alter table 表名 add 字段名 数据类型 [列属性] [位置];

修改表字段:

alter table 表名 change 旧字段 新字段名 数据类型 [列属性] [位置];

删除字段:

alter table 表名 drop 字段名;

表数据操作(增删改查)

插入数据:

insert into 表名(字段列表) values(对应字段值列表1),(对应字段值列表2)...

删除数据:

delete from 表名 [where 条件];

更新数据:

update 表名 set 字段=值 [where 条件];

查询数据:

select */字段列表 from 表名 [where 条件];

查询操作

where条件查询

where的字符串查询不区分大小写,若要区分则用binary

select * from t_user where binary name = 'zhangsan';

like模糊查询

select * from t_user where name like 'zhang%';

占位符:

​ % : 匹配0个或多个字符

​ _ : 匹配1个字符

order by 排序

默认为升序 ASC,倒序使用 DESC

select * from t_user order by name desc;
select * from t_user order by age desc name ASC;

使用多个字段排序时,按先后顺序

按第一字段规则排序时,有重复的数据,再根据第二字段规则排序,以此类推。

且多个字段时,要显式引用ASC/DESC,否则为默认ASC

in 包含

select * from t_user where id in(1,3,5);

between and

#查询id在1到5之间的记录(包含1,包含5)
select * from t_user where id between 1 and 5;

limit 分页

#查询6~15行数据
select * from t_user limit 5 10;

distinct 去除重复

select distinct * from t_user;

聚合函数

函数名作用
AVG返回平均值
count返回总记录条数
sum返回数值总和
min返回最小值
max返回最大值

聚合函数无法与where 一起使用

group by 分组函数

分组函数是根据一个或多个字段的唯一组合结果集进行分组

通常结合聚合函数一起使用

#统计男女人数
select sex as '性别',count(sex)as '人数' 
from t_user 
group by sex;

结果:

根据性别的唯一组合进行分组,分成 男 女 两组,再结合count()函数进行统计

对字段分组:

#统计不同年龄的男女人数
select sex as '性别',age as '年龄',count(sex)as '人数' 
from t_user 
group by sex,age;

结果:

根据sex, age两个字段进行分组,根据不同值进行唯一组合,再结合聚合函数进行统计

having 条件

因为聚合不能与where一起使用,所以有了having

having是用于分组后返回满足条件的数据

#统计不同年龄的男女人数,并要求年龄不小于19
select sex as '性别',age as '年龄',count(sex)as '人数' 
from t_user 
group by sex,age having age>=19;

连接查询

内连接 inner join

左外连接 left join

右外连接 right join

以员工表和部门表为例,dept代表该员工所在的部门:

t_employee表

t_dept表

内连接查询:

 #查询出员工姓名以及其对应的部门名称
 select 
 e.empName,d.deptName
 from t_employee e
 INNER JOIN t_dept d
 ON e.dept = d.id;

结果:

在内连接中赵七没有被查出来,因为他没有对应的部门,现在想要把赵七也查出来,就要使用左外连接查询

 #查询所有员工姓名以及他所在的部门名称
 select e.empName,d.deptName
 from t_employee e
 left join t_dept d 
 on d.id = e.dept;

结果:

右外连接查询与做查询同理,只是基准表的位置发生了变化:

 SELECT e.empName,d.deptName
 from t_employee e
 right join t_dept d 
 on d.id = e.dept;

结果:

总结:

左连接查询时,左表数据全部显示,若右表没有对应数据,则显示为null;

右连接查询时,右表数据全部显示,若左表没有对应数据,则显示为null;

自连接查询

自连接查询就是当前表与自身的连接查询,关键点在于虚拟化出一张表给一个别名

#查询员工以及他的上司的名称,由于上司也是员工,所以这里虚拟化出一张上司表
SELECT e.empName,b.empName
from t_employee e
LEFT JOIN t_employee b
ON e.bossId = b.id;

结果:

全外连接 union

mysql是没有全外连接的(mysql中没有full outer join关键字),想要达到全外连接的效果,可以使用union关键字连接左外连接和右外连接


欢迎访问个人博客:http://www.itle.info/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值