MySql语法概述
数据库概述
数据库就是存储和管理数据的仓库。
常见的数据库有关系型数据库和非关系型数据库。
关系型数据库就是平常使用的数据库,例如Oracle,Mysql等
非关系型数据库是使用键值对来存储数据,例如redis
MySql数据库
连接MySql数据库服务器
mysql -uroot -proot -h127.0.0.1 -P3306
-u 用户名
-p 密码
-h 连接的数据库ip
-P 连接的数据库端口
MySql数据库的增删查
1)新增数据库
create database if not exists mydb1 charset utf-8; --创建mydb1数据库
2)删除数据库
drop database if exists mydb1; --删除mydb1数据库
3)查询数据库
show databases; --查看数据库服务器中的所有数据库
select database(); --查看已经进入的数据库
show create database mydb1; --查看mydb1数据库的建库语句
MySql数据库对表的增删改查
1)新增user表
create table user(
id int primary key,
name varchar(20),
addr varchar(40)
);
补充:新建表时会添加一些字段约束
1.主键约束(primary_key)
如果一个列添加了主键约束,那么这一列就是主键,主键的特点就是唯一且不能为空。
且一张表中只能有一列作为主键。
主键还经常与主键自增一同使用,主键自增(auto_increment)
2.非空约束(not null)
如果为一列添加了非空约束,那么这个列的值就不能为空,但可以重复。
3.唯一约束(unique)
如果为一列添加了唯一约束,那么这个列的指就必须唯一(即不能重复),但是可以为空。
4.外键约束
外键其实就是用于通知数据库中两张表中数据关系的列。这样数据库就会帮我们维护两张表中数据之间的关系
2)删除user表
drop table if exists user;
3)修改user表
--新增一列
alter table user add salary double;
--删除一列
alter table user drop salary;
--修改一列
alter table user modify name varchar(80);
补充:对表中的约束进行增删改
alter table user modify name varchar(40) not null;--在修改列时增删改
--但是在删除主键约束时有些不同
--若主键有自增,则需先删除主键自增
alter table user modify id int primary key;
alter table user drop primary key;
--对外键的新增,删除也需特殊操作
--新增外键
alter table user add constraint fk_user_emp foreign key(id) references emp(id); --fk_user_emp是为外键起的名称
--constraint fk_user_emp语句也可删除,mysql会自动为外键分配一个名字
--删除外键
show create table user;--首先查看user表的建表语句,找到外键的名称
alter table drop foreign key fk_user_emp;
4)查询表
1.查询表结构
desc user;
2.查询建表语句
show create table user;
MySql对表记录的增删改查
1)增加一条表记录
语法:insert into stu (列名1,列名2,列名3)value(值1,值2,值3);
当插入所有列时,列名可省略不写,但是值的个数及顺序必须与列名一致
2)删除表记录
delete from emp;
3)修改表记录
update emp set name='1111'
查询表记录
1)基础查询
select * from emp;
2)where语句查询
select * from emp where id=1;
select * from emp where id >1;
select * from emp where id<1;
select * from emp where id<>1;--不等于
select * from emp where id !=1;--不等于
select * from emp where id>=1;
select * from emp where id <=1;
select * from emp where id between 1 and 10;--区间查询,两边都是闭区间
select * from emp where name like '%杨%';--模糊查询
3)多行函数查询
常用多行函数
count(列名) 一列记录的数量
max(列名) 一列的最大值
min(列名) 一列的最小值
sum(列名) 一列值的总和
avg(列名) 一列值的平均值
补充:
1.多行函数不能用于where子句中。
2.多行函数与是否分组有关,分组与否会直接影响多行函数的结果。
3.多行函数在统计时会自动过滤null值
注意:
-
多行函数和是否分组有关,如果查询结果中的数据没有经过分组,默认整个查询结果是一个组,多行函数就会默认统计当前这一个组的数据。产生的结果只有一个。
-
如果查询结果中的数据经过分组(分的组不止一个),多行函数会根据分的组进行统计,有多少个组,就会统计出多少个结果
4)分组查询
group by
select max(salary) from emp group by gender; --按照姓别分组,并查询出每组薪资的最大值
5)排序查询
order by
select * from emp order by id;--按照id进行排序 asc升序(由低到高),desc降序(由高到低)
6)分页查询
limit (查询页数-1)*每页查询笔数,每页查询笔数(MySql特有的分页查询方式)
select * from emp limit 0,3;----每页查询3条,显示第一页
select * from emp limit 3,3;----每页查询3条,显示第二页
select * from emp limit 6,3;----每页查询3条,显示第三页
7)多表查询
select * from dept inner join emp on dept_id=dept.id;-------内连接查询
select * from dept left join emp on dept_id=dept.id;--------左外连接查询
select * from dept right join emp on dept_id=dept.id;-------右外连接查询
--三者的区别
--内连接查询,会去除两表中多余的值
--左外连接查询,以左边表为准,即使右边表没有对应的记录,也会查询出来
--右外连接查询,以右边表为准,即使左边表没有对应的记录,也会查询出来
8)子查询
将一张表中查询出来的结果做为另一张表的查询条件
补充内容:where和having的区别
1)where是在分组前对记录进行筛选,并且where子句中不能使用多行函数且不能使用列别名,但是可以使用表别名
2)having是在分组后对记录进行筛选,并且having子句中可以使用多行函数,列别名,表别名
注意:
SQL语句的书写顺序
select * | 列名 --要查询哪些列
from 表名 --要查询哪些表
where 条件 --筛选条件
group by 列名 --按照哪一列分组
having 条件 --分组后筛选
order by 列名 --排序
limit 起始笔数,查询笔数 --分页
sql语句的执行顺序
from 表名 --确认要查询哪些表
where 条件 --通过条件进行筛选
select * | 列名 --确定要查询哪些列
group by 列名 --确定根据哪些列进行分组
having 条件 --分组后再进行筛选
order by 列名 --排序
limit 起始笔数,查询笔数 --分页
补充:其他常见函数
curdate() 获取当前日期,格式为年月日
curtime() 获取当前时间,格式为时分秒
sysdate()/now 获取当前日期+时间,格式为年月日时分秒
year(date) 年
month(date) 月
day(date) 日
hour(date) 时
minute(date) 分
second(date) 秒
concat(s1,s2) 将两个字符串连接成一个字符串
concat(x,s1,s2) 将两个字符串连接成一个字符串,并在两个字符串中插入字符x
MySql数据类型
数值类型
1)tinyint 占用1个字节,相当于byte
2)smallint 占用2个字节,相当于short
3)int 占用4个字节
4)bigint 占用8个字节,相当于long
5)float 占用4个字节
6)double 占用8个字节
字符类型
1)char(n)定长字符串,最长255个字符。
特点:即使插入字符不足n个字符,也会占用n个字符,浪费空间,但是存储速度较快。适合存储定长的数据
2)varchar(n)变长自符串,最长不超过65535个字节,但是一般超过255个字符,就会使用text字符
3)text,大文本类型
日期类型
1)date 年月日
2) time 时分秒
3)timestamp 时间戳