mysql集合篇章

第一章
我:自己想创建的数据库名称
创建数据库
create database if not exists(查看我是否存在)+我+character+set utf8mb4(数据库的特征);
查看数据库
show databases;(查看我是否创建成功)
show+create+database+我(显示数据库的创建
语句) (只要是show create 都是查看创建语句)
选择数据库
USE+我(设置默认数据库为我)
select database();(检查上一步是否成功)
修改数据库的特征
alter database 我 default character set gbk(想改的数据库的特征);
删除数据库
drop database if exists(判断后者是否存在) +想删除的数据库的名称
最后可以通过show databases;检查是否删除成功

第二章
我:数据表名称
创建数据表
先创建一个数据库,并且选择该数据库 ,create table 我(数据表内容);
查看数据表
show tables(查看数据表是否创建成功)
show create table 我;(显示该数据表的创建语句)
desc 我(查看数据表的结构信息)
修改数据表
alter table 我 rename to 新我(修改数据表的名字)
show tables ;(查看是否修改成功)
alter table 新我 character set=gbk;(修改表选项)
show create table 新我;(检查上一步)
desc 新我;alter table 新我 rename column(或change) 字段中的名字 to 新名字(修改数据表字段中的名字);desc新我(检查上一步)
desc 新我;alter table 新我 modify(或change) 字段中的名字 +新的类型(修改字段的数据类型);desc新我(检查上一步)

同上;alter table 新我 change 字段中的名字+字段中的名字+类型+frist(change修改字段的排列位置为第一列);同上
同上;alter table 新我 modify 字段中的名字 +类型+after+其他字段的名字(modify是将一个字段排到另一个字段的后面);同上

同上;alter table 新我 add 新的字段+frist(增加新的字段到第一排);同上

同上;alter table 新我 drop 字段中的名字;同上

删除数据表
drop table if exists 新我;show tables(检查上一步)

第三章
表的约束
1.设置非空约束
方法1:通过创建表时直接设置
mysql> create table iii(
    -> yy int,
    -> yyy int,
    -> yyyy int not null
    -> );

方法2:直接敲代码alter table 我 change 字段中的名字+新字段中的名字+类型+not null(change可以修改整个字段中的一行内容);alter table 我 modify 字段中的名字+类型+not null;(相比change复杂,且该方法只能修改null,具体可以与创建表中的modify进行探讨)

2.删除非空约束
如设置非空约束的方法2(将not null改为null)也可以使用方法alter table 我 change column 字段中的名字 新字段中的名字 类型;(省略null的判断:可以忽略)

唯一约束(字段中的名字+类型+unique)
直接连同数据表一起设置时:
mysql> create table tb_emp01(
    -> deptname varchar(16),
    -> empno int unique,
    -> ename varchar(16),
    -> job varchar(16) not null,
    -> email varchar(30),
    -> unique(deptname,name)!!!!!!!!!!!!!!!!!!!!!!!(显示deptname和name的值两个一起判断唯一性,两行的deptname相同可以,但是两行的deptname+name都相等就不行)
    -> );
已经提前设置完数据表后想要添加唯一约束key:alter table 我 add unique(字段中的名字)-包括括号
删除唯一约束key
alter table 我 drop index 字段中的名字;

