MYSQL简单知识

304 阅读9分钟

sql简介

sql是structure query language,是一个规范标准,用于访问数据库。主流的数据的有orcale的orcale与mysql,mysql是sun公司的开源关系型数据库,sun后来被oracle收购。mysql应用比较灵活适合互联网公司,而oracle数据库是开发比较成熟的数据库,一般用在金融行业,orcale公司对orace的支持比较好。officesql是微软的数据库。
目前我所说的数据库是关系型数据库,逻辑基于表格组成。数据的组成如下图1,,数据库包含管理系统与数据。数据时表格的集合。

mysql的相关知识

安装省略,自行搜索

重装

如果出现安装失败需要重新安装系统,安装系统的步骤

  • 关闭服务。1.关闭mysql service进程。关闭服务或者杀死进程
  • 卸载程序。
  • 删除安装目录,删除c:\grogramdata\sql的数据文件
  • 清除sql的注册表

登录

  • 开启mysqlservice的犯法,net stop mysql;net start mysql。查看是否有mysqld进程
  • 登录my -uroot -p123 -hip,会创建mysql客户端进程。 -hip可以不填,对于root用户,对于其他用户可以填写连接的ip地址
  • 关闭登录:quit。exit或者ctrl+c

数据类型.后面需要补充

  • int
  • char(30)最大255
  • varchar(20)最大65535
  • text(clob):1.tinatext 2^8-1;2. text 2^16-1;3. midiumext 2^8-1;4. longtext 2^32-1。
  • blob:同上
  • date 日期
  • time 时间
  • timestamp 日期+时间。

mysql语言

mysql有对应的标准,每个数据都有自己的保留语言。所以说如果不采用标准的化sql语言不能相互借用。sql语言是不区分大小写,并且以冒号结尾。语言分类

  • DDL data defination language数据可定义语言,定义表、数据库 其他
  • DML DATA manibutation language 数据库的操作主要是对表格增加删除修改
  • DCL data control language 数据的control语言,主要是用户的创建于权限
  • DQL data query languge 数据查询语言,

基本操作语言:

  • show databases;能看到数据库
  • use databasename;采用哪个数据库,在访问数据库之前,要确认
  • show tables;显示所有的数据表格
  • create database [fi not exists]databasename;创建数据库,if not exits是在已经存在的时候,就不创建,数据库不会报错。如果没有if not exists,数据库已经存在情况下会报错。
  • drop databasenaem删除数据库
  • alter databas databasename character set utf8修改数据库编码类型

编码相关

在window中的终端窗口出现乱码,原因window的命令窗口是支持本地语言的,GBK编码,而mysql是支持utf8的编码
show variables like 'character%' 显示如下。中的client是指客户端的编码,而result是指mysql服务器发给终端的编码,需要设置成gbk编码,中文字符才会不出现乱码。

character_set_client     | utf8
character_set_connection | utf8
character_set_database   | utf8
character_set_filesystem | binary
character_set_results    | utf8
character_set_server     | utf8
character_set_system     | utf8

设置:客户端的编码结构与发送的编码。
set  character_set_client=gbk;
set character_set_results=gbk;

备份数据库

备份数据时指,将数据库中的转化为sql脚本语言。在cmd命令中直接输入

  1. 备份命令, mysqldump -uroot -p123 mydb1 > d:\my.sql
  2. 恢复备份,mysql -uroot -p123 mydb1 < d:\my.sql。恢复备份只是恢复数据库中的内容,不能建立数据库。
  3. 恢复备份,source d:\b.sql。sql语句命令。

DDL相关语言

  1. desc tablename;表格属性
  2. create table tablename(,,);增加表格
  3. drop table tablename;删除表格
  4. alter table tablename
    add(id int ,sex varchar(2) );增加lie
    remove lie1name; 删除、列
    modify lie varchar(20);修改类属性
    change lie lie2 varchar(30);修改列名字与属性
    renmae to tablename2;修改表名字
  5. show create table tablename;展示列的创建,可以看到一些没有id的约束条件。

