MySQL学习之一
Posted gujun1998
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL学习之一相关的知识,希望对你有一定的参考价值。
启动、停止服务
1.启动命令:
net start mysql
2.停止服务命令:
net stop mysql
登录、退出
1.登录命令:
mysql -uroot -proot //-u后面是用户的登录的用户名,-p是用户登录密码,方式一,使用此方式在mysql5.6以后会出现警告,但是并没有什么影响,还是能成功进入数据库进行操作。
mysql -uroot -p //按下回车键后输入密码,此时的密码是密文显示的,更安全,方式二
2.退出命令:
直接关闭cmd窗口 //方式一
exit //方式二
quit //方式三
3.远程连接mysql命令
mysql -h127.0.0.1 -uroot -proot //-h后面输入想要远程连接的ip,-p后面输入的是想要连接的ip的mysql的密码。方式一
mysql --host=127.0.0.1 --user=root --password=root //方式二,当然也可以选择按下回车键再输入密码。127.0.0.1表示想要远程连接的目标的ip地址,password后面写的是想要远程连接的目标的mysql密码。
注释
方式一:/使用-- 来添加注释
select * from student; -- 这是一个注释示例
//在sql语句后使用--表示注释,--后必须要空一格,否则会报错,然后写自己想要添加的注释内容。
方式二:使用#来添加注释
select * from student # 这是一个注释示例2
//使用#来添加注释,在sql语句后使用#,#后面是自己想要添加的注释内容,#后面有无空格都可以。
方式三:使用/* */表示多行注释
select * from student
/*
这是
多行
注释。
*/
;
向数据库中插入数据时出现中文乱码的解决方案
1.找到my.ini文件
找到安装目录的根目录下的my.ini文件,如果此目录下没有,可以进入ProgramData文件夹,注意此文件夹是隐藏文件夹,一般情况下my.ini文件就在这两个文件夹的根目录下,如果没有,自己在这两个文件夹中寻找,找不到的话,可以自己去创建。
2.进入my.ini配置文件对其进行修改
修改下方三个地方:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8
以上3个section都要加default-character-set=utf8,平时我们可能只加了mysqld一项。如果没有完全修改可以依旧会出现中文乱码问题。
然后重启mysql,执行SQL语句。
SHOW VARIABLES LIKE 'character%';
确保所有的Value项都是utf8即可,再向数据库中插入数据就不会出现中文乱码问题了。
如果再出现中文乱码,可以直接进入命令行界面,直接写sql语句,查看插入中文数据是否会出现乱码,如果再次出现乱码可能是数据库创建时没有使用utf8的编码字符集,修改数据的编码字符集为utf8一般就可以了。
对数据库操作
创建数据库
创建数据库命令:
create database test1; //此时创建的数据库名为test1
/*
此时可能会出现错误,即数据库本来存在,可以在创建数据库之前进行判断数据库是否存在,使用下面的语句可以避免出现上述错误。
*/
create database if not exists test1;
查询数据库中存在的数据库命令:
show databases; //使用此命令会把所有的数据库查询结果显示出来。
创建数据库时指定数据库的编码字符集命令:
create database test2 character set utf8; //此时创建的数据库名为test2
create database if not exists test2 character set utf8;//在创建数据库之前判断数据库是否存在。
show create database test2 ; //查看数据库test2的编码字符集
修改数据库
修改数据库的字符集命令:
alter database test2 character set gbk; //修改数据库test2的字符集为gbk
删除数据库
删除数据库命令:
drop database test2; //删除数据库名为test2的数据库
drop database if exists test2; //在删除数据库之前判断数据库是否存在,存在则删除,不存在该语句也不会报错。
使用数据库
修改正在使用的数据库的命令:
use test1 ; //修改当前使用的数据库为test1
查询当前正在使用的数据库名称的命令:
select database(); //使用此命令查询显示出当前正在使用的数据库名称。
数据库表的操作
数据库表的查询操作
查询所有表的命令:
show tables; //注意使用此命令前需要先使用数据库的命令 ---> use 数据库名称,确保当前有数据库正在使用。
查询表结构命令:
desc student; //student 为表名
创建表命令:
create table 表名(
列名1 数据类型1,
列名2 数据类型2,
列名3 数据类型3,
......
列名n 数据类型n
);
//注意,前面的(不是最后一个)列名和数据类型后需要写一个逗号,最后一个列名和数据类型写完以后,不能再加逗号,加了的话会出错。
例如:
create table student(
-> id int,
-> name varchar(32),
-> age int,
-> birthday date,
-> insert_time timestamp
-> );
删除表命令:
drop table 表名;
例如:
drop table student; //这样可以会出现错误,即表不存在,可以在删除之前进行判断。
示例二:
drop table if exists student;
复制表命令:
create table 表名 like 被复制的表名;
示例:
create table stu like student;
修改表命令:
修改表名命令:
alter table student rename to stu; //将表student 重命名为stu
修改表的字符集命令:
alter table stu character set utf8; //将表stu的字符集修改为utf8
添加一列命令:
alter table 要修改表名 add 列名 数据类型;
alter table stu add salary double;
修改列名称、类型命令:
同时修改列名和数据类型:
alter table 要修改表名 change 被修改列名 新的列名 新的数据类型;
示例:
alter table stu change salary sex varchar(10);
只修改数据类型:
alter table 要修改的表名 modify 被修改列名 新的数据类型;
示例:
alter table stu modify sex varchar(20);
删除列命令:
alter table 表名 drop 要删除的列名;
示例:
alter table stu drop sex;
数据库表中的数据的操作
添加数据命令:
insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
示例一:
insert into stu (id,name,age,birthday) values(1,'小明',21,19991011);
示例二:
insert into stu values(2,'小红',20,'1999-10-11',null);
/*
注意,
1.此时的日期不能写成1999-10-11,会出错,日期之间不能加-。如果想要添加-可以在日期之前使用单或双引号(''或"")包裹。
2.列名和数据值应该一一对应。
3.如果表名之后不定义列名,则默认给所有的列赋值。如果不想给某个数据赋值,可以使用null代替,但是如果缺少数据值(列名和值不对应),则会报错。
4.除了数字类型,其他类型的数据值需要使用单或双引号(''或"")包裹。
5.sql语句中除了中文的数据值之外,其他的都要使用英文格式下的符号。
*/
修改表中数据的命令:
update 表名 set 列名1 = 值1 ,列名2 = 值2; ... where条件
示例:
update stu set name = '小王' ,age = 23 where id = 1;
//注意,如果不加任何条件,会把表中所有的数据全部修改。
删除表中的数据命令:
删除表中指定数据的命令:
delete from 表名 where 条件
示例:
delete from stu where id = 3; //删除stu表中id为3的数据
删除表中所有数据的命令:
delete from 表名; //方式一
TRUNCATE table 表名; //方式二
方式一示例:
delete from stu; //删除stu表中的所有数据,不推荐使用,效率较低。
方式二示例:
TRUNCATE table stu; //删除stu表,然后再创建一个一模一样的空表。
基础查询
查询表中所有数据命令:
select * from 表名;
示例:
select * from stu; //查询stu表中的所有数据。
查询部分数据命令:
select 列名1,列名2,... from 表名;
示例:
select name,age,address from student; //在student表中查询姓名、年龄、地址
去除重复数据命令:
select distinct 列名1,列名2 ... from 表名;
示例:
select distinct address from student;
练习:计算数学和英语的成绩之和,显示出姓名、数学成绩、英语成绩和数学英语成绩之和
select name, math,english ,math + english from student; //当出现某个数据为null时,数据之和也会为null的情况,是不合理的。
select name, math,english ,ifnull (math,0) + ifnull (english,0) from student; //如果数学成绩或者英语成绩为null的话将其数据改为0进行计算。
给数据取别名,例如,将math + english 取别名为 总分
select name, math,english ,ifnull (math,0) + ifnull (english,0) as 总分 from student; //方式一
select name 姓名, math 数学,english 英语,ifnull (math,0) + ifnull (english,0) 总分 from student; //方式二,不使用as,直接加一个空格,再写别名也可以。
条件查询
示例一:查询student表中年龄大于20岁的数据
select * from student where age > 20; //注意:此时查询的数据不包括年龄等于20的数据。
示例二:查询student表中年龄等于20岁的数据
select * from student where age = 20;
示例三:查询student表中年龄不等于20岁的数据
select * from student where age != 20; //方式一
select * from student where age <> 20; //方式二
示例三:查询student表中年龄大于20岁,小于25岁的数据
select * from student where age > 20 and age < 25 ; //方式一
select * from student where age between 20 and 25 ; //方式二,此方式包括20岁和25岁的数据。
select * from student where age > 20 && age < 25 ; //方式三 ,不推荐使用
示例四:查询student表中年龄为20岁、22岁的数据
select * from student where age = 20 or age = 22 ; //方式一
select * from student where age in (20 , 22) ; //方式二
示例五:查询student表中英语成绩为null的数据
select * from student where english is null; //注意,查询数据为null时不能使用等号。需要使用is。
示例六:查询student表中英语成绩不为null的数据
select * from student where english is not null;
模糊查询
示例一:查询student表中姓为 小 的数据
select * from student where name like '小%' ; // % 号表示任意字符,下划线(_)表示单个字符。
示例二:查询student表中姓名中第二个字为 三 的数据
select * from student where name like '_三%' ;
示例三:查询student表中姓名为两个字的数据
select * from student where name like '__' ; //在引号内写上两个英文格式下的_即可。
示例一:查询student表中姓名中包含 小 的数据
select * from student where name like '%小%' ;
排序查询
select * from 表名 order by 需要排序的列名1 排序方式,需要排序的列名2 排序方式2 ... ;
注意,默认情况下,即不写排序方式或者写成 asc ,按照升序进行排序,使用desc来表示降序的排序方式。当有多个字段进行排序时,只有前面需要排序的字段的的数据相同时,才会去判断后面的数据。
示例一:将student表中的数据按照math的成绩进行升序排序
select * from student order by math ;
示例二:将student表中的数据按照math的成绩进行降序排序
select * from student order by math desc ;
示例三:将student表中的数据按照math的成绩进行升序排序,如果数学成绩相同,则按照英语成绩进行降序排序。
select * from student order by math , english desc ;
示例四:将student表中的数据按照math的成绩进行降序排序,如果数学成绩相同,则按照英语成绩进行降序排序。
select * from student order by math desc , english desc ;
聚合函数:将一列数据作为一个整体,进行纵向的计算
- count:计算数量
- max:计算最大值
- min: 计算最小值
- sum:计算和
- avg:计算平均值。
注意:聚合函数的计算排除了字段为null的值。
示例一:计算student表中name字段的总数量。
select count(name) 学生总数 from student;
示例二:计算student表中english字段的总数量,解决count计算数量时排除字段为null的问题。
select count(ifnull (english,0)) from student;
示例三:计算student表中math字段的最大值。
select max(math) from student;
示例四:计算student表中math字段的最小值。
select min(math) from student;
示例五:计算student表中math字段的和。
select sum(math) from student;
示例六:计算student表中english字段的和(english字段中存在数据值为null的数据)。
select sum(english) from student; //默认会排除数据值为null的数据值
示例七:计算student表中math字段的平均值。
select avg(math) from student;
分组查询
注意:
分组之后查询的数据只能是聚合函数或者分组字段,加上其他的字段没有任何意义。
示例一:按照性别分组,分别查询男、女同学的英语成绩的平均分。
select sex , avg(english) from student group by sex;
示例二:按照性别分组,分别查询男、女同学的英语成绩的平均分和人数。
select sex , avg(english),count(id) from student group by sex;
示例三:按照性别分组,分别查询男、女同学的英语成绩的平均分和人数,英语成绩低于60分的同学不参与分组。
select sex , avg(english),count(id) from student where english > 60 group by sex;
示例四:按照性别分组,分别查询男、女同学的英语成绩的平均分和人数,英语成绩低于60分的同学不参与分组,要求分组后的成员数量要大于2人。
select sex , avg(english),count(id) from student where english > 60 group by sex having count(id) > 2;
where 和 having 的区别?
where 在分组之前进行限定,如果不满足分组,则不参与分组,having 在分组之后进行限定,如果不满足条件,数据不会显示出来。
where 后不可以进行聚合函数的判断,having 后可以进行聚合函数的判断。
分页查询
select from 表名 limit 开始的索引,每页要显示的数量
开始的索引计算方式: 开始的索引 = (当前的页码 -1 ) * 每页要显示的数量
示例一:
select * from student limit 0,5; -- 第一页 //当前为第一页,每页要显示5条数据。
limit是mysql的分页显示数据的语法。其他的数据库则不是limit
约束
概念:对数据库表中的数据进行限定,保证数据的正确性、完整性、有效性。
分类:
主键约束 --> primary key
非空约束 --> not null
唯一性约束 --> unique
外键约束 --> foreign key
主键约束并使其自动增长
注意:
1.包含主键约束的字段非空且唯一。
2.一张表中只能有一个字段作为主键。
3.主键是表中记录的唯一性标识。
示例一:在创建表时为字段id添加主键约束,创建表的SQL语句如下:
create table stu(
id int primary key ,
name varchar(20)
);
示例二:在创建表时为字段id添加主键约束并使其自动增长,创建表的SQL语句如下:
create table stu(
id int primary key auto_increment ,
name varchar(20)
);
示例三:删除字段的主键约束
alter table stu drop primary key ;
示例四:删除字段的自动增长,并不能删除主键约束:
alter table stu modify id int; //方式一
alter table stu change id id int; //方式二
示例五:创建表完成之后再为字段添加主键约束
alter table stu modify id int primary key; //方式一
alter table stu change id id int primary key; //方式二
示例六:创建表完成之后再为字段添加自动增长
alter table stu modify id int auto_increment; //方式一
alter table stu change id id int auto_increment; //方式二
非空约束
示例一:在创建表时为字段name添加非空约束,创建表的SQL语句如下:
create table stu(
id int,
name varchar(20) not null
);
示例二:删除字段name的非空约束
alter table stu modify name varchar(20); //方式一
alter table stu change name name varchar(20); //方式二
示例三:创建表完成之后再为字段name添加非空约束
alter table stu modify name varchar(20) not null; //方式一
alter table stu change name name varchar(20) not null; //方式二
唯一性约束
注意:mysql中,在没有非空约束的字段下,唯一性约束的字段的数据中可以有多个null,不会报错。
示例一:在创建表时为字段name添加唯一性约束,创建表的SQL语句如下:
create table stu(
id int,
name varchar(20) not null,unique
);
示例二:删除字段name的唯一性约束
alter table stu drop index name ;
示例三:创建表完成之后再为字段name添加唯一性约束
alter table stu modify name varchar(20) unique ; //方式一
alter table stu change name name varchar(20) unique ; //方式二
外键约束
外键约束:让表与表之间产生关系,从而保证了数据的正确性。
create table 表名(
......
外键列名 外键列数据类型,
constraint 外键名称 foreign key (外键列名) references 需要关联的主表名(需要关联的主表的列名)
);
示例一:在创建表时添加外键约束,
create table employee(
id int primary key auto_increment ,
name varchar(20),
age int ,
dep_id int ,
constraint emp_dept_fk foreign key (dep_id) references department(id)
);
示例二:删除表的外键约束
alter table employee drop foreign key emp_dept_fk; //emp_dept_fk外外键名称。
示例三:创建表完成之后再添加外键约束
alter table employee add constraint emp_dept_fk foreign key (dep_id) references department(id);
示例四:添加外键,并设置级联更新
alter table employee add constraint emp_dept_fk foreign key (dep_id) references department(id) on update cascade;
示例五:添加外键,并设置级联更新,级联删除 ,一般不会设置级联删除。
alter table employee add constraint emp_dept_fk foreign key (dep_id) references department(id) on update cascade on delete cascade;
以上是关于MySQL学习之一的主要内容,如果未能解决你的问题,请参考以下文章