精心整理 MySQL 基本使用 (数据库的操作、数据类型、MySQL 的常用命令)

用户头像
ShenDu_Linux
关注
发布于: 2020 年 11 月 27 日
精心整理MySQL基本使用(数据库的操作、数据类型、MySQL的常用命令)

前言:瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统 由于其体积小、速度快、总体拥有成本低。MySQL软件采用了双授权政策(本词条"授权政策"),它分为社区版和商业版LDAP。

一、MySQL产品下载



版本细节:linux(32 64) win(32 64)

请到如下网站:https://www.mysql.com/



官方文档上有关MySQL安装文件类型说明:



Linux supports anumber of different solutions for installing MySQL. The recommended method isto use one of the distributions from Oracle. If you choose this method, thereare three options available:产品下载

(1)Installingfrom a generic binary package in .tar.gz format. See Section 2.2,”Installing MySQL from Generic Binaries on Unix/Linux” for moreinformation.



(2)Extractingand compiling MySQL from a source distribution. For detailed instructions,see Section 2.9, “InstallingMySQL from Source”.



(3)Installingusing a pre-compiled RPM package. For more information on using the RPMsolution, see Section 2.5.1,”Installing MySQL from RPM Packages on Linux”.



(1)DML

DML:数据操作语言 增(INSERT)、删(DELETE)、查(SELECT)、改(UPDATE)。



(2)DLL

DDL:数据定义语言 创建(CREATE)、删除(DROP)、修改(ALTER)。



(3)DCL

DCL:数据控制语言



GRANT



REVOKE



是用来设置或更改数据库用户或角色权限的语句



数据库的操作

连接MYSQL服务器:mysql -uroot -proot



mysql -uroot -p --default_character_set=gbk; (影响数据的输入和输出)



show variables like ‘character%’;

数据库的操作:创建,查看,修改,删除

*创建:



创建一个名称为mydb1的数据库。

create database mydb1;

创建一个使用utf-8字符集的mydb2数据库。

create database mydb2 character set utf8;

创建一个使用utf-8字符集,并带校对规则的mydb3数据库。

create database mydb3 character set utf8 collate utf8_general_ci;



*查看:



显示所有数据库

show databases;

显示创建数据库的语句信息

show create database mydb2;



*修改:



修改mydb1的字符集为gbk(不能修改数据库名)

alter database mydb1 character set utf8;



*删除:



删除数据库mydb2

drop database mydb1;



表的操作

表的操作:创建,查看,修改,删除



*创建:



根据实体类Person创建表person

Person {

int id;

String name;

}

create table person(

id int,

name varchar(20)

);



数据类型

mysql中的数据类型:



  • bit 1位 但可以指定位数,如:bit<3>。

  • int 2字节 可以指定最大位数,如:int<4> 最大为4位的整数。

  • float 2个字节 可以指定最大的位数和最大的小数位数,如:float<5,2> 最大为一个5位的数,小数位最多2位。

  • double 4个字节 可以指定最大的位数和最大的小数位数,如:float<6,4> 最大为一个6位的数,小数位最多4位。

  • char 必须指定字符数,如char(5) 为不可变字符 即使存储的内容为’ab’,也是用5个字符的空间存储这个数据。

  • varchar 必须指定字符数,如varchar(5)为可变字符 如果存储的内容为’ab’,占用2个字符的空间;如果为’abc’,则占用3个字符的空间。

  • text: 大文本(大字符串)。

  • blob:二进制大数据 如图片,音频文件,视频文件。

  • date: 日期 如:’1921-01-02’

  • datetime: 日期时间 如:’1921-01-02 12:23:43’

  • timeStamp: 时间戳,自动赋值为当前日期时间



表的基本操作

创建一个员工表



create table employee(id int,name varchar(20),
sex bit,birthday date,salary double,entry_date date,resume text);



*查看

查看所有的表:



show tables;



查看指定表的创建语句

show create table employee;

mysql表 名称区分大小写

显示指定表的结构:

