请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册
  • 便民服务
  • 关注我们
  • 社区新手
ySQL数据库服务端:用来存放数据的仓库
MySQL数据库客户端:操作数据库的工具


MySQL服务(mysqld)的操作:
service mysqld start
service mysqld status
service mysqld stop
service mysqld restart


未设置MySQL数据库管理系统的root用户密码时,进入MySQL是不需要输入密码的
mysql -uroot  -p

在 mysql> 页面中执行的是SQL语句,不管你输入了多少行内容,当碰见了‘;’时SQL语句就才结束

退出MySQL工具的方式:quit、exit、Ctrl+C

首次设置MySQL数据库的root用户的密码(通过Linux命令,只能执行一遍):
mysqladmin -uroot password "123456"

后续要修改密码则要在MySQL数据库中进行修改


基本操作:
show databases;   ===>查看当前数据库操作系统中所有的数据库

当页面行首为  mysql>  就表示已经进入了MySQL操作界面了,每一条SQL语句都是以英文的‘;’结尾的

DDL (平常由开发或者DBA去操作的) ===> 数据库定义语言
create(创建)、alter table(修改表)、drop(删除)、show(查看)

DML(测试平常操作数据库)   ===> 数据库操作语言
insert into(增)、delete(删)、select(查)、update ... set...(改)

删除表的数据用的是delete
删除表或者表里某个字段用drop


基本操作:
show databases;   ===>展示 所有的数据库
show tables;   ===》展示 对应库中所有的表

use +库名;       ==》进入对应的库中进行操作
select database();   ==》查看当前正在操作哪个库
select version();  ==>  查看MySQL版本
select now();   ==>  查看当前服务器时间
select user;   ==> 查看当前操作的用户是谁

create database +新库名;   ==》创建一个新的库
create table 表名(字段名1 字段属性,字段名2 字段属性,字段名3 字段属性,字段名4 字段属性,......);   ==>创建表


desc +表名;    ==>查看表结构

-------------------------------------------------------------------

常见的数据类型:
(1)数值型:
int:整型  整数型,保存整数数字的,只能保存4个字节的数字,只能保存-2^31~2^31=±2147483647,当存储的数据超过该值时需要使用bigint
bigint:大整型,保存整数数字的,可以最多保存8个字节的数字
float:浮点数,可以保存小数,4个字节
double:浮点数,可以保存小数,8个字节

1byte=8bit=1个字节

(2)字符串型:一个utf-8汉字字符占3个字节,一个GBK汉字字符占2个字节
char:定长字符串,固定占用磁盘空间的255个字节,数据的查询性能更好些,但是不节省资源
varchar:可变长字符串,占0~2^16次方个字节,节省资源,但是查询性能稍差

(3)日期
date:保存日期,固定格式YYYY-MM-DD

------------------------------------------------------------

常见的约束:
primary key:主键约束(主键索引),特点:表中对应的主键字段里面的值是不能为空而且不能重复,一个表中只能又一个主键索引

auto_increment:自增长约束,只能在主键字段上使用,而且只能是数据类型为整型的去使用。例如不输入id时,就会在原来的最大值进行+1再新增

not null:非空约束,插入的数据永远最少会占用一个字节0的空间
(数据‘ ’和数据NULL区别:数据‘ ’表示占用一个字节为0的空字符,NULL完全不占用空间的)

default:默认值约束,当对应的字段没有插入值时,会默认填入一个默认值

-------------------------------------------------------------------

desc 表名;   ==>查看对应的表结构

修改表结构:alter table   (修改表,对表的结构进行修改)
1. alter table .... rename...  ===> 修改表名
2. alter table .... change...  ===> 修改表里字段属性,能改字段名,也能添加主键索引
3. alter talbe .... modify ... ===> 修改表里字段属性,不能改字段名,也能添加主键索引
4. alter table .... drop .... ====> 删除表里字段,也能删除主键索引(primary key)
5. alter table .... add ....  ====> 在表里添加字段,也能添加主键索引

alter table test rename test1;   ==>修改表 test表 重命名 为test1;
alter table test1 rename test;   ==>修改表 test1表 重命名 为test;