主键约束(必须是非空约束且仅存在一个)
设置主键约束(primary key)
同上;mysql> create table ggg (
    -> id int primary key,
    -> dname varchar(40) unique,
    -> local varchar(13) not null

同上;alter table 我 add primary key(字段中的名字);
删除主键约束
alter table 我 drop primary key;

默认值约束
设置默认值约束(default)
同上;mysql> create table ppp(
    -> id int primary key,
    -> ename varchar(16) unique,
    -> sal decimal(7,2),
    -> status varchar(13) default 1
    -> );
同上;alter table 我 modify 字段中的名字+类型 default 数值;

自动增长(auto_increment)
同上;mysql> CREATE TABLE III(
    -> EMPNO INT primary key auto_increment,
    -> deptname varchar(14) not null,
    -> job varchar(13)
    -> );


向数据表插入数据(insert)
一次插入单条数据
向所有字段插入数据
insert into 我 values(值1,值2...全部值),查看插入的数据select *from 我;
mysql> insert into emp values(
    -> 9567,
    -> '李木烨k',
    -> '李木烨k',
    -> 8888,
    -> 8888,
    -> 8888,
    -> 8
    -> );
向部分字段插入数据
insert into 我 (字段中的名字,字段中的名字...部分字段中的名字)g
vlaues(值1,值2...和上一步成正比);g
mysql> insert into emp(empno,ename,job,sal)
    -> values(7777,'零零','品牌',999);

一次插入多条数据
insert into 我g
values g
(值1,值2...全部值),g
(值1,值2...全部值),g
.
.
(值1,值2...全部值);g
mysql> insert into emp
    -> values
    -> (1,'w','ww',null,null,null,null),
    -> (2,'q','qq',null,null,null,null);

更新数据(update)
更新数据表中的部分数据
一:查询含有某个的字段的所有字段的数据
select*from 我 where 含有某个的字段的所有字段=‘内容’;

二:update 我 set 字段中的名字=字段中的名字+想要增加的数值 where 含有某个的字段的所有字段=‘内容’;
mysql> update ooo set sal=sal+200 where job='保洁';

三:查询含有某个的字段的所有字段的数据
select*from 我 where 含有某个的字段的所有字段=‘内容’

更新全部数据
update 我 set 字段中的名字=字段中的名字+想要增加的数值;
检查select*from 我;

删除数据(delete)
删除数据表中的部分数据
select*from 我 where 含有某个的字段的所有字段='内容';检查是否存在该数据
delete from 我 where 含有某个的字段的所有字段='内容';
select*from 我 where 含有某个的字段的所有字段='内容';检查是否删除成功
删除数据表中的所有数据
delete from 我;
tuncate table 我(只能用来删除数据表中的所有数据)

第四章(select)
查询数据表中某些字段包含的所有信息(前面的select*from 我查询全部字段的信息)
select 字段,字段 from 我

查询去重数据(防止查询出多个相同的值:如部门)
select distinct 字段 ,(字段)from 我

查询某个字段不包含某个值的其他数据(select from 后面要用where)<>和!=一样
select*from 我  where 字段<>字段中的值; 

查询字段中大于或小于某个值的数据(>=)
select*from 我 where 字段<或>某个值;

查询字段中某些值
select*from 我 where 字段 in(值1,值2....);

由于前面的方法无法查询为null的值,可以使用
select*from 我 where 字段 is null;
以上方法用来查询int等整型数据


以下方法用来查询varchar等字符型数据
%通配符(无限长)
前面第一个字为级的数据
select*from 我 where 字段 like ‘级%’ ;
最后一个字为据的数据
select*from 我 where 字段 like ‘%据’ ;
第一个字为级最后一个字为据的数据
select*from 我 where 字段 like ‘级%据’;

_通配符(长度为1)
查询字段中为哈哈哈的数据
selecr*from 我 where 字段 like '__哈';

带逻辑运算符的查询
可以用于各种类型select*from 我 where 字段=‘内容’AND字段='内容';select*from 我 where 字段=‘内容’OR字段='内容';
int等类型select*from 我 where 字段 between 值 and 值;select*from 我 where 字段 not between 值 and 值;

高级查询
查询数据的行数select count(*)from 我;
查询某个字段不含null的行数select count(字段)from 我;
查询一个字段的总值select sum(字段)from 我;
查询一个字段的平均值select avg(ifnull(字段,0)(将字段中null值认为0))from 我;
查询一个字段中最大值select max(字段)from 我;最小值select min(字段)from 我;

分组查询(group by)distinct
查询一个字段的值的种类
select from 我 group by 字段;
查询字段中不同种类的值的其他字段的平均值和总值
select 字段,avg(其他字段),sum(其他字段) from 我 group by 字段;
先将一个字段分种类,接着筛选其他字段平均值小于3000的值
select 字段,avg(其他字段)from 我 group by 字段  having avg(其他字段)<3000;

排序查询(order by)
查询一个字段的值并且将他这些值的其他字段进行升序(降序)
select *from 我 where 字段='内容' order by 其他字段(加一个desc为降序);
select *from 我 where 字段='内容' order by 其他字段1,其他字段2(加一个desc为降序);其他字段1先排序,接着相同的其他字段1按字段2

限量查询(limit)
查询一个字段n个最高值并排序
select*from 我 order by 字段 desc limit n;
查询一个字段从第k个值开始的前n个值并排序
select*from 我 order by 字段 desc limit k-1,n;

内置函数
选择一个字段并为其他字段显示的值中加入字符串(concat)
select concact(字段,'字符串',字段)from 我 where 字段='内容';
 将null的值设为一个文字(if)
select if(isnull(其他字段),’随便文字‘,其他字段),字段  from 我 where 字段='内容';

为字段设置别名(as)
select 字段 as'随便',字段 ’随便‘  from 我 where 字段=’内容‘;

第五章
多表查询
交叉连接查询(笛卡尔积=数据表行数*数据表行数)
select*from 数据表,数据表;

内连接查询(不显示为null的值)
select 显示字段 from 数据表1 join 数据表2 on  匹配条件(例如:数据表1的内容和数据表2中deptno一样才显示);(数据表1.deptno=数据表2.deptno)
自连接查询·
mysql> select e.* from emp e join emp d on e.deptno=d.deptno where d(!!!!).ename='刘一';(查询名字为刘一所在部门的全部信息,重点where后面只能跟第二个表的名字)

外连接查询(将null值也显示出来)
左连接查询
select e.*,dname from emp e left join dept d  on e.deptno=d.deptno;(左边的emp e字段e.*内容全部显示,右边dept d的字段dname内容可能为null)
右连接查询
select dname,e.* from emp e right join dept d  on e.deptno=d.deptno;(和上面显示的结果一样,定义相反)

复合条件连接查询
mysql> select e.*,dname from emp e left join dept d on e.deptno=d.deptno
    -> order by e.sal desc;

子查询(IN)*//select*from 我 where 字段 in(值1,值2....);*//
先查询部门的所有信息,接着查询工资高于3000的部门(前:先查询部门的所有信息(后:根据另一个数据表!的部门号来判断))
mysql> 前:select* from dept where deptno in(后:select deptno from emp where sal >3000);

EXISTS关键字结合子查询
先查询部门的所有信息,接着筛选出薪资大于3000的员工信息
mysql> select*from dept where exists (select*from emp where emp.deptno=dept.deptno(因为前面查询的是deptno后面查询的是emp) and sal>3000);
(和子查询的区别就是deptno in  =   emp.deptno=dept.deptno)

ANY关键字结合子查询
查询一个部门的薪资高于另一个部门的其中一个薪资的所有信息
mysql> select*from emp where deptno=10 and sal>any(select sal from emp where deptno=20(部门为20任意一个工资));

ALL关键字结合子查询
查询一个部门的薪资高于另一个部门的每个薪资的所有信息
mysql> select*from emp where deptno=10 and sal>all(select sal from emp where deptno=20(部门为20任意一个工资));

比较运算符结合子查询
查询一个职位和刘一一样但不是刘一的人
mysql> select*from emp where job=(select job from emp where ename='刘一')AND ename !='刘一';

外键约束
添加外键约束(add constraint添加约束foreign key外键references后面接引用哪个表的主键)
mysql> alter table emp add constraint fk_deptno foreign key(deptno)
    -> references dept(deptno);
使用show create table 字段进行查询
可以看到有
KEY `fk_deptno` (`deptno`),表示创建了一个和外键名称相同的索引
CONSTRAINT `fk_deptno` FOREIGN KEY (`deptno`) REFERENCES `dept` (`DEPTNO`),表示在deptno字段上创建了名称为fk_deptno的外键,fk_deptno外键引用部门表dept中的deptno字段
注意:
1.建立外键的表必须使用innodb引擎,不能是临时表,因为在mysql中中有innodb引擎才允许使用外键
2.定义的外键名称不能加引号
3.外键所在列的数据类型必须和主表中主键对应列的数据类型相同

操作关联表
数据表的关联关系
一对一 、多对一、多对多

关联表添加数据(必须得先让主表添加数据,只用主表中有索引的东西,从表才能索引到)
第一步:先往主表dept中插入数据
mysql> insert into dept
    -> values(50,'人力资源部');
第二部:接着往从表emp中插入数据
mysql> insert into emp values(9966,'八戒','运营专员',9839,3000,2000,40),(9999,'悟空','人事专员',9982,3000,null,50);
主要是有50,其实只有40也能直接运行直接省略第一步,因为主表本来就有40

关联表删除数据
与关联表添加数据的步骤相反
先删除从表emp中的数据,再删除主表dept中的数据
mysql> delete from emp where deptno=(select deptno from dept where dname='人力资源部');
mysql> delete from dept where dname='人力资源部';
注意:
无论是添加数据还是删除数据,步骤必须按顺序来,否则会报错

删除外键约束
alter table 我 drop  foreign key 自己设置的外键名字;
mysql> alter table emp drop foreign key fk_deptno;


第六章(view视图)
create view aaa(可以自己更改字段中的名字) as select (对应的字段)from 数据表;
简单的来说以上的操作就是用来复制一个数据表,防止操作失误麻烦
show create view aaa;(查看创建语句)
desc aaa;
create or replace 和alter都可以将已经存在了的视图进行修改
如 :create or replace (alter) view aaa(可以自己更改字段中的名字) as select (对应的字段)from 数据表;
插入数据更新数据还是原来的那样,只需要把视图当作一个数据表操作即可

第七章(start transaction 事务)
事务可以防止出现类似转账的问题,一方加钱而另一方没减钱,可以确保多个代码一起完成
start transaction;
commit;(提交一个事务里面的所有代码)
rollback;(未提交时可以取消一整个事务)
savepoint 名字;(在事务里面创建保存点)
rollback to savepoint 名字;(可以返回某个保存点,但是保存点后面的代码全部被删除)

事物的隔离级别(脏读、不可重复读、幻读)
read uncommitted(最低级别不可避免)
read committed(避免脏读)
repeatable read(避免脏读和不可重复读)
serializable(避免上面的问题,但是)
脏读指可以读取事务中未提交的数据
不可重复读指在事务中重复读取别的线程已经提交的数据,多次查询结果不一样(更新操作)
幻读是指在一个事务内两次查询的数据条数不一致;和不可重复读类似;区别在于幻读是其他事务进行了插入操作(插入操作)

设置另一个客户端的隔离级别
set session transaction isolation level read uncommitted;
select @@session.transaction_isolation;(查看当前会话的隔离级别)

脏读:
客户端1:start transaction;insert into iii values(6,'asdf',1);未提交
客户端2:select*from iii;可以观察到数据插入

不可重复读:
客户端1:update iii set asdf=7 where asdf=5;
客户端2:先start transaction;select*from iii;到客户端1;再select*from iii;
两次查询结果不一样

幻读:
客户端1: insert into iii values(6,'asdf',1);
客户端2:先start transaction;select*from iii;到客户端1;再select*from iii;
客户端2奇怪一个事务的查询结果不一样

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值