MySql基础教程
SQL语句的分类
Sql语句是专门用来操作数据库的一种语言,我们之前在学习WebSql的时候,简单的了解过Sql语句,但是这些Sql语句,它还有一个分类
-
DDL类型SQL语句(Database Define Language)
数据库定义语言,Create ,Drop,Alter,Change,Modify等关键字
DDL语句只有数据库当中的结构有关系,不与数据库当中的数据有关系(不操作数据库当中的数据,只操作数据库的结构)
-
DML类型SQL语句(Database Manipulation Language)
数据库操作语言,Insert ,Delete ,Select,Update等关键字
DML语句只操作数据库的内容,不参于数据库结构的设计
-
DCL类型SQL语句
DDL类型SQL语句学习
-
连接数据库【命令】
$ mysql -h 127.0.0.1 -u root -p123456;
上面的命令是连接一个mysql的数据库
-h代表的是hostname ,如果省略掉,则默认就是连接到自己的电脑
-u代表 username
-p代表password ,如果省略掉,则默认是空密码(安装的时候没有设置密码)
-
显示所有的数据库
show databases;
注意:一条sql语名写完了以后,一定要加上分号
;
-
切换数据库
use 数据库名;
-
创建数据库
create database 数据库名;
-
删除数据库
drop database 数据库名;
-
显示所有数据表
show tables;
-
创建数据表
create table 数据库表名(列名 数据类型)
mysql> create table if not exists stu_info( -> s_id varchar(50), -> s_name varchar(50), -> s_age int, -> s_sex varchar(10) -> )engine=innodb default charset=utf8;
mysql> create table if not exists score_info( -> s_id varchar(50) not null, -> score float not null default 0 -> )engine=innodb default charset=utf8;
not null代表此列不能为空
default代表设置这一列的默认值,如果在插入的过程当中,没有输入值,则会使用默认值去替代
-
删除数据表
drop table 数据库表名
-
显示数据表中列的信息
show columns from 数据表名
-
显示数据库中列的信息2
desc 数据表名
-
新增数据表的列
```mysql
alter table 表名 add column 列名 数据类型
```
-
删除数据表中的列
alter table 表名 drop column 列名
-
修改数据表中列的属性
alter table 表名 modify 列名 列属性; alter table stu_info modify s_sex varchar(10) not null default 'boy';
-
修改数据表中列的名称
alter table 表名 change column 原列名 新列名 列属性
-
修改数据库表名
alter table 原表名 rename 新表名
-
表中的唯一约束**(可为NULL)**
什么是唯一约束?
在向数据表中插入数据的时候,某一列的数据如果设置了唯一约束,则在插入的时候,这一列不允许出现重复的数据
唯一约束仅仅只是内容唯一,可以插入空值
alter table student_info modify s_name varchar(50) unique;
unique关键字就是用来设置唯一项的
-
数据表的主键
什么是主键?
主键是比唯一约束更严格的约束项,它必须唯一,并且不能为空,表现形式为
PRI
一个数据表最好至少有一个主键,这个方便我们数据库的操作
优点:可以帮我们快速的去找到数据表的一条数据,找到记录以后,我们可以对这条记录相关操作,这样可以提高我们的开发效率
-
第一种情况设置主键
手动的设置不为空的唯一项
mysql> create table if not exists stu_info( -> s_id varchar(50) not null unique, -> s_name varchar(50) not null -> )engine=innodb default charset=utf8;
-
第二种情况创建
直接使用
primary key
关键字创建mysql> create table if not exists stu_info( -> s_id varchar(50) primary key, -> s_name varchar(50) not null -> )engine=innodb default charset=utf8;
-
第三种情况
在添加完列以后,再单独设置
mysql> create table if not exists stu_info( -> s_id varchar(50), -> s_name varchar(50) not null, -> primary key(s_id) -> )engine=innodb default charset=utf8;
-
第四种情况,在已存在的表里面去添加主键
alter table stu_info modify s_id varchar(50) not null unique;
alter table 表名 add primary key(列名);
-
-
删除主键
alter table 表名 drop primary key;
-
主键自增长
mysql> create table if not exists score_info( -> id int primary key auto_increment, -> s_id varchar(50) not null, -> score float not null, -> score_name varchar(50) not null -> )engine=innodb default charset=utf8;
-
创建外键
一张表引入了另一张表主键
mysql> create table if not exists score_info( -> id int primary key auto_increment, -> s_id varchar(50) not null, -> score float not null, -> score_name varchar(50) not null, -> foreign key(s_id) references stu_info(s_id) -> )engine=innodb default charset=utf8;
构建主外键关系表它们的数据类型是必须相同的,名称可以不同
主外键的表进行删除的时候,应该先删除外键表的数据,再删除主键表的数据
MySql数据库的中文乱码处理
-
直接更改客户端的编码(cmd的编码)
$ chcp 65001
chcp:
change current page
;它只支持高版本的控制台(win8开始以上的控制)
-
更改服务端编码
set character_set_client=gbk; set character_set_connection=gbk; set character_set_results=gbk;
上面的三条语句分别设置客户端,设置连接以及设置结果集
这三条语句只针对当前的设置,如果断开连接,则需要重设置一次
上面的三行代码可以简化成一句话
set names gbk;
后面的编码格式根据具体的需要来完成
DML语句的学习
-
count()是用于计数的
-
as关键字可以用于别名转换,但as当做别名转换的时候,可以省略
-
模糊查询使用
like
关键字,通配符使用%
表示 -
当同一个条件要进行多次or查询时,可以使用in关键字进行替代
SELECT * FROM 学生信息 WHERE 学号 ='2005050209' OR 学号='2005050102'; SELECT * FROM 学生信息 WHERE 学号 IN ('2005050209' ,'2005050102');
-
多表联查指的是在查询的过程当中from后面跟多个表,然后把这些表建立起where关联以后一起查询,然后显示要显示的列
第一种方法:下面的方法是多表联查
SELECT 学生信息.*,班级信息.班级名 FROM 学生信息,班级信息 WHERE 学生信息.所属班级=班级信息.班级编号
第二种方法:下面的方法是内联查询
SELECT 学生信息.*,班级信息.班级名 FROM 学生信息 INNER JOIN 班级信息 ON 学生信息.所属班级=班级信息.班级编号
第三种方法:追加列的方式查询
SELECT *,(SELECT 班级名 FROM 班级信息 WHERE 班级编号=学生信息.所属班级) '班级名称' FROM 学生信息
-
别名的使用
SELECT a.*,b.`班级名`,c.`姓名` as '辅导员信息',d.`系别名称` FROM 学生信息 a INNER JOIN 班级信息 b ON a.`所属班级`=b.`班级编号` INNER JOIN 辅导员信息 c ON c.`辅导员编号`=b.`辅导员` INNER JOIN 系别信息 d on d.`系别编号`=b.`所属系别`
-
聚合函数
SELECT 所属班级,COUNT(*) '人数' FROM 学生信息 GROUP BY 所属班级
将查询结果与班级信息相连
SELECT * FROM (SELECT 所属班级,COUNT(*) '人数' FROM 学生信息 GROUP BY 所属班级) AS a INNER JOIN 班级信息 b on a.所属班级=b.班级编号
第二种写法
SELECT *,(SELECT COUNT(*) FROM 学生信息 b WHERE a.班级编号=b.所属班级) AS '实际人数' FROM 班级信息 a
这一种情况下,不用使用聚合分组group by了
😈 根据上面的两条SQL语句,我们都可以得到结果,但是我们发现查询出来的结果有一点不一样
inner join取的是两个表的交集部分,这个时候
left join是以左边的表为主,进行数据显示
right join是以右边的表为主,进行数据显示
-
avg平均函数的使用
SELECT 学生编号,AVG(分数) '平均分' FROM 成绩信息 GROUP BY 学生编号
-
max取最大值函数
SELECT * FROM (SELECT 课程编号,学生编号,MAX(分数) '最高分' FROM 成绩信息 GROUP BY 课程编号) a INNER JOIN 学生信息 b ON a.`学生编号`=b.`学号`
-
子查询
在原有的查询结果里面,再进行一次查询
SELECT a.等级,COUNT(*) '人数' FROM
(SELECT *,
CASE
WHEN 分数>89 THEN '优秀'
WHEN 分数>79 THEN '良好'
WHEN 分数>69 THEN '中等'
WHEN 分数>59 THEN '及格'
ELSE '不级格'
END '等级'
FROM 成绩信息) a
GROUP BY a.等级
上面的case when then else end 是一组条件选择的语句
-
字符串截取
-
substr(str from pos for len)
pos是从1开始的,len是长度
len可以省略掉,如新省略以后就一直截取到最后
-
substr(str,pos,len)
pos从1开始,中间参数用逗号隔开
在字符串截取上面,还有一个方法是
substring
,这个方法 的参数与substr
保持一致- left(str,len)方法,从左截取
- right(str,len)方法,多右截取
-
-
判断空值我们使用is null进行
SELECT *, CASE WHEN d.省份学生人数 IS NULL THEN 0 ELSE d.省份学生人数 END '学生老乡个数' FROM (SELECT c.*,b.省份学生人数 FROM 教师信息 c LEFT JOIN (SELECT a.省份,COUNT(*) '省份学生人数' FROM (SELECT *,LEFT(家庭住址,2) '省份' FROM 学生信息) a GROUP BY a.省份) b ON LEFT(c.籍贯,2)=b.省份) d