1、环境需要
mysql数据库的环境 mysql-installer-community-5.7.28.0.msi
数据库的可视化操作工具 SQLyog-11.2.5-0.x64.exe
安装完以后找到安装路径下bin目录 在此目录下打开cmd 输入mysql -uroot -p #### ,检查是否安装成功,这里的###表示登录数据库的密码
成功登录会显示
打开可视化工具,输入对应端口号和账号密码,即可打开对应数据库可视化界面
2、数据库概述
数据库的操作包括SQL语句,约束,分页
3、SQL语句
Structural query language-----SQL分为以下三种类型
DML:Data Manipulation Language 数据操作语言
DDL:Data Definition Language 数据定义语言
DCL:Data Control Language 数据控制语言
3.1 DML
查询操作
#查询表中所有内容
select *
from 表名 ;
#查找表中指定内容
select 字段名1,字段名2,........
from 表名;
#查找满足判断条件的内容
select * #注意这里的判断条件 大于>,小于<,等于=,大于等于>=,小于等于<=,不等于<>,也可以加逻辑运算符 与and,或or,^非 from 表名 #模糊查询也可以作为判断条件 用法:select * from 表 where name like '_\_%'; where 判断条件; #%表示任意个数任意字符, _表示任意一个字符 ,\_转义字符,
#查询条件的转移字符也可以用关键字escape声明 WHERE first_name LIKE '_$_%' ESCAPE '$'; # escape:指定转义字符
#特殊运算符
in(等于列表中的任意一个) any( 和子查询=中某一个值比较) all(和子查询中所有的值进行比较)
#排序
# 查询所有部门的名字,location_id,员工数量和工资平均值 SELECT employees.`department_id`,departments.`department_name`,departments.`location_id`,AVG(salary),COUNT(1) FROM employees JOIN departments ON employees.`department_id` = departments.`department_id` GROUP BY employees.`department_id`,departments.`department_name`; ORDER BY employees.`department_id` asc #ORDER BY是负责排序的,此地方结果按department_id排序,默认增序, 有(desc/asc)俩个选项
#表的连接
/*
#表本身自己连接 vs 不同的表连接
自连接 vs 非自连接
#连接的表以表中某个值相等的连接 vs 笛卡尔积(全集)或外连接
等值连接 vs 非等值连接
#以下详细说明
内连接 vs 外连接
*/
/* 内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行 外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL). */ #内连接 :获取所有员工的姓名和部门名称 select e.first_name,d.department_name from employees e join departments d on e.department_id = d.department_id; #左外连接 :获取所有的员工及部门名称 select e.first_name,d.department_name from employees e left join departments d on e.department_id = d.department_id; #右外连接 :获取所有的部门及员工 select e.first_name,d.department_name from employees e right join departments d on e.department_id = d.department_id; #将右外连接变成左外连接 select e.first_name,d.department_name from departments d left join employees e on e.department_id = d.department_id; #总结:外连接包括内连接里面不满足条件且是某一个表的全集。
#sql自带的函数
#单行函数 /* LOWER('SQL Course') : 将内容全部转为小写 UPPER('SQL Course') :将内容全部转为大写 CONCAT('Hello', 'World') : 将两个字符进行拼接 SUBSTR('HelloWorld',1,5) : 将字符串从1的位置开始截取子串长度为5。(索引从1开始) LENGTH('HelloWorld') : 字符串长度 INSTR('HelloWorld', 'W') :w在当前字符串中首次出现的位置 LPAD(salary,10,'*') :向右对齐 RPAD(salary, 10, '*') :向左对齐 TRIM('H' FROM 'HelloWorld') : 去除字符串两端指定的字符H REPLACE('abcd','b','m') : 将当前字符串中的b替换成m ROUND: 四舍五入 ROUND(45.926, 2) 45.93 TRUNCATE: 截断 TRUNCATE(45.926) 45 MOD: 求余 MOD(1600, 300) 100 now() : 当前日期和时间 #注意组函数,只能出现在分组里面(having)或查询语句(select)上
/* 组函数 AVG() :求平均数 SUM(): 求和 MAX():求最大值 MIN() :求最小值 COUNT() : 求数量 #avg()和sum() : 注意只能运算数值类型的数据 #处理的数据不包括null #max()和min() :注意只能运算数值,日期,字符串 count(字段名) : 统计的时候不包括null count(*) : 统计表中所有的数据的条数(个别字段为null不受影响)。 count(数值) : 统计表中所有的数据的条数。 每条数据都会"存放"该数值然后统计该数值的个数。 效率比count(*)高 */
/* #通用函数 IFNULL(commission_pct,0) : 如果commission_pct中的内容为null那么就用0替换 ----------------------等值------------------------ case 字段名 when 值1 then 相应的操作1 when 值1 then 相应的操作2 .... else 相应的操作 end ----------------------非等值---------------- case when 条件1 then 相应的操作1 when 条件2 then 相应的操作2 .... else 相应的操作 end */ #if表达式
#if(条件表达式,值1,值2) :如果条件表达式的值为true结果为值1,否则为值2 #去重函数 #distinct 字段名: 去除重复的数据
#分组和过滤
#分组group by #过滤having /* select 字段名1,字段名299 from 表名 group by 字段名1,字段名2...... */ /* having 过滤条件 having和where的不同点? 1.having后面可以现出组函数,where后面不能出现组函数 2.过滤条件如果可以出现在where或having后面,那么优先放在where后面(不影响结果) */
#插入和删除(对表里的数据操作)
#插入单行数据 insert into 表名(字段名1,字段名2...) values(value1,value2......) #插入多行数据 insert into 表名(字段名1,字段名2...) values(value1,value2......),(value1,value2......)..... #如果插入数据时是全字段插入,那么表名后面的字段可以省略 insert into 表名 values(value1,value2......) #基于现有的表中的数据插入到当前表中 #注意:数据类型必须保持一致 insert into 表名(字段名1,字段名2....) select 字段名1,字段名2..... from 表名 #删除表数据 delete from 表名; #删除表中所有内容 delete from 表名 where 过滤条件; #修改表中所有的指定字段的值 update 表名 set 字段名1=value1,字段名2=value2... update 表名 set 字段名1=value1,字段名2=value2... where 过滤条件 #删除的区别 1.truncate删除的内容不能回滚,delete删除的内容可以回滚(前提是要开启事务) 2.如果删除的数据不用回滚那么优先truncate因为效率高一些
3.2DDL创建和管理表
#一般操作
#创建库 create database 库名; #删除库 drop database 库名; #选库 use 库名; #查看库中所有的表 show tables; #删除表 drop table 表名; #查看表和库的信息 show create database/table 库名/表名; #指定库的编码集 create database 库名 character set '编码集'; #指定表的编码集 create table 表名( 字段名 类型 ....... )character set ‘编码集’
#创建表
注意常见的数据类型
INT |
从-2^31到2^31-1的整型数据。存储大小为 4个字节 |
CHAR(size) |
定长字符数据。若未指定,默认为1个字符,最大长度255 |
VARCHAR(size) |
可变长字符数据,根据字符串实际长度保存,必须指定长度 |
FLOAT(M,D) |
单精度,M=整数位+小数位,D=小数位。 D<=M<=255,0<=D<=30,默认M+D<=6 |
DOUBLE(M,D) |
双精度。D<=M<=255,0<=D<=30,默认M+D<=15 |
DATE |
日期型数据,格式’YYYY-MM-DD’ |
BLOB |
二进制形式的长文本数据,最大可达4G |
TEXT |
长文本数据,最大可达4G |
1、白手起家法
create table 表名( id int, name varchar(20), ........ )
2、根据查询表的结果创建表(没有原表的约束条件)
create table 表名 select 字段名1....... from 表名;
#对表进行操作(增减列和行)
对表名修改: alter table 原表名 rename to 新表名;
格式: alter table 表名 add/drop/modify/change column .....
#添加列 ALTER TABLE person ADD COLUMN sex CHAR; #修改列的名称 ALTER TABLE person CHANGE COLUMN age2 age3 CHAR; #修改列的类型 ALTER TABLE person MODIFY COLUMN sex INT; #删除列 ALTER TABLE person DROP COLUMN birthday; #清空表 TRUNCATE TABLE emp;
3.3DCL数据库事务
讲事务就要谈案例
例子:小A到银行取钱给小B转账1000元
处理过程: 小A账户-1000元 ------------ 小B账户+1000元
事务完成
但是,当小A账户钱扣掉后,银行停电或出现意外时,事务终止,此时就会出现错误,小A的钱扣掉了,但是小B的钱没加
问题的解决:引入事务概念
当任务开始进行时,开启事务
任务顺利完成时,结束事务,也可以说时提交事务
当出现错误时,数据开始回滚到开启事务的状态,然小A和小B账号的数据回到没有转账的状态
mysql中的事务操作
开启事务 :set autocommit=false; 提交事务 :commit; 回滚事务 : rollback;
java中事务的处理
try{ 1.开启事务 : set autocommit=false; 2.AA-100 : 900 ---------发生异常了-------- 3.BB+100 : 执行不了 commit; }catch(Exception e){ 回滚数据; }finally{ set autocommit=true; }
4、约束
#约束的种类
/* NOT NULL 非空约束,规定某个字段不能为空 UNIQUE 唯一约束,规定某个字段在整个表中是唯一的 PRIMARY KEY 主键(非空且唯一) FOREIGN KEY 外键 DEFAULT 默认值 CHECK 检查约束(mysql不支持) */ /* 约束: 列级约束 vs 表级约束 列级约束 :只能约束一列。 表级约束 :可以同时约束多列。 注意 :not null和default只有列级约束。 */
#约束的创建
1、创建表时增加约束
#添加列级约束 CREATE TABLE stu( id INT PRIMARY KEY,#主键约束(非空且唯一,只要是表一定有主键约束) age INT DEFAULT 18,#如果没有给该字段插入数据那么默认插入18 NAME VARCHAR(20) NOT NULL, sid INT UNIQUE #唯一维束内容不能相同 ); #添加表级约束 CREATE TABLE stu2( id INT, age INT, NAME VARCHAR(20), passwd VARCHAR(20), sid INT, #添加表级约束--可以同时约束多个列 CONSTRAINT stu_id PRIMARY KEY(id), CONSTRAINT stu_name_pwd UNIQUE(NAME,passwd) );
2、表创建成功之后添加约束
/* primary key 添加约束 : alter table 表名 add primary key (字段名) 修改约束 : alter table 表名 modify 字段名 类型 primary key 删除约束 : alter table 表名 drop primary key unique: 添加约束 : alter table 表名 add unique(字段名) 添加约束 : alter table 表名 add constraint 索引名 unique(字段名) 修改约束 :alter table 表名 modify 字段名 类型 unique 删除约束 :alter table 表名 **drop** index 索引名 */ #表创建成功以后添加约束 CREATE TABLE s( id INT, NAME VARCHAR(20), age INT ) #添加约束 ALTER TABLE s ADD PRIMARY KEY(id); INSERT INTO s(id,NAME,age) VALUES(1,"aa",20); DROP TABLE s; ALTER TABLE s MODIFY id INT PRIMARY KEY; #删除约束 -- 仍然保留不能为null ALTER TABLE s DROP PRIMARY KEY; DESC s; /* not null 添加约束:alter table 表名 modify 字段名 字段类型 not null 删除约束 :alter table 表名 modify 字段名 字段类型 null default: 设置默认约束 : alter table tb_name alter 字段名 set default value; 删除默认约束 : alter table tb_name alter 字段名 **drop** default; foreign key: 添加约束 : ALTER TABLE 表名 ADD [CONSTRAINT emp_dept_id_fk] FOREIGN KEY(dept_id) REFERENCES dept(dept_id); 删除约束 :alter table 表名 **drop** foreign key 索引名 */
3、外键
#格式 CONSTRAINT 索引名 FOREIGN KEY(字段名) REFERENCES 主表名(字段名) #注意事项 创建表:应该先创建主表再创建从表 添加内容:先添加主表再添加从表 删除内容:先删除从表再删除主表 注:有外键约束的主表和从表,删除主表后,从表也会被删除 #当创建表后添加外键约束 #删除索引 ALTER TABLE emp DROP FOREIGN KEY 索引名; #添加约束 ALTER TABLE emp ADD [CONSTRAINT 索引名] FOREIGN KEY(dept_id) REFERENCES dept(dept_id);
5、limit分页
limit 索引值,数据的条数 #公式: #(当前页数-1)*每页条数,每页条数 注意:索引值是从0开始的 用来分批获取表中的数据(分页)