DML

  1. insert into table1(id,name) values(1,"zhaoshuyou");在对应列上增加数值
  2. insert into table1 values(1,"zhaoshuyou")。整行增加数值,每个属性都要有值或者null
  3. update table1 set name='zhaowuji' where id=1;修改记录,where必须有条件,否者更新所有
  4. delte from table1 where id=1;删除记录,必须要条件,原因删除所有。 其他:where的田间判断有:= != <> <= >= between...and... or and in() ‘is null’ 'is not null' like:后面两个是null的判断,null所有操作都是null。

DCL

  1. create user zhao@'%' identified by '123';创建用户为zhao,密码为123的值
  2. drop user zhao@'%';删除用户名为zhao
  3. grant all on mydb1.* to zhao@'%'; all代表所有:create select insert delete update alter drop
  4. voke all on mydb1.* from zhao@'%';
  5. UPDATE USER SET PASSWORD=PASSWORD(‘密码’) WHERE User=’用户名’ and Host=’IP’;FLUSH PRIVILEGES;修改密码

DQL

  1. select * from emp;查询所有
  2. select lie1 as abc,lie2 as bcd from emp;查询指定列。 as指定列别名,可以去掉as
  3. select dstinct lie1 ,lie2 from emp;去除重复列。
  4. 列操作:
    • select * , sal*1.5 from emp;返回所有,并增加一列,工资乘以1.5
    • select sal+comm allsal from emp;返回工资加补贴
    • select sal+ifnull(comm,0) allsal from emp;返回工资加补贴,新津如果为null,作为0运算
    • 字符串的连接:select concat(‘i am : ’,id,‘ ,sal is ’,'sal')from emp;连接运算符。
  5. select * from emp id like '%a%'模糊查询,_代表一个字符,%代表任意字符。
  6. select * from emp ordered by sal asc; asc可以省略,desc代表降序。可以多个顺序安培,用,连接
  7. 聚合函数,max min count() sum().max选取最大值,min选取最小值,max min 不计算null,sum为和把null为0,count计算有效行,不计算null行。
  8. group by lie;根据列属性进行分组,select只能为聚合函数与分组属性。
  9. select dept,max(sal),min(sal),avg(sal) from emp group by dept having avg(sal)>100; having 分组后查找
  10. select * from emp limt 1,5;查找从第一行开始查找5行。有0行。

主键

primarykey,主键是对数据表中记录的唯一标识。具有互异性、非空性、可以作为外键。 主键的添加:

  1. 方法1 如下:定义的时候增加 primary key ,auto_increment当primary key为正数的时候,自动增加,可以设置为null。
create table table1(
id  int primary key auto_increment,
name varchar(20)
);

2、方法2,指定primary key约束条件

create table table2(
id1 int ,
id2 int,
name varchar(20),
primary key(id1,id2)
);

3、修改的时候增加 primary key:alter table emp add primary key(id); 4. 删除primary key:alter table emp drop primary key;

auto_inrement主键自增长。

在主键的一节中我们已经看到auto_inrement设置,值对int主键有效。删除与设置方法通过修改列属性的到。modify change都可以。也可以在创建主键的时候直接写

alter table table2 modify  id1 int auto_increment;
alter table table2 modify  id1 int;
alter table table2 modify  id1 int auto_increment;
alter table table2 modify  id1 int ;

非空

非空是一个属性,说明这个记录的值不能为null。属性标记为:not null。也可以在创建主键的

alter table table2 modify  id1 int  not null;
alter table table2 modify  id1 int;
alter table table2 modify  id1 int not null;
alter table table2 modify  id1 int ;

unique互异性。值不相等,但是可以null。这个是约束条件,添加方法跟primary key相同。

  1. 在创建的时候添加
  2. 在修改列属性与列名字的时候添加;modify change
  3. 单独增加约束:alter table table2 add unique(name);
  4. 删除,需要删除约束条件的id。alter table table2 drop key name; name为约束id在create table table2中可以看到。