desc employee;



*删除

删除employee表



drop table employee;



*修改表



增加一个字段:alter table worker add column height double;

修改一个字段:alter table worker modify column height float;

删除一个字段:alter table worker drop column height;

更改表名:rename table employee to worker;

修改表的字符集:alter table worker character set gbk;



表数据的CRUD

*C(create增加数据) Insert语句



新建Employee表并表中添加一些记录
1



create table employee(

id int,

name varchar(20),

sex bit,

birthday date,

salary double,

entry_date date,

resume text

);

create table employee(id int, name varchar(20),
sex bit,birthday date,salary double,entry_date date,resume text);
1234567891011121314151617181920



插入数据



insert into employee(id,name,sex,birthday,salary,entry_date,resume) values(1,'张三',1,'1983-09-21',15000,'2012-06-24','一个大牛');

insert into employee(id,name,sex,birthday,salary,entry_date,resume) values(2,'李四',1,'1984-09-21',10000,'2012-07-24','一个中牛');

insert into employee(id,name,sex,birthday,salary,entry_date,resume) values(3,'王五',0,'1985-09-21',7000,'2012-08-24','一个小牛');

delete from employee where id=1

create table employee( id int,name varchar(20),sex bit,birthday date,salary double,entry_date date,resume text);
123456789



修改数据

*U(update更新数据) Update语句



将所有员工薪水都增加500元。

update employee set salary=salary+500;

将王五的员工薪水修改为10000元,resume改为也是一个中牛

update employee set salary=10000,resume='也是一个中牛' where name='王五';
1234567



删除数据

*D(drop删除数据) Delete语句



删除表中姓名为王五的记录。

delete from employee where name='王五';

删除表中所有记录。

delete from employee; --可以有条件,但删除所有记录差了一点

使用truncate删除表中记录。

truncate employee;--无条件 效率高
1234567891011



*R(Retrieve查找数据) Select语句



准备环境:
1



create table student(

id int,

name varchar(20),

chinese int,

english int,

math int

);
12345678910111213



insert into student(id,name,chinese,english,math) values(1,'何东',80,85,90);

insert into student(id,name,chinese,english,math) values(2,'权筝',90,95,95);

insert into student(id,name,chinese,english,math) values(3,'何南',80,96,96);

insert into student(id,name,chinese,english,math) values(4,'叶坦',81,97,85);

insert into student(id,name,chinese,english,math) values(5,'何西',85,84,90);

insert into student(id,name,chinese,english,math) values(6,'丁香',92,85,87);

insert into student(id,name,chinese,english,math) values(7,'何北',75,81,80);

insert into student(id,name,chinese,english,math) values(8,'唐娇',77,80,79);

insert into student(id,name,chinese,english,math) values(9,'任知了',95,85,85);

insert into student(id,name,chinese,english,math) values(10,'王越',94,85,84);
12345678910111213141516171819



查询表中所有学生的信息。

select * from student;

查询表中所有学生的姓名和对应的英语成绩。

select name,english from student;
1234567



内置函数练习

重复

过滤表中重复数据。



select english from student;

select DISTINCT english from student;

select DISTINCT english,name from student;

select english+chinese+math from student;

select english+chinese+math as 总分 from student;

select name,english+chinese+math as 总分 from student;
1234567891011



在所有学生英语分数上加10分特长分。

select name,english+10 from student;

统计每个学生的总分。

select english+chinese+math from student;
1234567



别名

使用别名表示学生分数



select name,english+chinese+math as 总分 from student;

select name,english+chinese+math 总分 from student;

查询姓名为何东的学生成绩

select * from student where name='何东';

查询英语成绩大于90分的同学

select * from student where english>90;

查询总分大于250分的所有同学

select * from student where english+chinese+math>250;
123456789101112131415



范围匹配

查询英语分数在 85-95之间的同学。



select * from student where english>=85 and english<=95;

select * from student where english between 85 and 95;
123



or

查询数学分数为84,90,91的同学。



