一文轻松学会Mysql数据库:DDL操作库表和DML语句增删改查表数据,全文特别详细,安装MYSQL数据请自行搜索,或者搜索我的头条文章有,,建议收藏+关注。不迷路,用的时候找得到。^_^
没有数据库之前,如果我们要进行数据存储,有几种方式:
所以我们需要一个既可以持久化保存数据又可以方便操作的地方来存储数据,这就是我们接下来要给大家介绍的数据库
数据库(DataBase,DB):指长期保存在计算机的存储设备(硬盘)上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合. 还是以文件的方式存在服务器的电脑上的。
说白了就是数据的仓库, 用来保存数据的.
数据库管理程序(DBMS)可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体的数据。
数据库管理系统、数据库和表的关系如图所示:
我们把Sql介绍完成了, 那下面就通过DDL操作数据库
create database 数据库名 [character set 字符集][collate 校对规则] 注: []意思是可选的意思
字符集(charset):是一套符号和编码。
创建一个数据库(默认字符集)
create database web16db;
创建一个day16_2的数据库,指定字符集为gbk(了解)
create database web14_2 character set gbk;
show databases;
show create database 数据库名;
show create database web14_1;
drop database 数据库名;
drop database web14_2;
alter database 数据库名 character set 字符集;
alter database web14_1 character set gbk;
注意:
use 数据库名; //注意: 在创建表之前一定要指定数据库. use 数据库名
use web14_1;
select database();
我们第四章已经把数据库的CRUD讲解完了,下面我们就学习创建表
create table 表(
列 类型 [约束],
列 类型 [约束]
...
);
约束 | 约束关键字 |
主键 | primary key |
唯一 | unique |
非空 | not null |
约束种类:
注意:
先设置了primary key 再能设置auto_increment
只有当设置了auto_increment 才可以插入null 自己维护 否则插入null会报错
id列:
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(40) NOT NULL,
sex INT
);
create table 表名(
列 类型 【约束】,
列 类型 【约束】
);
列名:见名识义 多个单词用_拼接
列类型:tinyint int bigint double char varchar datetime timestamp
列约束:
not null:不能为空
primary key:主键,限制表中的每一行都是唯一的,主键所在的列不能为空也不可以重复
unique key:唯一约束 限制当前列可以为null(只能出现一个),但是不能重复
primary key == unique key + not null
列属性:
auto_increment:自增 用在主键列上,并且该列为整型
zerofill:零填充 用在整型类型列上
unsigned:无符号,最高位不表示正负
1.auto_increment需要和primary key 一起使用
2.unsigned、zerofill不能和primary key一起使用
我们把表创建好了, 下面就来介绍查看表
show tables;
desc student;
我们表创建好了, 如果要增加一列,要删除一列呢# 那下面就来讲解修改表
alter table student add grade varchar(20) not null;
alter table student modify sex varchar(10);
alter table student change grade class varchar(20);
alter table student drop class;
rename table student to teacher
表创建好了, 我们还可以删除。 掌握表的删除
drop table teacher;
drop table 表名;
create table product(
pid int primary key auto_increment, //只有设置了auto_increment id列才可以赋值为null
pname varchar(40),
price double,
num int
);
insert into 表(列,列..) values(值,值..);
注意: 如果没有插入了列设置了非空约束, 会报错的
insert into 表 values(值,值....);
eg:
insert into product values(null,'苹果电脑',18000.0,10);
insert into product values(null,'华为5G手机',30000,20);
insert into product values(null,'小米手机',1800,30);
insert into product values(null,'iPhonex',8000,10);
insert into product values(null,'苹果电脑',8000,100);
insert into product values(null,'iPhone7',6000,200);
insert into product values(null,'iPhone6s',4000,1000);
insert into product values(null,'iPhone6',3500,100);
insert into product values(null,'iPhone5s',3000,100);
insert into product values(null,'方便面',4.5,1000);
insert into product values(null,'咖啡',11,200);
insert into product values(null,'矿泉水',3,500);
命令行插入中文数据报错:
insert into 表名(字段列表) values(值列表)
插入所有的列
insert into 表名 values(值,值,值....)
多行插入
insert into 表名 values(值列表),(值列表),(值列表)...
注意:
我们数据插入成功了, 还可以对已有的数据进行更新。
update 表 set 列 =值, 列 =值 [where 条件]
update product set price = 5000;
UPDATE product set price = 18000 WHERE name = 'Mac';
UPDATE product set price = 17000,num = 5 WHERE name = 'Mac';
UPDATE product set price = price+2 WHERE name = '方便面';
update tb_name set 列1=值1[,列2=值2...] where条件
delete from 表 [where 条件] 注意: 删除数据用delete,不用truncate
删除表中名称为’Mac’的记录
delete from product where pname = 'Mac';
删除价格小于5001的商品记录
delete from product where price < 5001;
删除表中的所有记录
delete from product;
truncate table 表;
delete from 表 【where 条件】 注意:实际开发中,where条件一定不能少
我们上面讲解了对数据的增删改, 下面就来重点讲解数据的简单查询.
select [*] [列名 ,列名] [列名 as 别名 ...] [distinct 字段] from 表名 [where 条件]
select * form 表
select * from product;
select 列名,列名,列名... from 表
select pname, price from product;
SELECT DISTINCT 字段名 FROM 表名; //要数据一模一样才能去重
select distinct price from product;
注意点: 去重针对某列, distinct前面不能先出现列名
select 列名 as 别名 ,列名 from 表 //列别名 as可以不写
select 别名.* from 表 as 别名 //表别名(多表查询, 看主页另外一篇Mysql高级)
select pname , price as 价格 from product;
select pname ,price+10 from product;
注意
select ... from 表 where 条件
//取出表中的每条数据,满足条件的记录就返回,不满足条件的记录不返回
eg: where price between 1000 and 3000 相当于 1000<=price<=3000
-- 查询id为1,3,5,7的
select * from t_product where id = 1
select * from t_product where id = 3
select * from t_product where id = 5
select * from t_product where id = 7
select * from t_product where id in(1,3,5,7)
name like '张%' --查询姓张的用户, 名字的字数没有限制
name like '张_' --查询姓张的用户 并且名字是两个的字的
where 条件1 and 条件2 and 条件3
where 条件1 or 条件2 or 条件3
select * from product where price > 3000;
select * from product where pid = 1;
select * from product where pid <> 1;
select * from product where price between 3000 and 6000;
select * from product where id = 1;
select * from product where id = 5;
select * from product where id = 7;
select * from product where id = 15;
select * from product where id in (1,5,7,15);
select * from product where pname like 'iPho%';
select * from product where price > 3000 and num > 20;
select * from product where pid = 1 or price < 3000;
select [*]|[字段列表] from 表名 [where条件]
select * from tb_name;
有时候我们需要对查询出来的结果排序显示,那么就可以通过ORDER BY子句将查询出的结果进行排序。排序可以根据一个字段排,也可以根据多个字段排序,排序只是对查询的结果集排序,并不会影响表中数据的顺序。
# 创建学生表(有sid,学生姓名,学生性别,学生年龄,分数列,其中sid为主键自动增长)
CREATE TABLE student(
sid INT PRIMARY KEY auto_increment,
sname VARCHAR(40),
sex VARCHAR(10),
age INT,
score DOUBLE
);
INSERT INTO student VALUES(null,'zs','男',18,98.5);
INSERT INTO student VALUES(null,'ls','女',18,96.5);
INSERT INTO student VALUES(null,'ww','男',15,50.5);
INSERT INTO student VALUES(null,'zl','女',20,98.5);
INSERT INTO student VALUES(null,'tq','男',18,60.5);
INSERT INTO student VALUES(null,'wb','男',38,98.5);
INSERT INTO student VALUES(null,'小丽','男',18,100);
INSERT INTO student VALUES(null,'小红','女',28,28);
INSERT INTO student VALUES(null,'小强','男',21,95);
SELECT 字段名 FROM 表名 [WHERE 条件] ORDER BY 字段名 [ASC|DESC]; //ASC: 升序,默认值; DESC: 降序
SELECT * FROM student ORDER BY score DESC
SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];
SELECT * FROM student ORDER BY score DESC, age DESC
select * from tb_name where条件 order by 排序要使用的列[ASC|DESC [,第二列...]]
order by 列 asc/desc, 列 asc/desc;
asc: 升序【默认值】
desc: 降序
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是==纵向查询==,它是对一列的值进行计算,然后返回==一个结果值==。聚合函数会忽略空值NULL
聚合函数用于数学计算统计!
聚合函数 | 作用 |
max(列名) | 求这一列的最大值 |
min(列名) | 求这一列的最小值 |
avg(列名) | 求这一列的平均值 |
count(列名) | 统计这一列有多少条记录 |
sum(列名) | 对这一列求总和 |
SELECT 聚合函数(列名) FROM 表名 [where 条件];
-- 求出学生表里面的最高分数
SELECT MAX(score) FROM student
-- 求出学生表里面的最低分数
SELECT MIN(score) FROM student
-- 求出学生表里面的分数的总和(忽略null值)
SELECT SUM(score) FROM student
-- 求出学生表里面的平均分
SELECT AVG(score) FROM student
-- 统计学生的总人数 (忽略null)
SELECT COUNT(sid) FROM student
SELECT COUNT(*) FROM student
注意: 聚合函数会忽略空值NULL
我们发现对于NULL的记录不会统计,建议如果统计个数则不要使用有可能为null的列,但如果需要把NULL也统计进去呢?我们可以通过 IFNULL(列名,默认值) 函数来解决这个问题. 如果列不为空,返回这列的值。如果为NULL,则返回默认值。
select 聚合函数(列) from 表名;
2.聚合函数 用于数学统计:
3.注意事项
分组查询是指使用 GROUP BY语句对查询信息进行分组
GROUP BY怎么分组的? 将分组字段结果中相同内容作为一组,如按性别将学生分成两组
==GROUP BY将分组字段结果中相同内容作为一组,并且返回每组的第一条数据,所以单独分组没什么用处。分组的目的就是为了统计,一般分组会跟聚合函数一起使用==
SELECT 字段1,字段2... FROM 表名 [where 条件] GROUP BY 列 [HAVING 条件];
-- 根据性别分组, 统计每一组学生的总人数
SELECT sex, count(*) FROM student GROUP BY sex
SELECT sex, count(*) FROM student GROUP BY sex HAVING count(*) > 5
select 分组列,分组统计结果 from 表 [where条件] group by 列 [having条件]
子名 | 作用 |
where 子句 | 1) 对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,即先过滤再分组。2) where后面不可以使用聚合函数 |
having字句 | 1) having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,即先分组再过滤。2) having后面可以使用聚合函数 |
LIMIT是限制的意思,所以LIMIT的作用就是限制查询记录的条数. 经常用来做分页查询
select ... from .... limit a ,b.
LIMIT a,b; |
a:起始行数,从0开始计数,如果省略,默认就是0; a=(当前页码-1)*b; |
b: 返回的行数 |
eg: 分页查询学生, 每一页查询4条
b=4; a=(当前页码-1)*b;
第一页: a=0, b=4;
第二页: a=4, b=4;
第三页: a=8, b=4;
limit a,b;
a:从第几条数据开始查询, 从0开始计数 【a=(当前页码-1)*b】
b: 一页查询的数量【固定的,自定义的】
select...from...where...group by...order by...limit
select...from...where...
select...from...where...order by...
select...from...where...limit...
select...from...where...order by...limit
Mysql进阶:多表联合查询,外键约束,多表间关系,连接查询,内连接查询,隐式内连接,事务特性和隔离级别