Mysql(中型数据库 免费 甲骨文公司) 中小企业使用 在较大数据量的时候 处理初速较慢,效率低;关系型数据库(由行和列组成)
MYSQL服务的开关
- 第一种方式:
右键我的电脑à管理à服务和应用程序à服务 找到mysql 打开和关闭
services.msc 可以替代找到服务的过程 找到mysql 打开和关闭
- 第二种方式:
Net start mysql服务的名字
Net stop mysql服务的名字
服务器常用命令:
进入服务器 mysql –u用户名 –p密码 –h空格访问的ip –P端口号(默认3306)
本机: localhost 127.0.0.1
不写 -h 默认本机 不写-P 默认3306
一般使用mysql –u用户名 –p 回车后 输入密码 这样 安全。
查看服务器下有哪些库:show databases 注意information_schema 和mysql不要去动
添加一个库: create database 库名
删除一个库:drop database 库名
重命名一个库:不能
进入一个库:use 库名
查看当前库有哪些表:show tables
创建一个表:create table 表名(字段名1 类型, 字段名2 类型,……. 字段名n 类型)
查看表的详细信息: desc 表名
删除表:drop table 表名
修改表名:rename table 老表名 to 新表名
给表添加一个字段: alter table 表名 add column 字段名 字段类型
更改字段的类型: alter table 表名 modify column 字段名 新类型
告诉服务器编码方式:set names 编码集名
Sql语句:
最简单的查询表内容: select * from 表名(存在当前库下) 全表全字段查询
往表里添加内容: insert into 表名 values(根据字段的顺序添加值)
修改表数据:update 表名 set 字段名1=值1, 字段名2=值2 where 条件判断
删除数据:delete from 表名 where 条件判断
数据类型:
通用属性:
default 默认值 default 默认的值
not null 不允许为空
- 整数型:
完整格式
类型名(M) zerofill unsigned
unsigned 无符号
zerofill 零填充 zerofill必须结合M才有意义,代表的是如果数字不足M则会在数字前面补充0直到指定位数
名字 字节 位 有符号范围 无符号范围
- tinyint 1 8 -128~127 0~255
- smallint 2 16 +-3万多 65535
- mediumint 3 24 ...
- int 4 32 ...
- bigint 8 64
tinyint:
有符号范围:
最小值:
[-][1][1][1][1][1][1][1]
-->1*2^0+1*2^1+1*2^2+...1*2^6-->-(2^7-1)-->-127
最大值:
[+][1][1][1][1][1][1][1]
-->+(2^7-1) -->127
0的问题:
[-][0][0][0][0][0][0][0] --> -0
[+][0][0][0][0][0][0][0] --> +0
--> -128~127
无符号范围:
最小值:
[0][0][0][0][0][0][0][0] -->0
最大值:
[1][1][1][1][1][1][1][1] -->2^8-1-->255
0~255
整数类型在没有任何特别配置的时候,默认使用的是有符号范围。
浮点型:
完整形式
浮点类型(M,D)
字节 范围
float 4 和M与D有关
double 8 和M与D有关
M 精度 去掉小数点之后整数和小数的位数总和
D 标度 小数所占的位数
float(6,2)
有符号:
-9999.99~9999.99
无符号:
0~9999.99
定点型:
字节
decimal(M,D) M+2
M和D与浮点型的M和D一模一样
字符串型:
M范围 字符数 利用率
char(M) 255 实传N,实占M N/M (N可以和M相等,利用率<=100%)
varchar(M) 65535 实传N,实占N字符+(1~2字节) N/N+(1~2字节) (N不可以和M相等,利用率<100%)
char 定长字符串
varchar 变长字符串
M代表的宽度 是字符串的长度
定长字符串快于变长字符串
数据库三范式
三范式的作用:
约束数据库建表的规范性。
三范式的最终目标:
不存在冗余数据
第一范式:
不要向表中输入完全重复的数据(设置主键)
在多个字段可以被选择的情况下,作为主键的字段应该选择最符合逻辑的一个,一般选择 与业务无关的字段,比如自 增 的Id
第二范式:
存在多对多关系时只有一个字段作为主键是不够的。部分依赖,会产生冗余数据,需要分解表
第三范式:
设置外键,传递依赖
主键关键字:primary key
已建好的表的主键添加:alter table 表名 primary key(字段名)
设置自动递增的主键:auto_increment
唯一键:unique
主键和唯一键的区别:
1.主键不能为空 2.唯一键可以有多个,但主键只能有一个
外键:foreign key
注意1.外键只能作用在另一个表的主键上 2.创建顺序只能先创建主表
语法:foreign key(外键所在字段名) references 主表名(主表主键所在字段名)
级联操作: on delete[update] cascade
置为null:on delete[update] set null
模糊查询 ;LIKE ‘_a%’ 表示名字中第二个单词是a
-- like 模糊查询
-- _ ,%
-- _ 代表占,并且只能占一位
-- % 代表可以不占,也可以占任意位
-- 查询员工姓名中有A的员工信息
select * from emp where ename like "A"; -- 这句话 等效于 ename="A"
select * from emp where ename like "%A%";
-- 查询员工姓名为5个字母组成,并且第三个字母为A
select * from emp where ename like "__A__";
-- 查询员工姓名中首字母为A的员工信息
select * from emp where ename like "A%";
SELECT * FROM emp where ename like "a%"; -- 数据库的语法叫严格不区分大小写
Order by(排序)
降序和升序:
order by col desc (asc)
-- order by 排序
-- 排序可以作用到任意类型的字段
-- 多个字段进行排序的时候会先进行前面字段的排序,如果前面字段出现相同值才会考虑后面的字段
-- select distinct 字段.. from 表名 where 条件 order by 排序条件
-- 查询员工表信息,并且按照工资顺序进行排序
select * from emp order by sal; -- 默认是升序
select * from emp order by sal asc; -- 显性升序
select * from emp order by sal desc; -- 降序
-- 查询员工信息表,按照入职日期进行排序
select * from emp order by hiredate;
select * from emp order by hiredate desc;
-- 查询员工信息表,按照工资和入职日期进行排序
select * from emp order by sal,hiredate desc;
-- 查询员工信息表,按照部门和工资进行排序
select * from emp order by deptno,sal;
函数:函数一般是在数据上执行的,它给数据的转换和处理提供了方便。
只是将取出的数据进行处理,不会改变数据库中的值。
Sql函数可以分为组函数和单行函数。
组函数又被称作聚合函数,用于对多行数据进行操作,并返回一个单一的结果,组函数仅可用于选择列表或查询的having子句
单行函数对单个数值进行操作,并返回一个值
字符函数
concat(string1,string2,str……)连接两个字符串
Lower(string) 以小写形式返回string
lpad,rpad 填充字符型数据
substr 提取字符串的一部分substr(string,1,2)
upper(string)以大写形式返回string
instr 字符串出现的位置, instr( string ,’A‘)
length 字符串长度
-- 单行函数
-- 字符串
select concat("abc","def") from dual;
-- 要求查询员工编号和员工姓名,要求编号显示为No.xxxxxx格式 不足位数的前面补0
select concat("No.",LPAD(empno,6,"0")),ename from emp;
-- lower
select lower("ABC") from dual;
-- 查询员工姓名,并且显示为小写的格式
select lower(ename) from emp;
-- lpad
select LPAD("ABC",6,"X") from dual;
select RPAD("ABC",6,"X") from dual;
数字函数
round(number,n)
select round(23.652) from dual;
select round(23.652, 2) from dual;
select round(23.652, -1) from dual;
mod(x,y)求余数
select mod(13,5) from dual;
ceil()上取整
select ceil(19.2) from dual;
floor()下取整
select floor(19.2) from dual;
日期函数
Sysdate() 获取当前年月日 时分秒
Current_time() 获取当前时分秒
Current_date() 获取当前年月日
Last_day(d)获取该月最后一天
To_days() 从0年到现在的天数
Datediff(d1,d2) d1-d2的天数
组函数
avg()返回某列的平均值
min()返回某列的最小值
max()返回某列的最大值
sum()返回某列值的和
count()返回某列的行数
组函数仅在选择列表和Having子句中有效
- 组函数除了count(*)外,都跳过空值而处理非空值select count(*) from emp;
ifnull(参数,值) 如果参数是null 显示出来的值 就是函数第二个参数
-- 组函数
-- 表示一组数据出来唯一一个结果的函数称为组函数
-- max 最大值 min 最小值 avg 平均值 count 个数 sum 求和
-- 求出员工表中最高的工资
select max(sal) from emp;
-- 求出员工表中最低的工资
select min(sal) from emp;
-- 求出平均工资
select avg(sal) from emp;
-- 求出这个公司的工资总支出
select sum(sal) from emp;
-- 求出这个公司的总人数
-- 推荐使用count的时候一般用 count(*) 或者是count(主键)
select count(*) from emp;
select count(empno) from emp;
-- 求出这个公司的平均奖金
select * from emp;
select avg(comm) from emp; -- 注意 组函数都会跳过空值而处理非空值会造成结果的错误。
select sum(comm)/count(*) from emp;
select avg(ifnull(comm,0)) from emp; -- 正确写法
-- 要求查询这个公司的所有员工的奖金
select ifnull(comm,0) from emp;
组函数一般结合分组使用
- group by 子句
- Group by 子句可以包含任意数目的列。
- 除组函数语句外,select语句中的每个列都必须在group by 子句中给出。(oracle特性,mysql不是)
- 如果分组列中具有null值,则null将作为一个分组返回。如果列中有多行null值,他们将分为一组。
- Group by 子句必须出现在where子句之后,order by 子句之前。
- Group by 子句可以包含任意数目的列。
- 过滤分组(having子句)
- Where过滤行,having过滤分组。
- Having支持所有where操作符。
where 后面不能直接跟组函数
笛卡尔积
- 检索出的行的数目将是第一个表中的行数乘以第二个表中的行数
- 检索出的列的数目将是第一个表中的列数加上第二个表中的列数
- 应该保证所有联结都有where子句,不然数据库返回比想要的数据多得多的数据
表连接
通过join连接表,通过on字句限定连接条件
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
- CROSS JOIN(交叉连接):没有WHERE子句,交叉连接返回连接表中所有数据行的笛卡尔积。
-
-- 多表查询 -- 语法: select 字段 from 表1,表2.... -- 要求查询员工信息及其所在部门信息 select * from emp; select * from dept; select * from emp,dept; -- 产生了笛卡尔积 -- 等值连接 select e.*,d.dname,d.loc from emp e,dept d where e.deptno=d.deptno; -- 查询名叫‘'JAMES’的员工的员工编号和姓名和部门编号和部门的名字 select e.empno,e.ename,d.deptno,d.dname from emp e,dept d where e.deptno=d.deptno and ename="james"; -- 非等值连接 -- 查询所有员工的员工信息和工资等级 select * from emp; select * from salgrade; select e.*,s.grade from emp e,salgrade s where e.sal>=s.losal and e.sal<=s.hisal; select e.*,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal; -- 查询员工的员工编号和姓名,部门名字,工资等级 select e.empno,e.ename,d.dname,s.grade from emp e,dept d,salgrade s where e.deptno=d.deptno and e.sal between s.losal and s.hisal; -- 表连接的其他语法 -- xxxx join 后面消除笛卡尔积的条件 需要用 on 加条件 -- cross join 交叉连接 -- 完全等同于之前学的,连接 select e.*,d.dname,d.loc from emp e cross join dept d on e.deptno=d.deptno; -- 查询名叫‘'JAMES’的员工的员工编号和姓名和部门编号和部门的名字 select e.empno,e.ename,d.deptno,d.dname from emp e cross join dept d on e.deptno=d.deptno where e.ename="james"; -- 自然连接NATURAL JOIN -- 如果想要使用自然连接的语法,则两张表必须具备以下条件 -- 1)两张表必须有一个字段的名字是相同的 -- 2)同字段名的这个字段还得同类型 -- 3)满足以上两个条件的这个字段还必须有相同的值 select * from emp e natural join dept d; -- 查询部门为10的员工完整信息 select * from emp e natural join dept d where e.deptno=10; -- 左连接 left join 右连接 right join -- 左连接和右连接就是在有数据丢失的时候使用 -- 查询所有部门下的所有员工信息 select d.*,e.* from dept d left join emp e on e.deptno=d.deptno; select d.*,e.* from emp e right join dept d on e.deptno=d.deptno; -- 自连接 -- 查询每个员工的员工编号和员工名字和领导编号和领导名字 select e1.empno,e1.ename,e2.empno,e2.ename from emp e1 left join emp e2 on e1.mgr=e2.empno; -- 全连接(mysql没有全连接,只能用其他语法来代替) -- 查询所有员工所有部门的详细信息 select d.*,e.* from emp e right join dept d on e.deptno=d.deptno union select d.*,e.* from emp e left join dept d on e.deptno=d.deptno; -- union union all -- 当两个查询结果的字段数是一致的,则可以使用union或union all语法将两个结果拼接在一起 select * from emp union select * from emp2; select * from emp union all select * from emp2;
子查询
- 理解子查询的关键在于把子查询当作一张表来看待。外层的语句可以把内嵌的子查询返回的结果当成一张表使用。子查询要用括号括起来 将子查询放在比较运算符的右边(增强可读性)
单行子查询
- 子查询返回一行记录
- 使用单行记录比较运算符
= > < >= <= != <>
例子:查询有哪些人的薪水是在整个雇员的平均薪水之上
-- 子查询
-- 单行子查询
-- 查询有哪些人的工资是在整个雇员的平均工资之上
select * from emp;
-- 查询平均工资
select avg(e1.sal) from emp e1;
-- 查询工资在平均工资之上的员工信息
select e2.* from emp e2 where e2.sal>2601;
-- 正确写法
select e2.* from emp e2 where e2.sal>(select avg(e1.sal) from emp e1);
-- 查询工资比ALLEN高的员工信息
-- 查询Allen的工资
select e1.sal from emp e1 where e1.ename="allen";
-- 查询高于ALLEN的员工信息
select e2.* from emp e2 where e2.sal>1600;
select e2.* from emp e2 where e2.sal>(select e1.sal from emp e1 where e1.ename="allen");
多行子查询
- 子查询返回多行行记录
- 使用集合比较运算符 in some all
-- 多行子查询
-- 查询员工信息表中领导的所有员工信息
-- 查询领导的员工编号
select distinct e1.mgr from emp e1 where e1.mgr is not null;
-- 查询哪些员工编号和领导编号匹配
select e2.* from emp e2 where e2.empno in (7902,7698,7839...);
-- 正确写法
select e2.* from emp e2 where e2.empno in (select distinct e1.mgr from emp e1 where e1.mgr is not null);
-- 找出部门编号为20的所有员工中收入最高的职员
select max(e1.sal) from emp e1 where e1.deptno=20;
-- 查找和最高工资匹配的20号部门的那个员工信息
select * from emp;
select e2.* from emp e2 where e2.sal=(select max(e1.sal) from emp e1 where e1.deptno=20) and e2.deptno=20;
-- 查询20号部门的员工工资
select distinct e1.sal from emp e1 where e1.deptno=20;
-- some any all 的使用
-- all
-- 查找20号部门的员工工资比所有员工工资都高或者等于的员工信息
select e2.* from emp e2 where e2.sal>=all(select distinct e1.sal from emp e1 where e1.deptno=20) and e2.deptno=20;
-- 查找20号部门工资不是最低的所有员工的信息
select e2.* from emp e2 where e2.sal>(select min(e1.sal) from emp e1 where e1.deptno=20) and e2.deptno=20;
-- some 和any 作用是一模一样
-- 查找20号部门的所有工资可能性,只要比一个员工的工资高则不是最低工资员工
select e2.* from emp e2 where e2.sal>some(select distinct e1.sal from emp e1 where e1.deptno=20) and e2.deptno=20;
select e2.* from emp e2 where e2.sal>any(select distinct e1.sal from emp e1 where e1.deptno=20) and e2.deptno=20;
MySQL 事务:
一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样.
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作.
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable).
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失