alter table test change id sid int(4);  ==>修改表 test表 改变 id字段 为sid字段,属性为int(4),并取消自增长约束
alter table test change sid sid int(4) auto_increment; ==>修改表 test表 改变 sid字段 为sid字段,属性为int(4),并增加自增长约束

alter table test add class int(4) first;  ==>修改表 test表 添加 class字段,属性为int(4),放在第一位(first);
alter table test add age int(4) after name;   修改表 test表 添加age字段,属性为int(4),放在name字段后面;

alter table test drop sex;   ==》修改表 test表 丢弃 sex字段;
alter table test drop age,drop class;  ==>修改表 test表 丢弃age字段,丢弃class字段

alter table test add(age int(4),class int(4));  ==>修改表 test表 添加 age字段和class字段

alter table test change age age int(4) after name;  ==>修改表 test表 改变 age字段 为 age字段属性为int(4) 放在name字段后面

alter table test modify class bigint(8) after sid;  ==> 修改表 test表 修改class字段的属性为bigint(8) 放在sid字段后面

change和modify的区别:
两者都是可以对表中字段的属性进行修改,但是使用change时是要写两次字段名,modify只要写一次。change可以对字段名进行重命名,modify就不行

删除主键:因为一张表中最多是只有一个主键,可以直接通过drop primary key的方式进行删除
mysql> alter table test drop primary key;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
直接删除主键是会报错的,因为这个表中的主键字段包含自增长约束,自增长约束是必须依赖主键约束,所以删除主键之前要先删除自增长约束
1,先删除自增长约束:alter table test modify sid int(4);
2,再删除主键约束: alter table test drop primary key;


添加主键
方式一:(通过修改表中字段属性的方式,change和modify都可以)
alter table test change sid sid int(4) primary key;
方式二:(通过添加主键(add primary key)到指定字段上)
alter table test add primary key(age);  ==》修改表 test表 添加 主键 到age字段上
alter table test add primary key(sid,name);   ==>修改表 test表 添加 主键 到sid和name字段上(复合主键,两个字段的值拼接在一起,不能为空且唯一)

-----------------------------------------------------------------

对表中数据进行操作----增删改查

增---insert into   往表中插入数据
方式一:要求表中的字段不多,对表结构要熟悉
1,插入的值的数量必须要跟字段的数量一致
2,值的格式必须要一一对应上字段要求的格式

insert into 表名 values (字段1的值,字段2的值,字段3的值,....),(字段1的值,字段2的值,字段3的值,....),(字段1的值,字段2的值,字段3的值,....);


方式二:对表中指定的字段插入值
1,值的顺序和数量要与声明的字段顺序和数量是一致
2,值的格式必须要对应上字段要求的格式
insert into 表名(字段2,字段3,字段7,字段1)  values  (字段2的值,字段3的值,字段7的值,字段1的值),(字段2的值,字段3的值,字段7的值,字段1的值);

字符串和日期类型的数据插入必须要加英文的引号,数值类型的数据加不加引号都可以

NULL 和 ' '==》NULL完全是空,完全不占系统的空间,''是占系统的一个字节0的空间
NULL 和 'NULL' ==》 没引号NULL为空,有引号的 'NULL' 表示字符串'NULL'



查---查询select
select * from 表名;  ===>查询 所有字段(*)的值 来源 xx表;
select sid,name,age from emp; ===>查询 sid,name,age字段的值 来源 emp表;


条件查询,接where条件子句
等于:
select * from emp where name='李四';  ==》查询 所有字段的值 来自于 emp表 当 name为李四 时;

不等于:!= 、<>
select*from emp where name != '李四';   ==》查询 所有字段的值 来自于 emp表 当 name不为李四 时;
select *from emp where name <> '李四';   ==》查询 所有字段的值 来自于 emp表 当 name不为李四 时;

*NULL值是不参与等于或者不等于、大小匹配的
*NULL值的匹配 is,is not

select * from test where class is null;   ==》查询 所有字段的值 来自于 test表 当 class字段值为空 时;
select * from test where class is not null;    ==》查询 所有字段的值 来自于 test表 当 class字段值不为为空 时;


多条件查询:
and条件:要求两边同时满足
select name from emp where dept2=101 and incoming=2000;  ==》查询dept2是101,incoming为2000的那个人员的姓名

