MySQL零基础从入门到精通,看完这篇直接毕业!(图文并茂,实战教学)
数据表的创建
1.创建数据表语法
Createtable表名(
字段名1数据类型[完整性约束条件],
字段名2数据类型[完整性约束条件],
....
字段名n数据类型[完整性约束条件]
)characterset字符集collate校对规则;
创建数据库
Createdatabaseitcast;
选择数据库
Useitcast;
2.创建一个用于存储学生成绩的表tb_grade
Createtabletb_grade1(
Idint(11),
Namevarchar(30),
Gradefloat
);
查看当前数据库所存在的表
Showtables;
查看表详细信息
Showcreatetabletb_grade;
查看表详细信息(调整格式)
Showcreatetabletb_grade\G
使用DESC查看数据库
DESCtb_grade;
Field字段名称
Type字段类型
Null表示该列是否可以存储NULL值
Key表示该列是否已经编制索引
Default表示该列是否有默认值
Extra表示附加信息
添加、更新、、删除数据
Createdatabasech03;
Usech03;
Createtablestudent(
Idint(4),
Namevarchar(20)notnull,
Gradefloat
);
使用select*fromstudent;可以查看当前数据表所有记录
添加操作
INSERTINTO表名(字段名1,字段名2,……)把表所有字段写完
VALUES(值1,值2,……);
指定字段名的方式添加记录
案例在student表中添加一条记录
Insertintostudent(id,name,grade)values(1,’zhangsan’,99);
Insertintostudent(name,grade,id)valuse(‘lisi’,88,2);
不指定字段名的方式添加记录
Insertintostudentvalues(3,’wangwu’,77);
1.为表指定字段添加数据
语法
INSERTINTO表名(字段名1,字段名2,……)可以指定添加的字段
VALUES(值1,值2,……);
Insertintostudent(id,name)values(4,’zhaoliu’);
Insertintostudent(id,grade)values(5,78);
错误field‘name’doesn’thaveadefaultvalue
insert语句其他写法
Insertinto表名set字段名1=字段值1,字段名2=字段值3..
Insertintostudentsetid=5,name=’zhangsan’,grade=55;
2.同时添加多条记录
INSERTINTO表名[(字段名1,字段名2,……)]
VALUES(值1,值2,……),(值1,值2,……),
……
(值1,值2,……);
Insertinto student values(6,’xiaohong’,81),(7,’xiaowang’,82),(8,’xiaoming’,82);
直插入IDname
Insertinto student(id,name)values(9,'xiaohong1'),(10,'xiaowang2'),(11,'xiaoming3');
3.2更新数据
语法
update 更新部分数据
案例:更新student 表中id字段值为1的记录。将记录中的name字段的值更新为zhangsan, grade 字段的值更新为50.
Update student set name=’zhangsan’,grade=50 where id=1;
案例2.更新student表中id字段小于3的记录,将grade字段全部修改为100;
Update student set grade=100 where id<3;
Update student set grade=80 where id=1 or id=2;
update 更新全部记录
Update 表名 set 字段名=值;
案例将student 表中的所有记录其中的grade 字段修改为0;
Update student set grade=0 ;
3.3删除数据
语法
Delete from 表名 【where 条件表达式】
删除表中部分记录
案例在student表中,删除id为1的记录;
Delete from student where id=1;
案例2在student 表中删除ID大于3的所有记录
Delete from student where id>3;
删除全部记录
案例 删除student 表中全部记录
Delete from student;
通过truncate删除记录
语法
Truncate 【table】 表名
创建一张新表
Create table tab(
Id int(3) primary key auto_increment,
Name varchar(20)
);
插入记录
Insert into tab(name) values(‘A’),(‘B’),(‘C’),(‘D’),(‘E’),(‘F’);
Delete 与 truncate 区别:
索引
为什么要使用索引:为了提高表的查询速度
一、索引包含几种:
普通索引、唯一索引、全文索引、单列索引、多列索引、空间索引、创建索引
创建表的时候创建索引
Unique:表示唯一索引
Fulltext:全文索引
Spatial: 空间索引
Index和KEY:字段索引 二选一
别名:创建索引的名称,可选
字段名:指定索引对应字段
长度:用于表示索引的长度
Asc和desc:asc 代表升序 desc 降序
二、创建普通索引
案例 在T1表中ID字段上建立索引。
查看索引是否被使用
三、唯一索引创建
四、创建全文索引
五、单列索引
索引字段只有一个叫单列索引,上述三个案例都是单列索引
六、多列索引
注意: 在多列索引中,只有查询条件中使用了这些字段中的第一个字段时,多列索引才会被使用
七、空间索引创建
表的约束
Primarykey主键约束
FOREIGNKEY外键约束
NOTNULL非空约束
UNIQUE唯一约束
DEFAULT默认值约束
1.主键约束
保证该字段唯一并且保证该字段不为空
单字段主键字段名数据类型PRIMARYKEY
案例创建一张数据表EX1并设置id为主键
Createtableex1(
Idintprimarykey,
Namevarchar(20),
Gradefloat
);
Insertintoex1(id,name,grade)vaules(1,’zhangsan’,88);
多字段主键
案例创建ex2表并把id和sud_id两个字段共
同作为主键
Createtableex2(
Idint,
Sud_idint,
Gradefloat,
Primarykey(Id,Sud_id)
);
2.非空约束
定义☞字段的值不能为空(null)
语法字段名数据类型notnull
案例创建ex3把表中的NAME字段设置为非空约
束
Createtableex3(
Idintprimarykey,
Namevarchar(20)notnull,
Gradefloat
);
3.唯一约束
唯一约束用于保证数据表中字段的唯一性,表中
字段的值不允许出现重复值。
语法字段名数据类型unique
案例创建表EX5把sub_id字段设置为唯一约束;
Createtableex5(
Idintprimarykey,
Sub_idintunique,
Namevarchar(20)
);
4.默认约束
默认约束用于给数据表中的字段指定默认值
语法字段名数据类型default默认值
案例创建ex6表,将表中的成绩字段GRADE
设置为默认值为0
Createtableex6(
Idintprimarykey,
Namevarchar(20),
Gradefloatdefault0
);
设置表的字段值自动增加
字段名数据类型AUTO_INCREMENT;
案例创建ex7表,将表中ID字段设置为自动增加。
Createtableex7(
Idintprimarykeyauto_increment,
Namevarchar(20),
Gradefloat
);
基本查询
语法
SELECT [DISTINCT] *|{字段名1, 字段名2, 字段名3,……}
FROM 表名
[WHERE 条件表达式1]
[GROUP BY 字段名 [HAVING 条件表达式2]]
[ORDER BY 字段名 [ASC|DESC]]
[LIMIT [OFFSET] 记录数]
select from 系统关键字
Distinct 去除重复值
*|字段名 *代表当前表中所有字段 两者只能选一个
Where 筛选条件 用于指定查询条件
Group bu 用于将查询结果按照指定字段分组
Having 筛选条件 用于分组后使用
Order by 用于将数据排序, 其中ASC 代表升序 , DESC代表降序 不写默认升序
Limit 控制查询条数
查询所有字段
在select 语句中指定所有字段
Select 字段1,字段2... from 表名
案例查询STUDENT 表中所有记录
1、创建数据库
Create database ch04;
2.选择数据
Use ch04;
3.创建数据表
create table student(
Id int(3) primary key auto_increment,
Name varchar(20) not null,
Grade float,
Gender char(4)
);
添加记录
Insert into student (name,grade,gender) values
(‘songjiang’,40,’n’),(‘wuyong,100,’n’),(‘qinming’,90,’n’),(‘husanniang’,88,’v’),(‘sunerniang’,66,’v’),(‘wusong’,86,’n’),(‘linchong’,92,’n’),(‘yanqing’,90,null);
查询操作
select id,name,grade,gender from student;
通过*号通配符代替所有字段
语法
Select * from 表名
案例 查询student表中所有记录
Select * from student
4.1.3 查询指定字段
语法
Select 字段名1,字段名2,... from 表名
案例 查询student 表中姓名和成绩字段信息
Select name,grade from student;
案例 如果先展示grade 后展示NAME是否可以
4.2 条件查询
4.2.1带关系运算符的查询
案例1.查询student 表中ID为4的学生姓名。
Select id,name from student where id=4;
案例2.查询name 为wusong的学生性别。
Select name,gender from student where name=’wusong’
案例3.查询student 表中 grade 大于80分的学生姓名
Select name,grade from student where grade>80;
4.2.2带in 关键字的查询
案例1.查询student 表中id的值为1,3,4的记录。
Select * from student where id in(1,3,4);
案例2.查询student 表中id的值不为1,3,4的记录。
Select * from student where id not in(1,3,4);
4.2.3带between and 关键字的查询
案例查询student 表中id值在2-5之间的学生姓名;
Select id,name from student where id between 2 and 5;
4.2.4空值查询
案例。查询student 表中gender为空值的记录。
Select * from student where gender is null;
案例2.查询student 表中gender不为空值的记录。
Select * from student where gender is not null;
4.2.5带distinct关键字的查询
Select gender from student;
语法
案例 查询student 表中有哪些性别 要求不重复;
Select distinct gender from student;
案例查询STUDENT 表中gender 和name字段,使用distinct 关键字作用与这两个字段
Select distinct gender,name from student;
案例查询STUDENT表中gender和name字段,使用distinct关键字作用与这两个字段
Selectdistinctgender,namefromstudent;
4.2.6带like关键字的查询
1.带百分号%通配符
案例查找student表中name字段以S开头的学生id;
Selectid,namefromstudentwherenamelike“s%”;
案例查询student表中name字段以W开头,以g结尾的学生id;
Selectid,namefromstudentwherenamelike“w%g”;
案例3.查询student表中name字段值包含y的学生ID;
Selectid,namefromstudentwherenamelike“%y%”;
2.下划线_通配符
案例1查询student表中name字段以wu开始,以字符串ong结尾,并且两个字符串中间
只有一个字符的记录。
Selectid,namefromstudentwherenamelike“wu_ong”;
案例2.name字段值包含7个字符。并且以字符串ing结束的记录。
Selectid,namefromstudentwherenamelike“____ing”;
案例3查询student表中name字段值包含%的记录;
Insertintostudentvalues(null,’sun%er’,98,’n’);
Selectid,namefromstudentwherenamelike“%\%%”;
查询记录时如果需要查询%或者_则在字符前面加上转义字符\;
4.2.7带and关键字的多条件查询
案例查询id字段值小于5,并且gender字段值为v的所有学生信息;
Select*fromstudentwhereid<5andgender=’v’;
案例2.查询id字段值在(1,2,3,4)中name字段值以字符串ng结束,并且grade字
段值小于80的记录;
Select*fromstudentwhereidin(1,2,3,4)andnamelike“%ng”andgrade<80;
4.2.8带or关键字的多条件查询
案例1查询id小于3.或者gender为V的学生信息
Select*fromstudentwhreid<3orgender=’v’;
案例2查询name字段以字符H开后,或者gender字段为V,或者grade为100;
Select*fromstudentwherenamelike‘h%’orgender=’v’orgrade=100;
or和and一起使用的情况
查询gender字段值为V或者gender字段值为男,并且grade为100的记录
Select*fromstudentwheregender=’v’orgender=’n’andgrade=100;
注意,如果and和or一起使用是先执行and后执行or
高级查询
4.3高级查询
- Count 用来统计记录的函数。
案例,统计student表中有多少条记录
Select count(*) from student;
- sum 是用来求和的。
案例 求出grade 字段的总和。
Select sum(grade) from student;
- avg 函数用于求出某字段平均值
案例 求出student 表中grade字段的平均分
Select avg(grade) from student;
- max函数用来求最大值
案例 求grade 字段最大值
Select max(grade) from student;
- Min函数用来求最小值
案例 求grade字段最小值
Select min(grade) from student;
4.3.2对查询结果排序
案例 查出student表中所有记录, 并按照grade 字段进行排序,
Select * from student order by grade;
Select * from student order by grade asc;
案例2 要求降序排列
Select * from student order by grade desc;
案例3.查询所有记录,按照gender 字段的升序,grade字段的降序排列。
Select * from student order by gender asc,grade desc;
4.3.3分组查询
在对表中数据进行统计时,也可能需要按照异地ing的类别进行统计,可以使用 group by ;
语法
- 单独使用group by 分组
案例 按照gender 字段进行分组。
Select * from student group by gender;
- Group by 和聚合函数一起使用
案例 统计一下各个性别分别有多少人
Select count(*),gender from student group by gender;
案例2.统计各个性别的平均分
Select avg(grade),gender from student group by gender;
- group by 和having一起使用
案例1 统计各个性别的平均分, 查询出平均分小于80 的分组。
Select avg(grade)gender from student group by gender having avg(grade)<80;
案例2.统计性别为n 所有人的平均分。
Select avg(grade),gender from student where gender=’n’;
Select avg(grade)gender from student group by gender having gender=’n’;
4.3.4使用LIMIT 限制查询结果的数量
语法
案例1 查询表中前四条记录
Select * from student limit 4
案例2 查询表中grade 字段值从第5位到第8位的学生信息。要求成绩从高到低;
Select * from student order by grade desc limit 4,4
4.3.5函数
- 数学函数
- 字符串函数
案例1 查询表中所有记录, 将各个字段用下划线连接起来
Select concat(id,’_’,name,’_’,grade,’_’,gender) from student;
案例、查询表中ID和gender 字段值,如果gender字段为n,返回1,不为n 返回0
Select id,if(gender=’n’,1,0) from student;
4.4.1为表起别名
案例为student 表起别名为S ,并查询性别为女的记录
Select * from student as s where s.gender=’v’;
4.4.2为字段起别名
案例 给name 和gender字段起别名 分别为stu_name,stu_gender
Select name as stu_name,gender stu_gender from student;
多表操作
5.1.1什么是外键
指引用另一个表中的一列或者多列,被引用的列应该具有主键约束或者唯一性约束外键用来建立和加强两个表数据之间得连接
Create database ch05;
Use ch05;
Create table grade(
Id int(4) not null primary key,
Name varchar(36)
)engine=innodb;
Create table student(
Sid int(4) not null primary key,
Sname varchar(36),
Gid int(4) not null
)engine=innodb;
5.1.2为表添加外键约束
语法
案例为所建两张表添加外键约束
Alter table student add constraint FK_ID foreign key (gid) references grade(id);
5.1.3删除外键约束
语法
Alter table 表名 drop foreign key 外键名;
Alter table student drop forign key FK_ID;
5.2操作关联表
5.2.2添加数据
案例。
把张三的信息添加到STUDENT;
先插入主表grade 中的数据
Insert into grade (id,name) values(1,’yiban’);
Insert into grade (id,name) values(2,’erban’);
再然后往从表里面添加记录 STUDENT
Insert into student(sid,sname,gid) values(1,’wanghong’,1);
Insert into student(sid,sname,gid) values(2,’liqiang’,1);
Insert into student(sid,sname,gid) values(3,’zhaosi’,2);
Insert into student(sid,sname,gid) values(4,’zhangsan’,2);
案例在grade 表中查询出班级名称为yiban 的id
Select id from grade where name=’yiban’;
案例在student 表中,查询GID=1的学生,即为yiban的学生
Select sname from student where gid=1;
5.2.3删除数据
案例。如何删除yiban的记录
1 .将yiban的所有学生全部删除;
Delete from student where gid=1;
- 在GRADE 表中删除yiban;
Delect from grade where id=1;
5.3连接查询
5.3.1交叉连接
语法
Select * from depa,emp; 返回的结果是被连接的两个表中所有行的笛卡儿积。
Select * from 表1 cross join 表2;
部门表
Create table depa(
Did int(4) not null primary key,
Dname varchar(36)
);
员工表
Create table emp(
Id int(4) not null primary key,
Name varchar(36),
Age int(2),
Did int(4) not null
);
为两个表分别插入数据
Insert into depa(did,dname) values(1,'wangluobu');
Insert into depa(did,dname) values(2,'meitibu');
Insert into depa(did,dname) values(3,'yanfabu');
Insert into depa(did,dname) values(4,'renshibu');
insert into emp(id,name,age,did) values(1,'wanghong',20,1);
insert into emp(id,name,age,did) values(2,'liqiang',22,1);
insert into emp(id,name,age,did) values(3,'zhaosi',20,2);
insert into emp(id,name,age,did) values(4,'zhansan',18,4);
案例 使用交叉连接查询部门表和员工表中的所有记录。
Select * from depa,emp;
Select * from depa cross join emp;
5.3.2内链接
语法
又称为简单连接或者自然连接。,
Select depa.dname,emp.name from depa join emp on depa.did=emp.did
Select dname,name from depa,emp where depa.did=emp.did
案例 查询wanghong所在的部门都有哪些员工
Select p1.* from emp p1 join emp p2 on p1.did=p2.did where p2.name=’wanghong’;
5.3.3外连接
包含左连接和右连接。
左连接 返回包含左表中的所有记录和右表中符合连接条件的记录
右连接 返回包含右表中的所有记录和左表中符合连接条件的记录
- Left join
案例
Select * from depa left join emp on depa.did=emp.did;
- right join
Select * from depa right join emp on depa.did=emp.did;
5.3.4符合条件连接查询
符合条件的连接查询就是在连接查询的过程中,通过添加过滤条件来限制查询结果,使查询结果更加精确
案例!把depa 和 emp 内连接,并将查询结果按照年龄从大到小排序。
Select name,age,dname,did from depa join emp on depa.did=emp.did order by age desc;
最后
如果对您有帮助,希望能给个👍评论收藏三连!
博主为人老实,无偿解答问题哦❤
下篇会出MySQL的高级操作哦,有兴趣的小伙伴请继续关注小编~
- 点赞
- 收藏
- 关注作者
评论(0)