select * from student where math=84 or math=90 or math=91;
1



in

select * from student where math in(84,90,91);



查询所有姓何的学生成绩。
1



模糊查询

select * from student where name like ‘何%’;

and

查询数学分>85,语文分>90的同学。



select * from student where math>85 and chinese>90;
1



oder by [asc/desc]

对数学成绩排序后输出。



select * from student order by math;

对总分排序后输出,然后再按从高到低的顺序输出

select * from student order by math+chinese+english desc;

对姓何的学生成绩排序输出

select * from student where name like '何%' order by math+chinese+english desc;

select name, math+chinese+english from student where name like '何%' order by math+chinese+english desc;
1234567891011



count

统计一个班级共有多少学生?



select count(*) from student;

统计数学成绩大于90的学生有多少个?

select count(*) from student where math>90;

统计总分大于250的人数有多少?

select count(*) from student where math+chinese+english>250;
123456789



sum

统计一个班级数学总成绩?



select sum(math) from student;

统计一个班级语文、英语、数学各科的总成绩

select sum(math), sum(chinese), sum(english) from student;

统计一个班级语文、英语、数学的成绩总和

select sum(math+chinese+english)from student;

select sum(math)+sum(chinese)+sum(english) from student;
1234567891011



avg

求一个班级数学平均分?



select avg(math) from student;

求一个班级总分平均分

select avg(math+chinese+english)from student;

select avg(math)+avg(chinese)+avg(english) from student;
1234567



maxAndmin

求班级最高分和最低分



select max(math+chinese+english),min(math+chinese+english) from student;
1



group by

综合性练习:为学生表,增加一个班级列,然后训练分组查询



查出各个班的总分,最高分

准备环境

给表添加一个字段:alter table student add column class_id int;

更新表:

update student set class_id=1 where id<=5;

update student set class_id=2 where id>5;

select sum(math+chinese+english),max(math+chinese+english) from student group by class_id;

查询出班级总分大于1300分的班级ID

select class_id from student group by class_id having sum(math+chinese+english)>1300;

select class_id from student where sum(math+chinese+english)>1300 group by class_id ;

note:where和group区别: 在wehre子句中不能使用分组函数
123456789101112131415161718192021



时间和日期

mysql> select year (now()), month(now()), day(now()) , date(now());



+--------------+--------------+------------+-------------+

| year (now()) | month(now()) | day(now()) | date(now()) |

+--------------+--------------+------------+-------------+

| 2014 | 9 | 7 | 2014-09-07 |

+--------------+--------------+------------+-------------+

select date_add(now(), INTERVAL 2 year) from dual;//增加两年

select charset('name') employee;

select date_add(now(), INTERVAL -1 day) 昨天, now() 今天, date_add(now(), INTERVAL +1 day) 明天;
123456789101112131415



字符串相关函数



select concat( charset(‘name’), ‘aaaa’) 自定义 from dual;

约束

表的约束



*定义主键约束 primary key:不允许为空,不允许重复



*定义主键自动增长 auto_increment



*定义唯一约束 unique



*定义非空约束 not null



*定义外键约束 constraint ordersid_FK foreign key(ordersid) references orders(id)



*删除主键:alter table tablename drop primary key ;



create table myclass



(



id INT(11) primary key auto_increment,

name varchar(20) unique
123



);



create table student(



id INT(11) primary key auto_increment,

name varchar(20) unique,

passwd varchar(15) not null,

classid INT(11), #注意这个地方不要少逗号

constraint stu_classid_FK foreign key(classid) references myclass(id)
123456789



);



+-------+-------+------+------------------------+
1



连接查询



使用SQL99标准的连接查询(JOIN…ON…)



内连接



只返回满足连接条件的数据(两边都有的才显示)。
1



select e., d.



from emp e



inner join dept d



on e.deptno=d.deptno



-- 也可以省略inner关键字。
1



select e., d.



from emp e inner join dept d



on e.deptno=d.deptno

左外连接

左边有值才显示。

