MySQL基础知识

一、Mysql之表操作:

一、数据库
	//1.创建数据库
	create database [if not exists] db_name [character set xxx];
	
二、表
	//1.创建表
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	name varchar(25),
	gender boolean,
	age int(11),
	depart varchar(20),
	salary double(7,2)
);
	//2.查看表信息
    desc tab_name 查看表结构
    show tables 查看当前数据库中的所有的表
    show create table tab_name    查看当前数据库表建表语句 
	
	//3.修改表结构
   (1)增加一列
      alter table tab_name add [column] 列名 类型;
   (2)修改一列类型
      alter table tab_name modify 列名 类型;
   (3)修改列名
      alter table tab_name change [column] 列名 新列名 类型;
   (4)删除一列
      alter table tab_name drop [column] 列名;
   (5)修改表名
      rename table 表名 to 新表名;
   (6)修该表所用的字符集    
      alter table student character set utf8;


三、表记录
    //1.增加一条记录insert
INSERT INTO emp (id,name,gender,age,depart,salary)
	values (1,"alex",0,18,"技术部",8000);
INSERT INTO emp values("ray",0,18,"技术部",8000);
INSERT INTO emp set name="张三",salary=3000;


	//2.修改表记录
UPDATE emp SET salary=salary+1000,depart="经理" where name="ray";


	//3.删除表操作
DELETE FROM emp where name="张三";
	//删除表中所有记录,清空记录的操作。
delete from emp;
    //使用truncate删除表,是把整个表摧毁,然后再创建一个新表(这种用法在于数据很多的时候,不需要一条一条删除)。
truncate table emp;


	//4.查找
CREATE TABLE ExamResult(
	id INT PRIMARY KEY auto_increment,
	name VARCHAR(20),
	JS DOUBLE,
	Django DOUBLE,
	Flask DOUBLE
);
    //查询表中所有学生的姓名和对应的英语成绩。
    select name,JS from ExamResult;
	//过滤表中重复数据。
    select distinct name from ExamResult;
	//在所有学生分数上加10分特长分显示。(数据库不增加)
    select name,JS+10,Django+10,Flask+10 from ExamResult;
	//取别名查。
	select name as "姓名" from ExamResult;
//过滤查询where字句中可以使用:
    //比较运算符:    > < >= <= <>  
    between 10 and 20 值在10到20之间  
    in(10,20,3)值是10或20或30
    like '张pattern' 
    pattern可以是%或者_,
    如果是%则表示任意多字符,张*
	//查找缺考JS的学生的姓名
    select name from ExamResult where JS is null;
	
	
	//5.Order by排序,排序的列即可是表中的列名,也可以是select 语句后指定的别名。
	// Asc 升序、Desc 降序,其中asc为默认值
	select * from ExamResult order by JS asc;
	//按总成绩排
	select name,(ifnull(JS,0)+ifnull(Django,0)+ifnull(Flask,0)) as "总成绩" from ExamResult order by "总成绩";
	
	
	//6.聚合函数count(列名)\sum(列名)\AVG(列名)\Max(列名)\Min(列名)
	//查找多少学生
	select count(*) from ExamResult;
	//统计数学成绩大于70的学生有多少个?
    select count(JS) from ExamResult where JS>70;
	//统计一个班级JS成绩平均分
    select sum(JS)/count(*) from ExamResult;
	//求一个班级JS平均分?先查出所有的JS分,然后用avg包上。
	select avg(ifnull(JS,0)) from ExamResult;
	//求班级最高分和最低分(数值范围在统计中特别有用)
    select Max((ifnull(JS,0)+ifnull(Django,0)+ifnull(Flask,0))) from ExamResult;
    select Min((ifnull(JS,0)+ifnull(Django,0)+ifnull(Flask,0))) from ExamResult;
null加上什么数都为null,(ifnull(JS,0))的意思是如果是null转化为0
	
	
	7.group by分组,where语句只能用在分组之前的筛选,having可以用在分组之后的筛选;
	//按名字分组,查每组JS的和
	select name,sum(JS) from examresult group by name;
	//按名字分组,查每组JS的总和大于100的
	select name,sum(JS) from examresult group by name having sum(JS) > 100;
	
	8.限制查询记录
	select * from examresult limit 2;
	select * from examresult limit 1,3;	(查询索引1到3)
	
	9.正则
	select * from examresult where name regexp '^al';
	select * from examresult where name regexp 'lv$';
	

  