or条件:以or为界,两边只要满足一边
select * from emp where dept2=103 or incoming=7500;   ==》查询 所有字段的值 来自于 emp表 当 dept2=103 或者 incoming=7500 时

select * from emp where dept2=101 and (incoming=4000 or incoming=3500);
select * from emp where dept2=101 and incoming=4000 or incoming=3500;

大于小于的匹配
select * from emp where age >=50 and age <=60;

between。。。and。。。。:介于,是包含着等于的闭区间
select * from emp where worktime_start between '1980-01-01' and '1989-12-31';

in与not in (与or条件有点类似)
select * from emp where incoming in (4000,2000,7500);
select * from emp where dept2 not in (101,102);

Linux的模糊匹配符:?(单个字符)  *(0个或者多个字符)
MySQL中的模糊匹配符:'_'(单个字符)  '%'(0个或者多个字符)
SQL语句中模糊匹配使用 like子句(像)
select * from emp where incoming like '%5%';
select * from test where name like 'xiao___';
select * from test where time like '2022-08%';


查询限定数量的数据 ---分页查询limit  ,只能放在整条SQL的最后  
格式:limit 下标,数量
简写:limit 数量    ===》简写后 下标默认为0,从第一行开始
计算机统计排序使用--下标,下标是从0开始的(表示人工的第一个), 例如下标8 表示人工的第九个
select * from emp limit 0,4;
select * from emp limit 4;


区别:Oracle数据库是没有limit做分页查询,首先要使用rowid的函数获取表格的伪行号然后通过between。。and。。的方式去进行查询限定的行

排序:order by   
如果结合limit使用,limit也是放在最后的
升序(从小到大)使用acs,降序(从大到小)使用desc,默认是升序

select * from emp order by incoming desc;

select * from emp where dept2=101 order by incoming desc limit 2;  ==》同时出现条件过滤。排序以及分页查询时,要先做where条件过滤,再做order by排序,最后做limit限定查询

select * from emp order by dept2 desc,age asc;  ==》对多个字段进行同时排序,谁在前谁的优先级更高



分组:group by
注意:
1,分组查询,最终的结果要查询指定的字段的。对什么字段进行了分组就查询什么字段。因为分组之后,只有分组字段可以正常匹配,其他非分组字段(普通字段)是随机出现(一般是表中分组字段对应的第一条)

2,如果希望在group by分组之后进行条件过滤,则使用having条件。where条件只能写在group by关键字之前

3,group by分组一般是结合 聚合函数 使用,where条件是不能接  聚合函数 ,having条件才可以接聚合函数

select dept2 from emp group by dept2;

select dept2,count(*) from emp group by dept2;

查询emp表中,部门人数大于1的部门编号:
select dept2,count(*) from emp group by dept2 having count(*)>1;


聚合函数: 可以结合group by分组使用,也可以不结合group by分组使用
结合group by分组,对每个分组之后的组生效
不结合group by分组,对整张表生效
where是不能接  聚合函数

count() 统计:
select count(*) from 表;  ==》统计表中有多少行
select count(1) from 表;  ==》统计表中有多少行
select count(字段) from 表;  ==》统计表中对应的字段有多少条数据

sum()  求和:
select sum(incoming) from emp;
select dept2,sum(incoming) from emp group by dept2;

avg()  求平均:
select avg(incoming) from emp;
select dept2,avg(incoming) from emp group by dept2;

max() 求最大值:
select max(age) from emp;
select dept2,max(age) from emp group by dept2;

min()  求最小值:
select min(age) from emp;

distinct() 去重复:
select distinct(dept2) from emp;

SQL中是可以进行四则运算的
select max(incoming)-min(incoming) from emp;
select max(incoming)-min(incoming)*10 from emp;
select (max(incoming)-min(incoming))*10 from emp;


as:对需要被查询的字段进行取别名
select dept2 as '部门编号' ,max(incoming) as '最高收入' from emp group by dept2;

珠海工行必问SQL题:
现在有个科目表,里面有两个字段:姓名、科目
求出 表中选择科目大于2科的学生姓名
分组、聚合函数、分组之后的过滤
select 姓名 from  科目表 group by 姓名 having count(科目)>2


