MySql学习
1 软件
(1) 关闭
net stop mysql80
(2) 启动
net start mysql80
(3) 版本信息
status
(4) 退出数据库
exit;
2 数据类型
(1) 数值
int,float,double,decimal
(2) 字符
char(位数), varchar(位数)
(3) 时间
YEAR YYYY
TIME HH:MM:SS
DATE YYYY-MM-DD
DATETIME YYYY-MM-DD HH:MM:SS
TIMESTAMPI YYYY-MM-DD HH:MM:SS
(4) 二进制
bit(位数),binary(位数),varbinary(位数)
3 数据库
(1) 登陆数据库
mysql -uroot -p
(2) 选中数据库
use 库名;
(3) 创建数据库
create database if not exists 库名
character set 字符集
collate 校对规则;
(4) 删除数据库
drop database if exists 库名;
(5) 修改数据可的编码
alter database 库名
character set 字符集
collate 校对规则;
(6) 查询数据库
show databases like ‘%库名%’;
(7) 查询数据库信息
show create database 库名;
(8) 查询所有编码
show character set;
(9) 查询当前使用的数据库
select database ();
4 数据表
(1) 创建数据表
create table 表名(字段 类型,字段 类型);
(2) 删除数据表
drop table if exists 表名;
(3) 删除数据
delete from表名where 字段=值;
(4) 插入数据
insert into 表名 value(值,值);
/* VARCHAR DATETIME加引号"",空字段为NULL。 */
insert into 表名(字段)value (值);
(5) 修改数据
update 表名 set 字段=值 where 字段=值;
update 表名 set 字段=值;
/* 对该字段以该值进行填充 */
(6) 增加字段
alter table 表名 add 字段 类型;
(7) 修改字类型
alter table 表名 modify 字段 类型;
(8) 删除字段
alter table 表名 drop 字段 类型;
(9) 修改字段名
alter table 表名 change 旧字段 新字段 新类型;
(10) 修改表名
alter table 表名 rename 表名;
(11) 修改字符集,校对规则
alter table 表名 convert to 字符集 校对规则;
(12) 修改数据引擎
alter table 表名 engine 数据引擎;
(13) 查询数据表
show tables;
(14) 查询数据表信息
show create table 表名;
(15) 查看数据表结构
desc/describe 表名;
(16) 查看数据表
select * from 表名;
select * from 表名 where 字段 =/>/< …;
5 约束
(1) 主键约束
约束字段不重复,不可为空。
<1> 建表时添加主键约束
create table 表名(字段 类型 primary key,字段 类型);
create table 表名(字段 类型,字段 类型,primary key(字段,字段));
<2> 建表后添加主键约束
alter table 表名 add primary key(字段);
<3> 删除主键约束
alter table 表名 drop primary key;
<4> 修改字段添加主键约束
alter table 表名 modify 字段 类型 primary key;
(2) 自增约束
插入其余部分,约束部分自动加一。
create table 表名(字段 类型 primary key auto_increment,字段 类型);
(3) 唯一约束
插入字段不可重复,可为空。
<1> 建表时添加唯一约束
create table 表名(字段 类型,字段 类型 unique);
create table 表名(字段 类型,字段 类型,unique(字段));
create table 表名(字段 类型,字段 类型,unique(字段,字段));
<2> 建表后添加唯一约束
alter table 表名 add unique(字段);
<3> 删除唯一约束
alter table 表名 drop index 字段;
<4> 修改字段添加唯一约束
alter table 表名 modify 字段 类型 unique;
(4) 非空约束
约束字段不可为空。
create table 表名(字段 类型,字段 类型 not null);
(5) 默认约束
插入字段值,未传值,使用默认值。
create table 表名(字段 类型,字段 类型 default 默认值);
alter table 表名 change 字段 字段 类型 约束;
(6) 外键约束
主表没有的值,副表不可用。主表中被引用的部分,不可删除。
create table 表名(字段 类型,字段 类型 foreign key(字段) references 表名(字段));
(7) 总结
<1> 建表时约束
create table 表名(字段 类型,字段 类型 约束);
create table 表名(字段 类型,字段 类型,约束(字段));
<2> 建表后约束
alter table 表名 add 约束(字段);
<3> 删除约束
alter table 表名 drop 约束;
<4> 改字段约束
alter table 表名 modify 字段 类型 约束;
6 数据表设计
(1) 第一范式:表中所有字段都是不可分割的原子值。
(2) 第二范式:副键依赖于全部主键。
若不满足:拆表
(3) 第三范式:副键之间不能有传递依赖关系。
若不满足:拆表
7 查询
(1) 查询所有记录
select * from 表名;
(2) 查询特定字段记录
select 字段1,字段2 from 表名;
(3) 查询不重复的特定字段记录
select distinct 字段 from 表名;
(4) 查询某字段为某范围的记录
select * from 表名 where 字段 between 范围 and 范围;
/* between and的两个范围不能颠倒 */
/* where只能筛选表中已有的字段,不可过滤别名,不能过滤表中没有的字段,不能使用聚合函数 */
/* where筛选时,自上而下,每行分别以当前字段中的具体值执行where后语句。 */
或
select * from 表名 where 字段1>范围 and 字段1<范围;
(5) 查询某字段为某几个值的记录
select * from 表名 where 字段 in (值,值);
/* 单个值用+,多个值用in */
(6) 查询某两个字段为某值的记录
select * from 表名 where 字段1=值 or 字段2=值;
(7) 以某字段升序查询数据表所有记录
select * from 表名 order by 字段 asc;
或
select * from 表名 order by 字段;
(8) 以某字段降序查询数据表所有记录
select * from 表名 order by 字段 desc;
(9) 以某字段升序查询,相同记录以另一字段降序查数据表所有记录
select * from 表名 order by 字段1 asc,字段2 desc;
(10) 查询某字段为特定值的记录数量
select count(*) from 表名 where 字段=值;
/* count(*)表示记录的条数,count(字段)表示字段有相同值的记录条数。 */
/* 聚合函数和where同时使用,select后面只能加where限制的字段和聚合函数 */
(11) 查询某字段中的最大值
select Max(字段) from 表名;
(12) 查询某字段最大值所在记录中的其他字段
select 字段1,字段2 from 表名 where 字段3=(select max(字段3)from 表名);
或
select 字段1,字段2 from 表名 order by 字段3 desc limit 0, 1;
/* limit x,y 指输出从x条开始到y条的记录 */
(13) 查询某字段为特定值的记录的另一字段平均值
select avg(字段1)from 表名 where 字段2=值;
***分组计算平均数
select avg(字段1)from 表名 group by 字段2;
/* group by:通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。 */
/* 一旦group by,select后面只能加group by后面的字段或者聚合函数 */
select round(avg(字段1))from 表名 group by 字段2;
/* round()表示对值四舍五入,round(值,1)表示保留一位小数 */
(14) 查询某字段某值数量大于2且某字段值3开头另一字段平均数
select avg(字段1) from 表名 group by 字段2 having count(字段2)>2 and 字段2 like '3%';
/* having筛选过滤后的记录,可过滤别名,可以使用聚合函数 */
/* 这里count(字段)是对组进行筛选,like是对记录进行筛选。 */
模糊查询:like
***“ % ”代表0个或多个任意字符,“ _ ”代表单个的任意字符。
结合23 not like
(15) 多表查询
select 表名1.字段1,表名2.字段2 from 表名1,表名2 where 表名1.共有字段=表名2.共有字段;
/* 此时不能selectwhere后面的字段 */
/* 两个表通过表1和表2的共有字段链接起来,只要select表1中字段1,字段1所在记录中的共有字段若等于某个表2的共有字段,
,就输出表2该共有字段所在记录中的字段2。 */
select 表名1.字段1,表名2.字段2 from 表名1,表名2 where 字段3 between 字段4 and 字段5;
/* where后也可用<、>、=、=! */
/* 两个表通过表1的字段3和表2的字段4和字段5链接起来,只要select表1中字段1,字段1所在记录中的字段3若在某个表2的字段4和字段5之间,
,就输出表2中字段4和字段5所在记录中的字段2。 */
select 表名1.字段1,表名2.字段2,表名3.字段3 from 表名1,表名2,表名3 where 表名1.共有字段=表名2.共有字段,表名2.共有字段=表名3.共有字段;
(16) 查询某年份字段相同值的其他记录
select * from 表名 where year(字段)=值;
/* year(字段) 表示提取年份。 */
*(17) 查询某字段中没有某值的记录
select * from 表名 where 字段 not in(值,值);
/* in是去掉不相同部分,保留交集部分;not in是减去交集部分,保留不相关的部分。 */
(18) 链接两条语句(即合并为一个表格返回记录)
语句 union 语句;
/* 若链接的两条语句的字段名不相同,须为每个字段用as设置别名。 */
*(19) 查询某字段大于另一字段至少一个值的记录
select * from 表名 where 字段 > any(字段或语句);
/* 大于最小值 */
*(20) 查询某字段大于另一字段所有值的记录
select * from 表名 where 字段 > all(字段或语句);
/* 大于最大值 */
(21) 查询某字段不含某部分值的记录
select * from 表名 where 字段 not like ‘值%’;
(22) 查询年龄通过出生日期
select 字段,year(now())-year(birthday) as age from 表名;
/* year(now())提取当前年份 */
(23) 查询某字段最大值和最小值
select max(字段) as max,min(字段) as min from 表名;
*(24) 自身连接(复制数据表作条件查询):查询某字段比该字段平均值高的记录
select * from 表名 as a where 字段1 >(select avg(字段1) from 表名 as b where a.字段2=b.字段2);
/* 相当于将原表设置一个别名a,再复制一个该表,并设置别名b。 */
/* where筛选时,自上而下,每行分别以当前字段中的具体值执行where后语句。所以a.字段是一个a表中的当前字段具体值。 */
(25) 判定一个表达式的值是否为空值
select * from 表名 where 字段 is null;
*(26) 统计数据表中男女生人数,及姓名
select 性别, count(*) as ‘人数’,group_concat(姓名) from 表名 group by 性别;
/* group_concat()将该字段的值用逗号依次连接成一个值,否则只会显示第一个值 */
*(27) 查询数据表某种字段不同值的数量
select count(distinct 学号) from 表名;
(26) 查询结果保存
如果用来保存的表存在:insert into 表名1 select * from 表名2;
/* select后是要保存的内容 */
如果用来保存的表不存在:create table as 表名1 select * from 表名2;
/* select后是要保存的内容 */
(27) MySQL REGEXP:正则表达式查询
select * from 表名 where 字段 not regexp/regexp "正则表达式";
/*若要匹配多个字符串,则多个字符串之间使用分隔符“|”隔开。*/
(28) 连接查询
select * from 表名1 连接名 表名2 on 表名1.字段=表名2.字段 where ...... ;
/* 不唯一字段要:表名.字段名 唯一字段:字段名 某表全部字段:表名.* */
<1> 内连接
inner join 或 join(交集:保留两个表中都有各自对应内容的非空记录。)
<2> 外连接
左外连接left join 或 left outer join(左+交集:保留连接左边全部信息,保留右边有交集的信息。)
右外连接right join 或 right outer join(右+交集:保留连接右边全部信息,保留左边有交集的信息。)
完全外连接full join 或 full outer join(左+右+交集:保留连接两侧全部信息)
<3> mysql不支持full join,实现:
select * from 表名1 left join 表名2 on 表名1.字段=表名2.字段
union
select * from 表名1 right join 表名2 on 表名1.字段=表名2.字段;
(29) 执行顺序
<1> from 对查询指定的表计算笛卡尔积
<2> on 按照 join_condition 过滤数据
<3> join 添加关联外部表数据
<4> where 按照where_condition过滤数据
<5> group by 进行分组操作
<6> having 按照having_condition过滤数据
<7> select 选择指定的列
<8> distinct 指定列去重
<9> order by 按照order_by_condition排序
<10> limit 取出指定记录量
(30) 视图
<1> 创建视图
create view 视图名 as SELECT语句;
create or replace view 视图名 (别名) as SELECT语句;
/* or replace表示视图已经存在,就替换 */
<2> 查看视图中的数据
select * from 视图名;
<3> 查看视图结构
desc 视图名;
<4> 视图修改(增删字段)
create or replace view 视图名 (别名) as SELECT语句;
alter view 视图名 (别名) as SELECT语句;
<5> 视图更新
update 视图名 set 字段1=值 where 字段2=值;
delete from 视图名 where 字段=值;
<6> 视图的删除
drop view if exists 视图名;
8 事务
(1) mysql是否事务自动提交:
select @@autocommit;
(2) 事务手动提交:
set autocommit=0;
(3) 事务自动提交:
set autocommit=1;
(4) 事务手动开启:
begin;/start transaction;
语句1;
语句2;
(5) 事务回滚(撤销未自动提交的语句):
rollback;
(6) 事务提交:
commit;
(7) 事务四大特征
A原子性
C一致性
I隔离性
D持久性
(8) 事务的隔离性:
read uncommitted;读未提交的(脏读:事务1与事务2同时操作一张表,事务1读到事务2未提交的数据)
read committed;读已提交的(不可重复读现象:事务1与事务2同时操作一张表,事务1修改数据表,导致事务2查表时前后不一致)
repeatable read;可以重复读(幻读:事务1与事务2同时操作一张表,事务1提交的数据,事务2读不到)
serializable;串行化:当数据表被一个事务写操作时,其他事务不可进行写操作,进入排队状态,直到当前写操作完成(性能太差)
(9) 查看隔离级别:
<1> 8.0版本
系统级别
select @@global.transaction_isolation;
会话级别
select @@transaction_isolation;
<2> 5.0版本
系统级别
select @@global.tx_isolation;
会话级别
select @@tx_isolation;
(10) 修改系统隔离级别
set global transaction isolation level 隔离级别;

浙公网安备 33010602011771号