找回密码
 立即注册

推荐阅读

  • 便民服务
  • 关注我们
  • 社区新手
Navicat的使用
#运行方式
#1,直接点击页面的‘运行’按钮
#2,选择sql语句,鼠标右击‘运行已选择的’
-- 注释:也就是不运行的意思
#常见的注释方法
#1,在行首使用 “#”
-- 2,光标在对应的行,按 Ctrl+/ 进行注释,
-- 行首会出现两个“--” 然后可以再按 Ctrl+/ 取消注释
#3,多行注释 使用 /* .....*/
/*.......
.....
kjkjkj
每次新建的查询都是临时的,可以进行保存
只是写一条SQL语句时,可以不用加分号";",
写多条SQL语句同时执行,要加分号";"
*/
新建表:
create table aa(id int(1) PRIMARY key,name char(20)); create table cc(s_id int(1) PRIMARY key,score char(20)); insert into aa(id,name)values(1001,'zhangsan'),(1002,'lisi'); insert into cc(s_id,score)values(1001,'99'); select * from aa; select * from cc;


elect *from aa;
select *from cc;
1,内连接 inner join   对两张表里面的有字段的值是相同,就可以通过内连接进行连接
select * from aa inner join cc on aa.id=cc.s_id;
select * from aa join cc on aa.id=cc.s_id;   #简写,把inner join简写为join
2,左连接 left join   以左边的表为主,显示出完整的左边表,右边的表只出现满足条件的数据
select * from aa left join cc on aa.id=cc.s_id;
3,右连接 right join 以右边的表为主,显示出完整的右边表,左边的表只出现满足条件的数据
select * from aa right join cc on aa.id=cc.s_id;
4,基本连接 对两张表当中有字段的值相同就可以通过基本连接的方法进行连接(结果和内连接没区别,区别在语法上)
select * from aa,cc where aa.id=cc.s_id;
5,机械拼接 union 硬拼接  两张表的字段数量必须一致,因为要做上下拼接
select *from aa union select *from cc;
select *from aa union select name,math from grade;

6,临时表
求张三的成绩
select *from aa;
select *from cc;
select * from aa left join cc on aa.id=cc.s_id   ===>临时表t
select score from (select * from aa left join cc on aa.id=cc.s_id) as t where t.name='zhangsan';
7,嵌套方法 如果嵌套求出的值是一个就可以用‘=’,如果是多个值就要 ‘in’
最好是直接用‘in’
求张三的成绩
先求张三的id:
select id from aa where name ='zhangsan'    ===>得出了一个值 1001
再去cc表求这个id的成绩:
select score from cc where s_id in (select id from aa where name ='zhangsan');
练习题:
求出谁没有参加考试?
1,左连接
select  name from aa left join cc on aa.id=cc.s_id where cc.score is null;
2,嵌套
先求出参加了考试(有成绩的ID)
select s_id from cc
再求不在这个有成绩的ID的范围里面的人
select name from aa where id not in (select s_id from cc)
3,右连接
select name from cc right join aa on aa.id=cc.s_id where cc.score is null;

索引
索引的类型有三种:
1 普通索引
2 唯一索引
3 主键索引:也是主键索引约束 primary
在创建主键约索引束的时候  主键所以同时会被创建成功
主键就是主键约束的一个特征

注意点:1、是在大量数据的前提下才会有明显的查询速度提升
2、不能对一张表的每一个字段都添加所索引,因为如果每一个都添加就会失去了添加索引的意义,而且添加索引也会消耗大量的内存,通常添加索引是添加经常要查询的字段上
3、索引的优先级:主键索引>唯一索引>普通索引
普通索引:index
show tables;
desc emp;
create index aa on emp(name); #给单个字段创建索引
show index from emp;
create index bb on emp(age,dept2);
show index from emp;
alter table emp drop index bb;
#删除索引,直接使用改变表结构的方式进行删除
alter table emp add index bb(age);
#添加普通索引的第二种方式,通过改变表结构的方式进行添加