show create table table2;
-----------------------------------------+
| Table  | Create Table
                                         |
+--------+--------------------------------------
-----------------------------------------+
| table2 | CREATE TABLE `table2` (
  `id1` int(11) NOT NULL DEFAULT '0',
  `id2` int(11) NOT NULL DEFAULT '0',
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id1`,`id2`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+--------------------------------------
-----------------------------------------+
1 row in set (0.00 sec)

其他中的 unique key id 为‘name’

alter table table2 drop key name;

外键

外键可以为null,一个表的副键参考另一个表的主键。这样就可以构成对应关系;

  1. 增加创建的时候增加一行constraint fk_dept_deptno foreign key(dept) refferences dept(deptno)
  2. 修改增加alter table emp1 add constraint fk_dept_deptno foreign key(dept)
  3. 删除 alter table emp1 drop foreign key fk_dept_deptno

对应关系:

关系数据结构的定义就是表格,表格有信息表格有关系表格。信息表格例如选课系统中课程的表格(包含课程名称,代号等) ,学生表格(学习的个人信息);他们之间的关系选课就是一个关系。关系的种类:关系的实现是依靠外键约束。

  1. 一对一关系。这个不常见,比如夫妻。可以做到一个表格中,省去关系表格与另外一个属性表格。
  2. 1对多 ,一个班长下面有多个学员;一个班的学员只有一个班长。可以将关系写入到多的那个属性里面。
  3. 多对多,一个学生有多个老师,一个老师有多个学生。这个事物属性与关系不能写在一起。要有独立的关系表格。

多表查询

  1. union合并:通过union将两个select结果合并在一起,要求两个列的属性相同。all表示不取消相同项
select *  from emp where sal> 1000;
union all
select *  from emp where sal< 500;
  1. 内连接(自然连接):例如查询两个表的时候,会进行笛卡尔积运算,生成所有结果,从中选取我们感兴趣的表格,在上面做做运算。
//这是mysql特有的,不是规范
select e.id ,e.name,e.sale,p.name 
from emp e,dept d
where e.deptno=d.deptno;

//这是sql规范
select e.id ,e.name,e.sale,p.name 
from emp e  nature join dept d
on e.deptno=d.deptno;//on可以省略,建议保留
  1. 外链接:外链接有做外链与右外链接,与全连接。主要特点是,在连接的时候保留不存在对应关系的想,将对应关系处填为null
//如果 emp表中有一个不属于任务部门的员工的话,会被保留
select e.id ,e.name,e.sale,p.name 
from emp e  left outer join dept d
on e.deptno=d.deptno; 
//如果 dept表中有一个没有员工的部门,会被保留
select e.id ,e.name,e.sale,p.name 
from emp e  right outer join dept d
on e.deptno=d.deptno; 

左连接与有链接可以多个连载一起:例如select * from table1 left outer joint table2 on table1.12no=table2.12no left outer join table3 on table2.23no=table3.23no; 全连接mysql不支持,可以通过union +left outer join+right outer joi

子查询

子查询就是查询语句存在与where与from中。子select语句结果又四种形式,多行多列、多行单列、单行多列、单行单列,应用如下:

  1. 单行单列:作为where的条件进行判断。
select *  from emp 
where sal>(
avg(sal)  from emp );
  1. 多行单列,多行单列结果可以作为一个集合,用 in 或者>all() >any()
select * from emp
where sal>all(
select distinct  sal from emp where deptno=10
);
  1. 单行多列,可以用in操作,对比一个记录是否在里面
select * from emp
where (dept,sal)(
select distinct  dept, sal  from emp where deptno=10
);
  1. 多行多列,作为一个子表,查询对应结果。
select * from (
select * from emp ,dept on emp.deptno=dept.deptno
)
where sal>100;