改---update。。。set 。。。
update 表 set 字段=新值 where 限定条件
update test set class=2345 where sid=3;

update 表 set 字段=新值,字段=新值,字段=新值 where 限定条件
update test set class=1223,name='xiaohong',age=16 where sid=4;


删----delete
delete from 表;===》不限定条件删除表中数据,把表中所有的内容进行删除
delete from 表 where 限定条件;  ===》按照条件删除指定的数据

面试题:
MySQL中删除数据有多少种方式?
1,delete :可以根据条件删除指定的数据,如果不接条件时,可以把表中所有的数据进行删除,有清空的作用,但是重新插入数据时,自增长字段还是会在原来最大值的基础上进行累积递增(只删除表中数据,保留表结构,没有释放空间)
2,truncate :truncate +表名; ==》清空对应的表数据,不能接条件删除指定的数据。保留表结构,重新插入数据时,自增长会重新从1开始(清空表中数据并释放空间,保留表结构)
3,drop table +表名;  ==>删除整张表,删除数据,表的定义也被删除(释放空间)

-----------------------------------------

数据备份:
一:在数据库中对单个表进行备份操作(在MySQL中执行SQL语句进行备份)
1,先备份表结构:
create table 新表名 like  原有表;
2,再备份表中数据(把整张旧表的数据备份到新表中)
insert into 新表 select * from 旧表;

二:备份整个库(整个库中所有的表结构和表数据)==》在Linux界面执行,通过Linux中mysql客户端相关的指令进行
1,备份数据库--mysqldump
mysqldump -u数据库用户 -p密码 需要备份的库 > 脚本文件.sql
2,还原备份的SQL脚本文件(必须要有对应的库)
mysql -u数据库用户 -p密码 必须存在的一个库  < 脚本文件.sql


---------------------------------------------------
MySQL数据库的权限操作:

必须进入mysql库中==》use mysql;

查看当前MySQL数据库管理系统有什么用户:
select host,user,password from user;

创建MySQL用户:

方式一:通过在user表中插入数据的方式创建(一般不会使用)

insert into user(host,user,password) values('localhost','dcs45',password('123457'));
密码的插入是需要使用password()函数进行加密的

对数据库中任何的权限进行操作,都要进行 权限刷新 操作:
flush privileges;

增加权限:
grant insert,delete,update,select,create on *.* to 'dcs45'@'localhost' identified by '123457';
   *.* 表示所有库里的所有表

同样也要进行权限刷新:
flush privileges;

查看对应用户的权限情况:
show grants for 'dcs45'@'localhost';

方式二:直接通过 grant 赋予权限的方式进行用户创建
grant all privileges on *.* to 'root'@'%' identified by '123456';  ==》赋予 所有的权限 在所有库中所有表 给 远程网络权限(%)的root用户,密码为123456

也要进行权限刷新:
flush privileges;

revoke all on *.* from '用户'@'网络位置'   ==》取消对应用户的权限

更改密码:
update mysql.user set password=password('123456') where user='dcs45' and host='localhost';


删除用户:
delete from msyql.user where host=网络位置 and user =用户名;

也要进行权限刷新:
flush privileges;


**权限更改后都要刷新权限(flush privilege)


---------------------------------------------------------------------
数据库管理工具(Navicat, DBeaver)
Navicat 是一个连接数据库的图形化管理工具,收费
DBeaver 是免费的,是用JAVA语言开发的。

使用Navicat连接时,需要启动MySQL以及关闭防火墙
---------------------------------------------------------
多表查询
表的拼接方法有5种
1. inner join (内连接)
   把不同表中相匹配的数据显示出来
2. left join(左外连接)
   显示左表所有内容,右表显示匹配数据,如果没记录显示Null
3. right join(右外链接)
    显示右表所有内容,左表显示匹配数据,如果没有记录显示null
4.基本链接  
   与inner join 相似
5.union(硬连接)
   把表进行上下拼接

如果要显示表中所有数据,要使用外连接,即左外连接(left join)或者右外连接(right join),因为内连接只会把表中相匹配的内容进行显示。

左外连接比右外连接的查询速度快,因为左连接是显示左表中的所有内容,当查询时不会遇到Null。