唯一索引:unique index
create unique index cc on emp(name);   #创建唯一索引的第一方法
show index from emp;
create unique index dd on emp(dept2);  #因为dept2 这一列数据存在重复的情况,使用创建唯一索引失败
alter table emp add unique index cc(name);  #添加唯一索引的第二种方法
alter table emp drop index cc,drop index aa;
#同时删除emp表的多个索引
desc emp;
alter table emp drop primary key;#删除主键约束(删除主键索引)
show index from emp;
alter table emp add primary key(sid);
#添加主键索引(添加主键约束)

视图:view (创建视图,可以理解为比对表的内容进行复制)
select *from emp;
create view dcs as(select name ,incoming from emp);
show tables;  #创建视图 命名为dcs 根据查询emp表的name字段,incoming字段
show table status where comment ='view';
#查看当前库有什么视图,包括实体表和虚表
select * from dcs;
select *from emp;
update dcs set incoming =4100 where name='张三';
视图的优缺点:
优点:信息安全,只展示了先暴露出去的基本信息
缺点:使用视图的时候,其实都是由基本表进行查询出来的结果进行操作,性能差。

show create view dcs;   # 查看视图创建的详细信息
CREATE ALGORITHM=UNDEFINED [url=mailtoEFINER=`root`@`%]DEFINER=`root`@`%[/url]` SQL SECURITY DEFINER VIEW `dcs` AS (select `emp`.`name` AS `name`,`emp`.`incoming` AS `incoming` from `emp`) #
drop view dcs;   # 删除视图
DDL    数据库的定义语言
create  :创建
alter :修改表结构
drop  :删除
DML   数据库的操作语言,对表的数据进行操作
insert into  :插入数据(增)
delete  :删除数据(删)
select  :查询数据(查)
update  :修改数据(改)

mysql的表内约束:
主键约束:primary
非空约束:not null
默认约束:default
自增长约束:auto_lncrement
外键约束 也叫外码:
外键约束,约束的是表跟表的关系
1,创建两张表 dcs1和dcs2
2、在设计表的时候给dcs1表加一个外键,这个外键加在dcs2表中的sid字段上,那么dcs1 表就是主表(父表),dcs2 表就是从表(子表)
3、创建主表dcs1
create table dcs1 (id int(4) primary key,name varchar(20)) engine
=innodb;
4、创建dca2表,同时加上外键
create table dcs2(sid int(4) primary key,sname varchar(20),constraint fksid foreign key(sid) references dcs1(id)) engine=innodb;   #创建表dcs2 包含sid类型为int(4)为主键,包含字段sname类型为varchar(20),创建创建约束 命名为fksid 外键约束自定义在sid字段,引用(来自于)dcs1表中id字段,数据引擎为innodb

dcs1   主表(父表)
dcs2   从表(子表)
constraint fksid  :约束命名为fksid
foreign key :外键约束
references dcs1(id) :引用的是dcs1表的id字段

foreign key(sid): 外键约束要加在sid这个字段上面
show create table dcs2;  #展示dcs2表的建表语句
CREATE TABLE `dcs2` (
  `sid` int(4) NOT NULL,
  `sname` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`sid`),
  CONSTRAINT `fksid` FOREIGN KEY (`sid`) REFERENCES `dcs1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
select * from dcs1;
select * from dcs2;
insert into dcs1 values(1,'xiaowang'),(2,'xiaoliao'); #可以直接对主表进行数据的插入
#但是对子表插入数据的时候,要求主表外键引用的字段必须要有对应的值,要不然就宝外键的错误
insert into dcs2 values(1,'laowang'),(3,'laoliao')
#会报错,因为主表的id字段没有3这个值
insert into dcs2 values(1,'laowang');
#插入成功,因为主表的id字段有1这个值
delete from dcs1 where id=1;
#会报错,因为子表的sid字段有1这个值
update dcs1 set id=2 where name='xiaowang';
#会报错,因为父表name='xiaowang'对应的id为,且子表的sid字段有1 这个值

结论:
1,对子表进行insert into,update操作,父表中没有的外键值,那么执行会报错,如果父表中存在则可以进行新增和修改的操作
2,对父表进行delete,update 操作,如果操作的字段在子表中被引用没那么操作失败,没有被引用就可以直接删除和修改
alter table dcs2 drop foreign key fksid;
#删除子表中定义的外键

分享至 : QQ空间
收藏
您需要登录后才可以回帖 登录 | 立即注册