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命令中直接输入
- 备份命令, mysqldump -uroot -p123 mydb1 > d:\my.sql
- 恢复备份,mysql -uroot -p123 mydb1 < d:\my.sql。恢复备份只是恢复数据库中的内容,不能建立数据库。
- 恢复备份,source d:\b.sql。sql语句命令。
DDL相关语言
- desc tablename;表格属性
- create table tablename(,,);增加表格
- drop table tablename;删除表格
- alter table tablename
add(id int ,sex varchar(2) );增加lie
remove lie1name; 删除、列
modify lie varchar(20);修改类属性
change lie lie2 varchar(30);修改列名字与属性
renmae to tablename2;修改表名字 - show create table tablename;展示列的创建,可以看到一些没有id的约束条件。
DML
- insert into table1(id,name) values(1,"zhaoshuyou");在对应列上增加数值
- insert into table1 values(1,"zhaoshuyou")。整行增加数值,每个属性都要有值或者null
- update table1 set name='zhaowuji' where id=1;修改记录,where必须有条件,否者更新所有
- delte from table1 where id=1;删除记录,必须要条件,原因删除所有。 其他:where的田间判断有:= != <> <= >= between...and... or and in() ‘is null’ 'is not null' like:后面两个是null的判断,null所有操作都是null。
DCL
- create user zhao@'%' identified by '123';创建用户为zhao,密码为123的值
- drop user zhao@'%';删除用户名为zhao
- grant all on mydb1.* to zhao@'%'; all代表所有:create select insert delete update alter drop
- voke all on mydb1.* from zhao@'%';
- UPDATE USER SET PASSWORD=PASSWORD(‘密码’) WHERE User=’用户名’ and Host=’IP’;FLUSH PRIVILEGES;修改密码
DQL
- select * from emp;查询所有
- select lie1 as abc,lie2 as bcd from emp;查询指定列。 as指定列别名,可以去掉as
- select dstinct lie1 ,lie2 from emp;去除重复列。
- 列操作:
- 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;连接运算符。
- select * from emp id like '%a%'模糊查询,_代表一个字符,%代表任意字符。
- select * from emp ordered by sal asc; asc可以省略,desc代表降序。可以多个顺序安培,用,连接
- 聚合函数,max min count() sum().max选取最大值,min选取最小值,max min 不计算null,sum为和把null为0,count计算有效行,不计算null行。
- group by lie;根据列属性进行分组,select只能为聚合函数与分组属性。
- select dept,max(sal),min(sal),avg(sal) from emp group by dept having avg(sal)>100; having 分组后查找
- select * from emp limt 1,5;查找从第一行开始查找5行。有0行。
主键
primarykey,主键是对数据表中记录的唯一标识。具有互异性、非空性、可以作为外键。 主键的添加:
- 方法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相同。
- 在创建的时候添加
- 在修改列属性与列名字的时候添加;modify change
- 单独增加约束:alter table table2 add unique(name);
- 删除,需要删除约束条件的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,一个表的副键参考另一个表的主键。这样就可以构成对应关系;
- 增加创建的时候增加一行constraint fk_dept_deptno foreign key(dept) refferences dept(deptno)
- 修改增加alter table emp1 add constraint fk_dept_deptno foreign key(dept)
- 删除 alter table emp1 drop foreign key fk_dept_deptno
对应关系:
关系数据结构的定义就是表格,表格有信息表格有关系表格。信息表格例如选课系统中课程的表格(包含课程名称,代号等) ,学生表格(学习的个人信息);他们之间的关系选课就是一个关系。关系的种类:关系的实现是依靠外键约束。
- 一对一关系。这个不常见,比如夫妻。可以做到一个表格中,省去关系表格与另外一个属性表格。
- 1对多 ,一个班长下面有多个学员;一个班的学员只有一个班长。可以将关系写入到多的那个属性里面。
- 多对多,一个学生有多个老师,一个老师有多个学生。这个事物属性与关系不能写在一起。要有独立的关系表格。
多表查询
- union合并:通过union将两个select结果合并在一起,要求两个列的属性相同。all表示不取消相同项
select * from emp where sal> 1000;
union all
select * from emp where sal< 500;
- 内连接(自然连接):例如查询两个表的时候,会进行笛卡尔积运算,生成所有结果,从中选取我们感兴趣的表格,在上面做做运算。
//这是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可以省略,建议保留
- 外链接:外链接有做外链与右外链接,与全连接。主要特点是,在连接的时候保留不存在对应关系的想,将对应关系处填为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语句结果又四种形式,多行多列、多行单列、单行多列、单行单列,应用如下:
- 单行单列:作为where的条件进行判断。
select * from emp
where sal>(
avg(sal) from emp );
- 多行单列,多行单列结果可以作为一个集合,用 in 或者>all() >any()
select * from emp
where sal>all(
select distinct sal from emp where deptno=10
);
- 单行多列,可以用in操作,对比一个记录是否在里面
select * from emp
where (dept,sal)(
select distinct dept, sal from emp where deptno=10
);
- 多行多列,作为一个子表,查询对应结果。
select * from (
select * from emp ,dept on emp.deptno=dept.deptno
)
where sal>100;