MYSQL 基本语法

create table t4(
dt datetime,
y year,
d date,
t time,
ts timestamp
);

create table t6(
c1 char,
v1 varchar(1),
c2 char(8),
v2 varchar(8)
);

create tables t8(
id int,
name char(18),
gender enum('male','female')
);

create table t9(
id int,
name char(18),
hobby set('抽烟','喝酒','烫头','洗脚','按摩')
);
insert into t9 values(1,'alex','烫头,喝酒');
insert into t9 values(2,'大壮','洗脚,按摩,打游戏');

数据的

增 #insert into 表 values(值)

#insert into 表(字段1,字段2) values(值1,值2)
#insert into 表(字段1,字段2) select 字段1,字段2 from 表2 

删 #delete from 表 where 条件;

#truncate table 表名;

改 #update 表 set 字段=值 where 条件;

查 #select 字段 from 表

      #where 条件
      #group by 分组
      #having 过滤条件 
      #order by 排序
      #limit m,n 取从m+1开始的前n条
 #扩展

完成性约束###

#无符号 int unsigned
#不能为空 not null
#默认值 default
#唯一约束unique
	#联合唯一 unique(字段1,字段2)	
#主键 primary key
	#联合主键primary key(字段1,字段2)
#自增 auto_increment,

set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

create table t1(
id int unsigned not null,
name char(18) not null
);

联合唯一 unique

create table t2(
id1 int unique,
id2 int
);

create table t3(
id int,
server_name char(12),
ip char(15),
port int(5),
unique(ip,port) #禁止插入都重复的ip+port
);

insert into t3 values(1,'ftp','192.168.14.2','3306');

非空 + 唯一约束

第一个被定义为非空+唯一的那一列会成为这张表的primary key (主键)

一张表只能定义一个主键

create table t4(
id int not null unique,
username char(18) not null unique
);
desc t4;

create table t5(
username char(18) not null unique,
id int primary key
);

联合主键

create table t6(
id int,
server_name char(12),
ip char(15),
port char(5),
primary key(ip,port)
);

create table t7(
id int,
server_name char(12),
ip char(15) not null,
port char(5) not null,
primary key(ip,port)
);

create table t8(
id int,
server_name char(12),
ip char(15) not null,
port char(5) not null,
unique(ip,port)
);

自增 auto_increment

create table t10(
id int unique auto_increment,
name char(12)
);

create table t11(
id int primary key auto_increment,
name char(12)
);
insert into t11(name) values('大庄');

外键 foreign key

关联表 foreign key(id) references 表名(id)

级联更新 on update cascade

级联删除 on delete cascade

学生表

create table student(
id int primary key auto_increment,
name char(12) not null,
gender enum('male','female') default 'male',
class_id int ,
foreign key(class_id) references class(cid)
);

班级表

create table class(
cid int primary key auto_increment,
cname char(12) not null,
startd date
);
insert into class values(1,'py1','2019-3-6');
insert into student values(1,'male','流向',1);
update class set id=2 where id=1; #无法修改,因为student表中1已经有人了

create table student2(
id int primary key auto_increment,
name char(12) not null,
gender enum('male','female') default 'male',
class_id int,
foreign key (class_id) references class(cid) on update cascade on delete cascade #提联更新
);

修改表

修改表名 alter table t1 rename t20;

增加字段 alter table t1 add birthday date not null;

删除字段 alter table t1 drop birthday;

修改字段 alter table t1 modify name char(15) not null;

 alter table t1 change name cname char(14) not null;

alter处理null和unique约束

去掉null约束 alter table t1 modify name char(18) null;

添加null约束 alter table t1 modify name char(18) not null;

去掉unique约束 alter table t1 drop index id;

添加unique约束 alter table t1 modify id int unique;

删除主键 alter table table_test drop primary key;

增加主键 alter table table_rest add primary key(id); #增加主键前需删除重复的id

添加外键 alter table book add constraint fk_id foreign key(press_id) references press(id);

删除外键 alter table book drop foreign key fk_id;

tables associate project

create table class (
cid int unique auto_increment,
caption char(8) unique
);
create table student (
sid int unique auto_increment,
sname char(4),
gender enum('男','女'),
class_id int ,
foreign key(class_id) references class(cid)
);
create table teacher(
tid int unique auto_increment,
tname char(8)
);
create table course(
cid int unique auto_increment,
cname char(4),
teacher_id int,
foreign key(teacher_id) references teacher(tid)
);
create table score (
sid int unique auto_increment,
student_id int,
corse_id int,
number int,
foreign key(student_id) references student(sid),
foreign key(corse_id) references course(cid)
);
insert into class(caption) values('三年二班');
insert into class(caption) values('一年三班');
insert into class(caption) values('三年一班');
insert into student(sname,gender,class_id) values('张里','男',1),('刘金','女',1),('李玉','女',2);
insert into teacher(tname) values('刘是'),('黎明'),('四季');
insert into course(cname,teacher_id) values('生物',1),('体育',1),('物理',2);
insert into score(student_id,corse_id,number) values(1,1,60),(1,2,58),(2,2,100);