二、多表查询之外键查询

create table lesson.classcharger(
	id int primary key auto_increment,
	name varchar(20),
	age int,
	is_marriged tinyint
);
create table student1(
	id int primary key auto_increment,
	name varchar(20),
	charger_id int,
	foreign key (charger_id) references classcharger(id)
)ENGINE=INNODB;
外键和主键的类型要一致。

insert into classcharger (name,age,is_marriged) values ('张三',28,0),
('李四',30,0),('小红',32,0),('小明',40,0);
insert into student1 (name,charger_id) values ('ray1',2),
('ray2',4),('ray3',1),('ray4',3),('ray5',1),('ray6',2);

//(1)增加外键:
    可以明确指定外键的名称,如果不指定外键的名称,mysql会自动为你创建一个外键名称。
									  取别名
	alter table student add constraint FK_st 
									foreign key(charger_id) 
									references classcharger(id);
   (2)删除外键:
	alter table student drop foreign key FK_st;(别名)
	
	
//INNODB支持的ON语句,约束删除父表记录所带来子表的影响。
	//on delete cascade子表的内容也跟着父表删除
	alter table ss add constraint fk_cid_cc
									foreign key(charger_id)
									references cc(id) on delete cascade;
	//on delete set null子表的内容设置为null
	alter table ss add constraint fk_cid_cc
									foreign key(charger_id)
									references cc(id) on delete set null;
	  

 

三、多表查询之连接查询

create table employee (id int primary key,
                name varchar(20),
                tb_id int);
create table dpm (id int primary key,department varchar(20) );

insert into employee values (1,'刘备',1);
insert into employee values (2,'关羽',2);
insert into employee values (3,'张飞',3);
				
insert into dpm values(1,'财务部');
insert into dpm values(2,'人事部');
insert into dpm values(3,'科技部');
        

1.笛卡尔积查询:两张表中一条一条对应的记录,m条记录和n条记录查询,最后得到m*n条记录,其中很多错误数据
    select * from employee ,dpm;

2.内连接
	select employee.name,dpm.department from employee,dpm where employee.tb_id=dpm.id;
	select * from employee inner join dpm on employee.tb_id = dpm.id;
3.外连接:左外、右外
	左外连接:显示左表全部信息
	select employee.name,dpm.department from employee LEFT JOIN dpm on employee.tb_id=dpm.id;
	右外连接:显示右表全部信息
	select employee.name,dpm.department from employee RIGHT JOIN dpm on employee.tb_id=dpm.id;

  

四、多表查询之子查询

--子查询是将一个查询语句嵌套在另一个查询语句中。
--内层查询语句的查询结果可以为外层查询语句提供查询条件。
--子查询中包含:IN,NOT IN,ANY,ALL,EXISTS,NOT EXISTS
--还有比较运算符:=,!=,>,<等

1.查询employee表,当id必须在部门表中出现过。
	select * from employee where id IN (select id from department);
	
2.用EXISTS(返回true或false)
	select * from employee where exists (select id from department where id=2);
	

  

五、索引

--索引提高搜索时间,提高用户体验
--primary key和unique就是索引,唯一性。
--index|key普通索引可重复

1.普通索引index|key
	create table emp(
		id int primary key,
		name varchar(20),
		index index_name (name)
	--  key [索引名] (字段名[(长度)])
 	)



--添加索引
	create INDEX 索引名 ON 表名 (字段名[(长度)]);
	create INDEX index_name on employee (name);
	alter table 表名 ADD INDEX 索引名 (字段名[(长度)]);
	alter table employee add INDEX index_name (name)
	
--删除索引
	drop index 索引名 on 表名
	drop index index_name on employee;
	
	
--模拟添加数据
create table t1_suoyin(id int,name varchar(20));

delimiter $			
create procedure autoinsert()
BEGIN
declare i int default 1;
while(i<8000)do
insert into t1_suoyin values (i,'yuan');
set i=i+1;
end while;
END$

delimite ;    --改回来
call autoinsert();	--执行
posted @ 2019-02-25 20:44  rayh  阅读(178)  评论(0编辑  收藏  举报