专家心血总结MySQL干货!不看后悔一辈子!

在DOS窗口或mysql客户端都可以操作
mysql语句后面以分号结束。

1:MySQL基础和基本的操作:

1:连接MySQL: mysql -uusername -ppassword 来连接/登录数据库
1.1:exit; 退出数据库。

2: 查看所有的库名 Show databases;

3:选择库的语句 Use 库名;

4:自己创建一个库 create database 数据库名 charset utf8;

5:删除一个数据库 drop database 数据库名;

6:Mysql中表/列可以改名,database不能改名。

7:选中库之后,查看该库下的所有表 Show tables;

8:简单的建表语句

Creat table stu(
				snum  int,
				sname varchar(10)
				)engine  myisam charset  utf8;

注意:engine 指表引擎和性能特点相关。

9:删除一个表 drop table 表名;
10:修改表名: rename table 旧的表名 to 新表名;
11:清空表数据 : truncate 表名;

注意:truncate 和delete的区别
truncate 相当于删表再建一张同样结构的表,操作后得到一张全新的表。
delete是从删除所有的层面来操作的。
truncate 速度更快。

12: 向表中插入数据:
insert into 表名 values (1,‘zhnagsan’),(2,‘zn’),(3,‘zhsan’);

13: 查询表中所有的的数据
select * from 表名;

14: 查询表中的数据,带条件查询
select * from 表名 where 字段=值;

         例如:
          select   *   from    qxjkb_user    where    usersn=20;

15:删除数据
delete from 表名 where name = ‘aaa’;

16:修改数据
update 表名 set name = ‘aaa’ where owere = ‘周星星’;

17:查看一个数据表的结构:
describe 数据表; -----------简写---->desc 数据表

18:MySQL的常用数据类型:
1.数值
2.日期/时间
3.字符串

** mysql建表约束**
1:主键约束---------primary key
它能够唯一确实一张表中的一条记录,也就是我们通过给某个字段添加约束,就可以使得该字段不重复且不为空。

create   table  user(
	id  int   primary   key,    
	name   varchar(20)
	);
insert   into   user  value(1,'张三');

1.1:联合主键
只要联合的主键值加起来不重复就可以。