day39:

delete from 表; 自增数据不会回到初始(是不会清空自增字段offset(偏移量)值
truncate table 表; 会清空表和自增字段的偏移量
delete from 表 where 条件 ;

update 表

create table t1(
id int primary key auto_increment,
username char(12) not null,
sex enum('male','female') default 'male',
hobby set('上课','写作业','考试') not null
);
insert into t1 values(1,'李级','male','上课,写作业'),(2,'刘彪','male','考试'),(3,'杨党','female','上课');
insert into t2(id,name) select id,username from t1;
update t1 set id=1,hobby='考试,写作业' where id=2;

创建一个公司成员表

create table company(
id int primary key auto_increment,
name char(12) not null,
age int,
post char(18),
salary int,
QQ char(12)
);
insert into company(name,age,post,salary,QQ) values('小明',19,'店长',38000,'123585'),('刘兴',21,'厨师长',20000,'154854'),('姬性差',25,'会计',18000,'456788'),('李丁',17,'洗碗工',8000,'455885'),('李绘',17,'洗碗工',8000,'355785'),('吴兴山',27,'厨师',16000,'124578'),('吴旺山',27,'厨师',16000,'154568'),('赵晶',17,'副店长',25000,'123355'),('刘民',19,'服务员',9000,'125225'),('胡老千',26,'服务员',9000,'1244565'),('林北',19,'服务员',9000,'1244547');

select 查询

select id as num,username as name from t1;

函数

concat 连接字符串(任一为空结果为空)

select concat('aaa','bbb','ccc');
select concat(id,':',username) from t1;
select concat_ws('|','alex','3714','84'); #concat_ws加上拼接符|

select (
case
when username = 'all' then username
when username = 'alll' then concat(username,'sb')
else concat(username,'lb')
end)
as name
from t1;

使用逻辑运算符

#case when语句 相当于 if条件判断句

where 筛选所有符合条件的行

#比较运算符
     #> < >= <= != =
#范围
     # between 100 and 200     100~200
     # in(100,200)                      100或200
#模糊匹配
   #like
     #like 'j%'      以j开头 用%表示任意长度的任意内容
     #like '成_'     _表示长度为一个的任意字符
   #regexp
     #   '^a'
     #   'g$'
#逻辑运算
     #not   and   or
判断是否为空用is

分组 group by

聚合函数

#count  求个数   
#max    求最大值
#min    求最小值
#sum   求和
#avg    求平均  select post,avg(salary) from employee group by post;

select post,name from company group by post;

select post,group_concat(name) from company group by post;

select post,count(post) from company group by post;

select sex,count(sex) from company group by sex;

select post,avg(salary) from company group by post;

select post,max(salary) from company group by post;

select post,min(salary) from company group by post;

select sex,avg(salary) from company group by sex;

having 过滤语句

#在having语句中可以使用聚合函数,在where中不行
#适合去筛选符合条件的某一组数据,而不是某一行数据
#先分组再过滤:求平均薪资大鱼xx的部门,求人数大于xx的性别,求大于xx人的年龄段
 #查询各岗位内包含的员工个数大于2的岗位名,岗位内包含员工名字,个数
 select post,group_concat(name),count(id) from company group by post having count(id) >= 2;

having在order by 和limit之前

order by 默认升序排列

select * from company order by salary;
select * from company order by salary asc;
select * from company order by salary desc;

limit m,n m默认为0

select * from company order by salary desc limit 1;
select * from company order by salary desc limit 3; 取三条
select * from company order by salary desc limit 2,1; 从第三条开始取一条

limit n offset n; select * from company order by salary desc limit 3 offset 1;

select name,sex,age,QQ from company where sex='female' order by salary desc limit 1;

连表查询

create table department(id int,name varchar(20));
create table employee(id int primary key auto_increment,name varchar(20),sex enum('male','female') not null default 'male',age int,dep_id int);
insert into department values(200,'技术'),(201,'人力资源'),(202,'销售'),(203,'运营');
insert into employee(name,sex,age,dep_id) values('egon','male',18,200),('alex','female',48,201),('wupeiqi','male',38,201),('yuanhao','female',28,202),('liwenzhou','female',18,200),('jingliyang','female',18,204);
select * from department,employee;
select * from department,employee where department.id=dep_id;

所谓连表

 #总是在连接的时候创建一张大表,里面存放的是两张表的笛卡尔积
 #再根据条件进行筛选就可以了

表与表之间的连接方式

 #select * from 表1,表2 where 条件;

内连接 inner join ... on ... 只显示两者均满足要求的数据

 #select * from 表1 inner join 表2 on 条件;
 #select * from department inner join employee on department.id = employee.dep_id;
 #select * from department as t1 inner join employee as t2 on t1.id = t2.dep_id;
 select * from department as t1 inner join employee as t2 on t1.id = t2.dep_id where t1.name='人力资源';

外连接 可选择连接的一方全部的数据,左连接显示全部前者数据,右连接显示全部右表数据

 #左外连接 left join ... on ...
#select * from 表1 left join 表2 on 条件
#select * from department as t1 left join employee as t2 on t1.id = t2.dep_id;
 #右外连接 right join ... on ...
#select * from 表1 right join 表2 on 条件
#select * from department as t1 right join employee as t2 on t1.id = t2.dep_id;
 #全外连接 full join
select * from department as t1 left join employee as t2 on t1.id = t2.dep_id
            union
select * from department as t1 right join employee as t2 on t1.id = t2.dep_id;
#select * from department left join employee on department.id=employee.dep_id
#union
#select * from department right join employee on department.id = employee.dep_id;
select * from department as t1 left join employee as t2 on t1.id=t2.dep_id where t1.id<202;
select * from department as t1 left join employee as t2 on t1.id=t2.dep_id order by age;
select t1.name,count(t1.id),count(t2.id) from department as t1 left join employee as t2 on t1.id=t2.dep_id order by t1.name;
select t1.name,count(t1.id),count(t2.id) from department as t1 left join employee as t2 on t1.id=t2.dep_id group by t1.name;
select t1.name,count(t1.id),count(t2.id) from department as t1 left join employee as t2 on t1.id=t2.dep_id group by t1.name order by count(t1.id) desc;

所谓连表就是把两张表连接在一起之后,就变成了一张大表,从from开始一直到on条件结束就看做一张表

之后where条件group by 分组 order by limit 都正常使用就可以了

查询平均年龄在25岁以上的部门名

select department.id,department.name from employee inner join department on department.id=employee.dep_id group by employee.dep_id having avg(employee.age) < 25;
select * from department where id in (select dep_id from employee group by dep_id having avg(age)>25);
select group_concat(department.name) from employee inner join department on department.id=employee.dep_id group by employee.dep_id having avg(employee.age) > 25;

查询技术部员工姓名

先查询技术部的部门id select name from employee where dep_id in (select id from department where name='技术');

再根据这个部门id找到对应的员工名

  select name from employee where dep_id = (select id from department where name = '技术');

查看不足1人的部门名 #distinct 去重

  select name,num from (select department.name as name,count(employee.id) as num from department left join employee on department.id=employee.dep_id group by department.name) as t1 where num<1; 
  select * from department where id not in (select distinct dep_id from employee);

查询大于所有人平均年龄的员工名与年龄

  select name,age from employee where age> (select avg(age) from employee);

查询大于部门内平均年龄的员工名,年龄

  select name ,age from employee inner join (select employee.dep_id as dep_name,avg(employee.age) as avg_age from employee inner join department on department.id = employee.dep_id group by employee.dep_id) as t1 on t1.dep_name = employee.dep_id  where employee.age>t1.avg_age ;

索引

新的数据结构--树

mysql中存储数据的两种方式

#聚集索引
#非聚集索引

索引的创建与删除

#创建主键 primary key 聚集索引 + 非空 + 唯一
#创建唯一约束 unique 辅助索引 + 唯一
#添加一个普通索引
#创建    create index 索引名 on 表(字段);    create index ind_id on si(id);
#删除    drop index 索引名 on 表;
#知道用了它会加快查询速度

正确使用索引

1,查询的条件字段不能是索引字段

#对哪一个字段创建了索引,就不能用这个字段做条件查询

2.在创建索引的时候应该对区分度比较大的列进行创建

#1/10以下的重复率比较适合创建索引

3.范围

#范围越大越慢,范围越小越快
#like 'a%' 快
#like '%a' 慢

4.按条件参与计算

5.and和or

#id name
#select * from company where id=5 and sex = 'female';   and 快
#select * from company where id=5 or sex='female';       or 慢
#多个条件的组合,如果使用and连接
     #其中一列含有索引,都可以加快查找速度
#如果使用or连接
    #必须所有的列都含有索引,才能加快查找速度

6.联合索引 : 最左侧原则(必须带着最左边的列做条件,从出现范围开始索引失效)

#select * from s1 where id = 18000 and name='eva' and emial='123456789';

索引

root 根节点

branch 分支节点

leaf 叶子节点

父子节点

二叉树

平衡树(btree) 能够让查找某一个值精力速度尽量平衡

#balance tree

平衡树不一定是二叉树

为什么不用二叉树

b+树

#b是balance 平衡的意思
    #为了保证没一个数据查找经历的IO
#分支节点不存储数据--让树的高度尽量矮,让查找一个数据的效率尽量稳定
#在所有椰子结点之间加入了双向的地址链接--查找范围非常快

两种索引的差别

聚集索引,聚簇索引

Innodb 必有且仅有一个

非聚集(簇)索引,辅助索引

innodb

myisam

innodb存储引擎中的 主键默认会创建一个聚集索引

备份库

#备份 
mysqldump -uroot -p123456 -h127.0.0.1 test1 > D:\mysql\sql\tmp.sql
#数据库的恢复
 source D:\mysql\sql\tmp.sql

学习路上不容易,但我们也要一起挥洒汗水,一起加油,一起努力!

posted @ 2021-04-11 21:38  S-Love  阅读(69)  评论(0)    收藏  举报