select e.empno, e.ename, e.sal, d.dname



from emp e



left outer join dept d



on e.deptno=d.deptno



-- 也可以省略outer关键字
1



右外连接

右边边有值才显示。



select e.*, d.*

from emp e

right outer join dept d

on e.deptno=d.deptno

-- 也可以省略outer关键字
123456789



满外联接

mysql 不支持full所以需要left right union



任一边有值就会显示。

//select e.*, d.*

from emp e

full outer join dept d

on e.deptno=d.deptno

-- 也可以省略outer关键字
1234567891011



mysql> select e.,d. from emp e left join dept d on (e.deptno=d.deptno) union select e.,d. from emp e right join dept d on (e.deptno=d.deptno)



交叉连接

叉集,就是笛卡尔积



select e.*, d.*

from emp e

cross join dept d

-- 没有连接条件
1234567



====================================================



eg:查询员工信息,员工号,姓名,月薪,部门名称



select e.empno, e.ename, e.sal, d.dname



from emp e, dept d



where e.deptno=d.deptno



select e.empno, e.ename, e.sal, d.dname



from emp e inner join dept d – 逗号join



on e.deptno=d.deptno – where on

//显示所有部门信息



//显示各个部门的部门人数



select d.deptno 部门号, d.dname 部门名称,count(e.empno) 人数



from emp e, dept d



where e.deptno(+)=d.deptno



group by d.deptno, d.dname



select d.deptno 部门号, d.dname 部门名称,count(e.empno) 人数



from emp e right outer join dept d



on e.deptno=d.deptno



group by d.deptno, d.dname

自连接

– 查询员工信息 ,老板信息



显示: 的老板是

select e.ename , b.ename



from emp e, emp b



where e.mgr=b.empno

select concat ( concat(e.ename, ‘的老板是’), b.ename)



from emp e, emp b



where e.mgr=b.empno

select e.ename, ifnull(b.ename,’他自己’)



from emp e left outer join emp b



on e.mgr=b.empno

select concat ( concat(e.ename, ‘的老板是’), ifnull(b.ename,’他自己’))



from emp e left outer join emp b



on e.mgr=b.empno

+————————————————————————+



| concat ( concat(e.ename, ‘的老板是’), ifnull(b.ename,’他自己’)) |



+————————————————————————+



| SMITH的老板是FORD |



| ALLEN的老板是BLAKE |



| WARD的老板是BLAKE |



| JONES的老板是KING |



| MARTIN的老板是BLAKE |



| BLAKE的老板是KING |



| CLARK的老板是KING |



| SCOTT的老板是JONES |



| KING的老板是他自己 |



| TURNER的老板是BLAKE |



| ADAMS的老板是SCOTT |



| JAMES的老板是BLAKE |



| FORD的老板是JONES |



| MILLER的老板是CLARK |



+————————————————————————+



aaaaddd ccccbbbbbb



aaaaddd ccccbbbbbb



aaaaddd ccccbbbbbb



aaaaddd ccccbbbbbb



方法:按住alt键以后,鼠标拖动,选中一个矩形区域



mysql的常用命令

mysql安装完之后,登陆后发现只有两个数据库:mysql> show databases;



+——————–+



| Database |



+——————–+



| information_schema |



| test |



+——————–+



,mysql> use mysql



ERROR 1044 (42000): Access denied for user ‘‘@’localhost’ to database ‘mysql’



访问被拒绝,原因就是在删除数据库时(rpm -e mysql*)没有删除干净,需要把/var/lib/mysql的目录全部删除干净,然后再重新安装即可。



顺便记一下一些常用的命令:



连接MYSQL

格式: mysql -h主机地址 -u用户名 -p用户密码



1、连接到本机上的MYSQL。



mysql -u root -p

回车后提示你输密码,注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码。



如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql>



2、连接到远程主机上的MYSQL。假设远程主机的IP为:192.168.2.2,用户名为root,密码为123456。则键入以下命令:



mysql -h192.168.2.2 -uroot -p123456