create  table  user2(
	id int,
	name varchar(20),
	password varchar(20),
	primary key(id,name);

1.2:给表添加主键

alter  table   user3  add primary key(id);

1.3:删除主键

alter  table  user3 drop  primary key;

1.4:使用modify 修改字段,添加约束

alter  table  user4  modify  id int primary key;

2:自增约束------auto_increment

create  table  user3(
	id int primary key   auto_increment,
	name varchar(20)
);

3:唯一约束--------unique
约束修饰的字段的值不可以重复

3.1添加唯一约束

alter  table  user5 add unique(name);

3.1,2添加唯一约束

create  table  user6(
	id int,
	name varchar(20),
	unique(name)
);

注意: unique(id,name) 表示两个键在一起不重复就行.

3.2:删除唯一约束.

alter  table  user7  drop  index  name;

3.3:添加----通过modify

alter  table  user7 modify name vachar(20) unique;

总结:
1.建表的时候就添加约束
2.使用alter…add…添加
3. 使用alter…modify…添加
4. 删除alter…drop…

4:非空约束-------not null
修饰的字段不能为空null。

create  table user8(
  id int,
  name varchar(20) not null
);

5:默认约束-------default
就是当我们插入字段值的时候,如果没有传值,就会使用默认值。

create table  user9(
    id int,
    name varchar(20),
    age int dafault 10
);

6:外键约束----------foreign key
涉及到两个表:父表,子表。
或者主表,副表。

----班级表
create table classes(
	id int primary key,
	name varchar(20)
);
----学生表
  create table students(
  	id int primary key,
  	name varchar(20),
  	class_id int,
  	foreign key(class_id) references classes(id)
  );

结论:
1.主表(父表)classes中没有的数据值,在副表(子表)中,是不可以使用的。
2.主表中的记录被副表引用,是不可以被删除的。

数据表设计的三大设计范式
1:第一范式-------1NF
数据表中的所有字段都是不可分割原子值。
字段值还可以继续拆分的,就不满足第一范式。

2:第二范式------2NF
必须是满足第一范式的前提下。第二范式要求,除主键外的每一列都必须完全依赖于主键。
如果要出现不完全依赖,只可能发生在联合主键的情况下。

3:第三范式-------3NF
必须先满足第二范式。除开主键列的其他列之间不能有传递依赖关系。

mysql的查询练习
1:查询所有的信息

select  *  from  student;

2:查询表中的某些信息

select  name,class  from  student;

3:排除重复的------distinct

select  distinct  departs  from  teacher;

4:查询区间-----between…and…

select  *  from  score  where  degree  between 60  and  80;

或者使用运算符比较

select *  from  score  where  degree > 60  and  degree < 80;

5:表示或的关系查询 -------in

select  * from  score  where  degree  in(85,87,90);

6:不同字段的或的关系查询---------or

select  *   from  student  where class='95031'  or   sex='女';

7:排序时指定------order
升序-------asc
降序-------desc

select  * from  student  order by class desc;

8:升序和降序同时使用

select  * from  order by cno asc,degree desc;

9:统计-----count

select  count(*)  from  student   where class='95031';

10:查找最高分----子查询或排序

select  sno,cno from  score where  degree=(select max(degree) from score);

查询拓展
1:在查询语句中
limit 0,1 ----------作用,第一个表示多少开始,第二个表示查多少条。

2:查询平均成绩
avg()---------求平均数
group by --------用于分组的

select cno,avg(degree)  from group by cno;

3: 模糊查询------like

4:把一个字段起个类名--------as

select sname, student.sno  as  stu_sno from student;

5:查询某个年份,通过函数------year();

select year(sbirthday)  from student where sno in(108,101);

6:表示或者的关系-------in

select  *  from  student  where class in('9809','9887');

7:条件查询-------where

select cno from  score  where  degree>85;

8:求并集-------------union

9:至少,大于其中一个----------any
降序排序--------------desc

select * from score where cno = '3-105' and degree>any(select degree from score where cno='3-245') order by degree desc;

10:表示所有的关系--------all

select * from score where cno = '3-105' and degree>all(select degree from score where cno='3-245');

11:取别名-------as
求并集-------union

select tname as name, tsex as sex, tbirthday as birthday from teacher  union  select sname,ssex,sbirthday from student;

12:模糊查询取反--------not like

select * from student where sname not like  '王%';

13:求年份函数-----year()
求当前时间函数------now()

select  year(now());
select year(sbirthday) from student;

14:最大和最小函数------max(), min()

select max(sbirthday),min(sbirthday) from student;

SQL的四种连接查询
1:内连接
inner join 或者 join 查询

内联查询------其实就是两张表中的数据,通过某个字段相对,查询出相关记录数据。
select * from  person inner join  card  on  person.cardId = card.id;
on----指携带的查询条件。

2:外连接
2.1: 左外连接 left join 或者 left outer join

 select * from person left join card on person.cardId = card.id;
2.2: 右外连接 right   join  或者  right  outer  join 
2.2:完全外连接  full   join   或者  full  outer  join 

mySQL事务
mysql中,事务其实是一个最小的不可分割的工作单元。事务能够保证一个业务的完整性。

1:mySQL中如何控制事务?
1:mysql默认是开启事务的(自动提交)。
select @@autocommit;-------检测默认提交的sql语句。

select @@autocommit;

默认事务开启的作用-----当我们去执行一个sql语句时候,效果就会立刻体现出来,且不能回滚。

	-----事务回滚:撤销sql语句执行效果。===》  rollback;
rollback;
    ------设置mysql自动提交为false。
set autocommit=0;
当设置mysql自动提交为false时候,插入数据后,需要再一次手动提交数据。-----commit;
commit;
特点:
		1:自动提交----@@autocommit=1
		2:手动提交-----commit;
		3:事务回滚------rollback;

事务给我们提供了一个返回的机会。

2:手动开启事务

begin;

或者

start transaction;

事务开启之后,一旦 commit 提交,就不可以回滚(也就是当前的这个事务在提交的时候就结束了)。

事务的总结
1:事务的四大特征
A 原子性:事务是最小的单位,不可以再分割。
C 一致性:事务要求sql语句,必须保证同时成功或者同时失败。
I 隔离性:事务1和事务2之间具有隔离性的。
D 持久性:事务一旦结束(commit,rollback),就不可以返回。

2:事务开启
1:修改默认提交 set autocommit=0;
2:begin;
3:start transaction;

3:事务手动提交
commit;

4:事务手动回滚
rollback;

事务的隔离性分类:
1:read uncommitted; 读未提交的
2:read commited; 读已经提交的
3:repeatable read; 可以重复读
4:serializable; 串行化

如何查看数据库的隔离级别:
mysql 8.0
------系统级别的

select @@global.transaction_isolation;
-------会话级别的
select @@transaction_isolation;
mysql   5.x
 ------系统级别的
select @@global.tx_isolation;
-------会话级别的
select @@tx_isolation;

如何修改隔离级别:

set global transaction isolation level read  uncommitted;

1:read uncommitted; 会出现的问题

脏读:一个事务读到了另外一个事务没有提交的数据,就叫做脏读。

2:read commited; 会出现的问题

不可重复读现象:read   commited;

3:repeatable read; 会出现的问题

幻读:事务a和事务b同时操作一张表,事务a提交的数据,也不能被事务b读到,就可以造成幻读。

4:serializable; 会出现的问题

当表被另外一个事务操作的时候,其他事务里面的写操作,是不可以进行的。
进入排队状态(串行化),当那边事务结束之后,这边的写操作才会执行。
当然是在没有超时的情况下。

串行化问题是,性能特差!!!

性能等级:
read uncommitted > read commited > repeatable read > serializable;

-----隔离级别越高,性能越差。

mysql默认隔离级别是  repeatable  read;

mysql基础语法总结

SELECT MAX(s.grade) AS 最大值,s.losal, s.hisal FROM salgrade s 
SELECT MAX(s.grade) FROM salgrade s HAVING MAX(s.grade)

#ROUND()

SELECT AVG(s.empno) FROM emp s 
SELECT ROUND( AVG(s.empno) , 2) AS 平均值 FROM emp s 
SELECT SUM(s.grade) FROM salgrade s

#order by xx 排序 默认升序(从小到大) order by xx desc 降序(从大到小)

SELECT * FROM emp e ORDER BY e.empno DESC  

#GROUP BY xx 分组 如果有相同的就合并了 Where --> Group By --> Having --> Order by 已经合并后才会执行函数(max)数据不准确

SELECT * FROM emp e GROUP BY e.job  

#DISTINCT 去重

#select DISTINCT e.job,e.ename from emp e  添加e.ename 失效
SELECT DISTINCT e.job FROM emp e

#like 模糊查询

SELECT * FROM emp e WHERE e.job LIKE '%r%'   -- 查询全部带有r的字段
SELECT * FROM emp e WHERE e.job LIKE '%r'    -- 查询最后面一个字母为 r 
SELECT * FROM qxjkb_info_textpass e WHERE e.content LIKE '_试%'
SELECT * FROM qxjkb_info_textpass e WHERE e.content LIKE '___加%'  --  前面有 三个 _

#改造

SELECT * FROM emp e WHERE e.deptno=20 AND IF('g' !='',e.job LIKE CONCAT('%','r','%'),1=1)  --
                              TRUE                              FALSE 
 AND IF(:searchkey  !='' ,a.name LIKE CONCAT('%',:searchkey,'%'),1=1)
 LIST<Qxjkb_library> findAllLib2(@Param("searchkey") STRING searchkey);
 A表 INNER JOIN B表 ON      A表 LEFT JOIN B表  ON        A表  RIGHT JOIN B表 ON 
SELECT * FROM emp e INNER JOIN dept d ON e.deptno=d.deptno  已左边为基准查询 右边的表 
·
SELECT * FROM dept d LEFT JOIN emp e  ON e.deptno=d.deptno 

SELECT * FROM dept d RIGHT JOIN emp e  ON e.deptno=d.deptno 

#员工所对应的领导名称

SELECT e.ename AS 员工名称, e1.ename AS 领导名称 FROM emp e , emp e1 WHERE e.empno=e1.mgr
SELECT * FROM emp e , emp e1 WHERE e.empno=e1.mgr
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值