一丶基本命令:
创建数据库:create database 库名 charset utf8;
create database if not exists 库名 charset utf8; 如果数据库中没有这个库才会执行成功
查看所有数据库: show databases;
删除数据库: drop database 库名; drop database if exists 库名; 如果数据库有这个库才会删除;
选择进入数据库: use 库名 ;
查看表结构:desc 表名;
查看表: show tables;
删除表:drop table if exists 表名;
创建stu表: use db1;
create stu(
id int,
name varchar(50),
gender varchar(10),
birthday date,
score double
)
二丶DML语言:数据操作语言
语法:
insert into 表名 【(字段名1,字段名2,字段名3)】value("值1","值2","值3");
insert into `student` (student_id,student_name) value (1,"张三"); 在学生表中插入一条学生id为1,名字为张三的数据
UPDATE 表名 set colnum_name=value,[colnum_name=value...] where [条件];
UPDATE `student` SET name = "学生1" where id=1; 修改id为1的姓名为"学生1"
UPDATE `student` SET name = "长江7号" 修改所有的名字为长江7号
删除 DELETE 语法:DELETE FROM 表名 WHERE [条件]
DELETE FROM `student` where id=1; 删除学生表中id为1的的数据。
TRUNCATE 命令 完全清空一个数据库,表的结构和索引约束不会变。
TRUNCATE `student`
相同点:都能删除数据,都不会删除表结构。
不同点:
-------- TRUNCATE 重新设置 自增列 计数器都会归零
-------- DELETE 不会影响事务
查询 SELECT 语法: SELECT 字段1,字段2... FROM 表名;
--查询全部学生
SELECT * FROM `student`;
--查询指定字段
SELECT `studentno` ,`studentname` FROM `student`;
--别名 给结果起一个名字AS 可以给字段器别名,也可以给表起别名
SELECT `studentno` AS 学号, `studentname` AS 学生姓名 FROM `student`
--函数 CONCAT(a,b)
SELECT CONCAT("姓名: ",`studentname`) as 新名字 FROM `student`;
去重 DISTINCT 去除SELECT查询出来的结果中重复的数据,重复的只显示一条
SELECT * FROM `result`; --查询全部的考试成绩
SELECT `studentno` FROM `result`; --查询有那些同学参加了考试
--发现重复数据,去重
SELECT DISTINCT `studentno` FROM `result`;
模糊查询:比较运算符
--------------------模糊查询 ------------------------
--=====LIKE 结合 %(代表0到任意的字符) _(表示一个字符)========--
--查询姓刘的同学--
SELECT `studentno`,`studentname` FROM `student` WHERE `studentname` LIKE "刘%";
--查询姓刘的同学,名字后边只有一个字--
SELECT `studentno`,`studentname` FROM `student` WHERE `studentname` LIKE "刘_";
--查询姓刘的同学,名字后边有2个字--
SELECT `studentno`,`studentname` FROM `student` WHERE `studentname` LIKE "刘__";
--查询名字中间有"伟"的同学, "%伟%"--
SELECT `studentno`,`studentname` FROM `student` WHERE `studentname` LIKE "%伟%";
-- =========================in(具体的一个或者多个值)===============================---
--查询 1001,1002,1003号学生--
SELECT `studentno`,`studentname` FROM `student` WHERE `studentno` in (1000,1001,1002);
--查询在广州的学生--
SELECT `studentno`,`studentname` FROM `student` WHERE `address` in ("广州");
--查询在广州,深圳,天津的学生--
SELECT `studentno`,`studentname` FROM `student` WHERE `address` in ("广州","深圳","天津");
--=========================NULL,not NULL================================--
--查询地址为空的学生--
SELECT `studentno`,`studentname` FROM `student` WHERE `address`="" or `address` is NULL;
--查询有出生日期的学生 不为空--
SELECT `studentno`,`studentname` FROM `student` WHERE `borndate` is not null;
--查询有出生日期的学生 不为空--
SELECT `studentno`,`studentname` FROM `student` WHERE `borndate` is not null;
--查询没有出生日期的学生 为空--
SELECT `studentno`,`studentname` FROM `student` WHERE `borndate` is null;
联表查询 join 对比
--==================================联表查询====================================--
--查询参加了考试的同学(学号,姓名,科目编号,分数)
SELECT * FROM student;
SELECT * FROM result;
/* 思路
1.分析需求,分析查询的字段来自那些表,(链接查询)
2.确定使用那种链接查询。(7种)
确定交叉点(2个表中哪个数据是相同的)
判断条件: 学生表中studentno = 成绩表中的 studentno
*/
-- join(连接的表) on (判断的条件)链接查询
-- where 等值查询
-- inner join ---
-- 如果表中至少有一个匹配,就返回行 --
SELECT s.studentno,studentname,studentresult,subjectno
FROM student as s
INNER JOIN result as r
on s.studentno = r.studentno;
-- right join --
-- 会从右表中返回所有的值,即使左表中没有匹配 --
SELECT s.studentno,studentname,studentresult,subjectno
FROM student s
RIGHT JOIN result r
on s.studentno = r.studentno
-- left join --
-- 会从左表中返回所有的值,即使右表中没有匹配 --
SELECT s.studentno,studentname,studentresult,subjectno
FROM student s
LEFT JOIN result r
on s.studentno = r.studentno;
--查询缺考的同学--
SELECT s.studentno,studentname,studentresult,subjectno
FROM student s
LEFT JOIN result r
on s.studentno = r.studentno
WHERE studentresult is NULL;
-- 思考题(查询了参加了考试的同学的信息:学号,学生姓名,科目名,分数)
/* 思路:
1.确定需求,分析查询的字段来自那些表,student,result,subject(连接查询)
2.确定使用那种链接查询。(7种)
确定交叉点(3个表中哪个数据是相同的)
判断条件:学生表中的studentno=成绩表中的 studentno 成绩表中的 subjectno=subject表中的 subjectno
*/
SELECT s.studentno,studentname,subjectname,studentresult
FROM student s
LEFT JOIN result r
on s.studentno = r.studentno
LEFT JOIN subject sub
on r.subjectno = sub.subjectno;
-- 我要查那些数据 select ...
-- 要从那几个表中查 from 表 XXX join 连接的表 on 交叉条件
-- 假设存在一种多张表查询,慢慢来,先查询2张表然后在慢慢加
-- FROM a LEFT JOIN b
-- FROM a RIGHT JOIN b
自连接:自己的表和自己的表连接,一张表拆为两张一样的表即可
-- =============================自连接================================ --
SELECT f.categoryname as "父栏目",z.categoryname as "子栏目"
FROM category f ,category z
WHERE f.categoryid = z.pid
-- 查询学员所属的年级(学号,学生姓名,年级名称) --
SELECT studentno,studentname,gradename
FROM student s,grade g
WHERE s.gradeid = g.gradeid
SELECT studentno,studentname,gradename
FROM student s
INNER JOIN grade g
on s.gradeid = g.gradeid
-- 查询科目所属的年级 (科目名称,科目年级)--
SELECT subjectname,gradename
FROM subject s,grade g
WHERE s.gradeid = g.gradeid
SELECT subjectname,gradename
FROM grade g
INNER JOIN subject s
on s.gradeid = g.gradeid
-- 查询参加了 C语言 - 1 考试学生的信息(学号,学生姓名,科目名,分数) --
SELECT s.studentno,studentname,subjectname,studentresult
FROM student s
INNER JOIN result r
on s.studentno = r.studentno
INNER JOIN subject sub
on r.subjectno = sub.subjectno
WHERE subjectname="C语言 - 1"
SELECT s.studentno,studentname,subjectname,studentresult
FROM student s,result r,subject sub
WHERE s.studentno = r.studentno and r.subjectno = sub.subjectno and subjectname="C语言 - 1"
SQL执行顺序
select distinct
<select_list>
from
<left_table><join_type>
join <right_table> on <join_condition>
where
<where_condition>
group by
<group_by_list>
having
<having_condition>
order by
<order_by_condition>
limit <limit number>
1、from <left_table><join_type>
2、on <join_condition>
3、<join_type> join <right_table>
4、where <where_condition>
5、group by <group_by_list>
6、having <having_condition>
7、select
8、distinct <select_list>
9、order by <order_by_condition>
10、limit <limit_number>
事务
1什么是事务:
事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为ACID(原子性、一致性、隔离性和持久性)属性。
4.2 事务管理(ACID)
原子性(Atomicity)(要么都成功,要么都失败) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)(事务前后的数据完整性保持一致) 事务前后数据的完整性必须保持一致。
隔离性(Isolation)(每个事务执行时互不影响) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
事务的隔离级别
1 脏读:
指一个事务读取了另外一个事务未提交的数据。
2不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)。
3虚读(幻读):
是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。 (一般是行影响,如下图所示:多了一行)。
四种隔离级别设置
set transaction isolation level 设置事务隔离级别 select @@tx_isolation 查询当前事务隔离级