3、退出MYSQL命令:



exit (回车)

修改密码

格式:mysqladmin -u用户名 -p旧密码 password 新密码



1、给root加个密码123456。键入以下命令:



mysqladmin -u root -password 123456

2、再将root的密码改为56789。



mysqladmin -u root -p123456 password 56789

增加新用户

格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码”



1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用root用户连入MYSQL,然后键入以下命令:



mysql>grant select,insert,update,delete on . to test1@”%” Identified by “abc”;



mysql>flush privileges; 使之生效



2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。



mysql>grant select,insert,update,delete on mydb.* to test2@localhost identified by “abc”;



mysql>flush privileges; 使之生效



如果你不想test2有密码,可以再打一个命令将密码消掉。



mysql>grant select,insert,update,delete on mydb.* to test2@localhost identified by “”;



mysql>flush privileges; 使之生效



操作技巧

1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。



2、你可以使用光标上下键调出以前的命令。



查询、创建、删除、更新命令



1、显示当前数据库服务器中的数据库列表:



mysql>show databases;



注意:mysql库里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。



2、显示数据库中的数据表:



mysql>use 库名;



mysql>show tables;



3、显示数据表的结构:



mysql>describe 表名;



4、建立数据库:



mysql>create database 库名;



5、建立数据表:



mysql>use 库名;



mysql>create table 表名 (字段名 varchar(20), 字段名 char(1));



6、删除数据库:



mysql>drop database 库名;



7、删除数据表:



mysql>drop table 表名;



8、将表中记录清空:



mysql>delete from 表名;



9、显示表中的记录:



mysql>select * from 表名;



10、往表中插入记录:



mysql>insert into 表名 values (“123”,”b”);



11、更新表中数据:



mysql>update 表名 set 字段名1=’a’,字段名2=’b’ where 字段名3=’c’;



12、用文本方式将数据装入数据表中:



mysql>load data local infile “/root/mysql.txt” into table 表名;



13、导入.sql文件命令:



mysql>use 数据库名;



mysql>source /root/mysql.sql;



14、命令行修改root密码:



mysql>update mysql.user set password=PASSWORD(‘新密码’) where user=’root’;



mysql>flush privileges;



15、显示use的数据库名:



mysql>select database();



16、显示当前的user:



mysql>select user();



备份数据库

1.导出整个数据库,导出文件默认是存在当前操作目录下



mysqldump -u 用户名 -p 数据库名 > 导出的文件名

mysqldump -u user_name -p123456 database_name > outfile_name.sql

2.导出一个表



mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名

mysqldump -u user_name -p database_name table_name > outfile_name.sql

3.导出一个数据库结构



mysqldump -u user_name -p -d –add-drop-table database_name > outfile_name.sql

-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table



4.带语言参数导出



mysqldump -uroot -p –default-character-set=latin1 –set-charset=gbk –skip-opt database_name > outfile_name.sql

connect mysql error

查看不到mysql数据库的解决办法:



1.去/var/lib/mysql目录下去查看,发现mysql以及mysql.sock目录都在,还好还好,应该还有希望恢复;



2.停掉mysqld服务——“service mysqld stop”



3.查看mysqld进程是否还在跑——“ps -aux | grep mysqld”,如果还有在跑得进程,可以直接杀之”killall -TERM mysqld”



4.安全模式启动mysql;”mysqld_safe –user=mysql –skip-grant-tables –skip-networking &”



5.另起终端,输入”mysql -u root -p”,进入mysql数据库



6.show databases;看到mysql库又出现了



7.更改root用户密码:use mysql;update user set password=PASSWORD(”new-passwd”)where user=’root’;



8.FLUSH PRIVILEGES;







发布于: 2020 年 11 月 27 日阅读数: 31
用户头像

ShenDu_Linux

关注

还未添加个人签名 2020.11.26 加入

还未添加个人简介

评论

发布
暂无评论
精心整理MySQL基本使用(数据库的操作、数据类型、MySQL的常用命令)