在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