---------------------------------------------------------------

索引 ---- index
索引是一种数据结构,只要是添加在一些被频繁查询的数据字段上,可以有效的提高查询速度。

索引注意点:
1. 创建索引时在大量数据的前提下,添加索引可以提高查询速度
2. 添加索引可以提高查询速度,但是会影响数据插入或数据更新的速度
3. 不是每个字段都要添加索引
4. 索引分为3中
  (1)主键索引(primary key,PRI)
        一个表中只能存在一个,要求对应字段的值 唯一且不能为空
  (2)唯一索引 (unique key, UNI)
        一个表中可以存在多个,要求对应字段的值 唯一,但可以为空
  (3)普通索引  (index, MUL)
        一个表中可以存在多个,对索引字段的值没要求

5. 索引优先级:PRI > UNI  > MUL

show index from 表名 ===> 查看表中的索引信息

普通索引:
1. 使用create index创建索引

create index 索引名 on  表名(字段名)
create index 索引名 on  表名(字段名1,字段名2)--复合索引
复合索引:把索引添加在字段上,当两个字段同时被操作才会激活索引

create unique index 索引名  ===> 创建唯一索引
create unique index 索引名 on  表名(字段名1,字段名2)==> 复合索引

删除索引(普通索引和唯一索引一样):
alter table  表名  drop index  索引名
alter table  表名  drop index  索引名1, drop index  索引名2, drop index  索引名3 ...

2. 使用alter table 创建索引
alter table 表名 add index 索引名(字段名)
alter table 表名 add unique index 索引名(字段名)  ===>唯一索引

--------------------------------------------------------------------------

视图(view)
  视图是一个虚拟的表,由行和列组成的数据,但是它不是用来存储数据,而是用来显示数据的。
  视图是建立在实际的表之上,视图的数据是动态生成的(根据实际的表数据做实时计算得到的)

视图的作用
1. 为了安全,在公司中有些字段是保密字段,可以创建视图,限制对某些字段的查询

2. 简化查询,因为有些查询可能很复杂(多表查询、分组查询),而且这种查询经常被使用,为了避免重复编写SQL语句是的错误,可以通过把这些复杂的SQL语句创建为视图的方法,避免重复编写。

视图的特点
1. 视图是由实际的表产生的
2. 视图的查询本质上是对实际表进行查询操作,所以使用视图查询性能相对差
3. 视图的创建和删除是不会影响实际的基础表的,但是数据是会相互影响的
4. 当一个视图的数据来源是复杂的SQL时,那么视图的数据是不允许修改的

视图的操作
create view  视图名 as (select 字段名1,字段名2  from  表名)  ===> 创建视图

show create view 视图名   === >  查看视图表的结构
show table status where comment = 'view';  ===> 查看当前库中有哪些视图

drop view 视图名  ===>  删除视图

**对视图数据的增删改查操作,与实际表一样
**对视图数据的增删改查操作是会影响实际表的,实际表修改数据也会影响视图

-------------------------------------------------------------------------

外键约束  foreign key
用于约束表和表之间的内容
作用:为了避免一张表的数据太过冗余,就要对表进行拆分解耦,而且为了避免解耦之后数据不完整,所以要引入外键,约束数据的一致性和完整性,保持被约束的表数据的一致性和完整性。

创建表时需要加上数据引擎innodb,MySQL的表创建时会默认为myISAM是不支持外键的。
eg.
create table dcs1 (id int(4) primary key, name varchar(20)) engine = innodb
create table  dcs2 (sid int (4) primary key, sname varchar(20), constraint gz foreign key (sid) references dcs1(id)) engine = innodb

constraint gz  ===> 创建约束名称为gz
foreign key (sid) ===>外键定义在sid字段上
references dcs1 (id) ===>引用dcs1表中的id字段

删除外键,只要对子表进行操作就可以了
alter table 表名 drop foreign key 外键名;


*当主表中被引用的字段没有X值时,那么从表的外键约束字段就不能存在X值
*对从表插入数据时,如果主表没有对应的数据,则无法插入
*要删除或者修改主表的数据,要先确认主表的数据没有被引用,如果被引用要先删除从表中对应的数据

分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册