对MySQL的理解
关于数据库其实我们可以简单的理解为存储货物的⼀个⼚库,⾥⾯分别是按照⼀定的分类存放的物品,然后⼈们有时会从⼚库中拿⾛或存储⼀些物品,有时也会更改或增加⼀些分类
这些物品都分门别类的存放在⼚库中,⽅便⼈们的查询和存储。
MySQL是⼀个关系型数据库管理系统,开发者为瑞典MySQL AB公司。⽬前MySQL被⼴泛地应⽤在互联⽹⾏业。由于其体积⼩、速度快、总体拥有成本低,尤其是开放源码这⼀特点,许多互联⽹公司选择了MySQL作为后端数据库。2008年MySQL被Sun公司收购,2010年甲⾻⽂成功收购Sun公司。
MySQL数据库的优点:
1、多语⾔⽀持:Mysql为C、C++、Python、Java、Perl、PHP、Ruby等多种编程语⾔提供了API,访问和使⽤⽅便。
2、可以移植性好:MySQL是跨平台的。
3、免费开源。
4、⾼效:MySql的核⼼程序采⽤完全的多线程编程。
5、⽀持⼤量数据查询和存储:Mysql可以承受⼤量的并发访问。
由于本⼈最先接触到的数据库是oracle,在此谈论mysql说的有些命令或知识可能是oracle 上的,mysql可能不适⽤,见谅
⾸先先介绍下mysql的常⽤命令:
显⽰所有数据库:show databases;
•选定默认数据库:use dbname;
•显⽰默认数据库中所有表:show tables;
•放弃正在输⼊的命令:\c
•显⽰命令清单:\h
•退出mysql程序:\q
•查看mysql服务器状态信息:\s
mysql⽬前⽤的最多的存储引擎就是InnoDB存储引擎
InnoDB给MySQL的表提供了事务、回滚、崩溃修复能⼒、多版本并发控制的事务安全。在 MySQL从 3.23.34a 开始包含 InnoDB 存储引擎。InnoDB 是 MySQL 上第⼀个提供外键约束的表引擎。⽽且InnoDB对事务处理的能⼒,也是MySQL其他存储引擎所⽆法与之⽐拟的。InnoDB存储引擎的特点
1)⽀持外键(Foreign Key)
2)⽀持事务(Transaction):如果某张表主要提供OLTP⽀持,需要执⾏⼤量的增、删、改操作(insert、delete、update语句),出于事务安全⽅⾯的考虑,InnoDB存储引擎是更好的选择。
SQL(Structured Query Language)语⾔的全称是结构化查询语⾔。数据库管理系统通过SQL语⾔来管理数据库中的数据。
SQL语⾔分为三个部分:数据定义语⾔(Data Definition Language,简称为DDL)、数据操作语⾔(Data Manipulation Language,简称为DML)和数据控制语⾔(Data Control Language,简称为DCL)。
DDL语句:CREATE、ALTER、DROP
DML语句:update、insert、delete、select
DCL语句:是数据库控制功能。是⽤来设置或更改数据库⽤户或⾓⾊权限的语句,包括(grant,deny,revoke等)语句
每个数据库建⽴是来后都会有⼀个数据库实例,所谓数据库实例就是⼀个数据库的服务器,在该实例中会有⽤户,刚刚创建的⽤户是没有任何权限的,因此,需要dba给该⽤户授权
当⼀个⽤户创建了任意⼀个数据对象,dbms就会创建⼀个相应的⽅案与之对应,且该⽅案名与应户名相同
⽤户权限分系统权限和对象权限,系统权限是和数据库管理相关的权限,如create table、create view等,⽽对象权限是和⽤户操作数据库相关的权限,如数据库的增删改查。
说到权限就不得不说⾓⾊了,⾓⾊是⼀组权限的集合,⽬的是为了简化对权限的管理,从⽽达到简单对⽤户的管理。
⾓⾊可以包含系统权限,也可以包含对象权限。
oracle中有严格的权限之分,⾄于mysql暂不清楚故不做深讨~~~
下⾯简单介绍下mysql⼀些基本命令:
⼀、数据库增删改查
1、增:有2种⽅法
  1).使⽤insert插⼊单⾏数据:
语法:insert [into] <;表名> [列名] values <;列值>
  例:insert into strdents (姓名,性别,出⽣⽇期) values ('张三','男','1990/1/1')
  注意:如果省略表名,将依次插⼊所有列
2).使⽤insert,select语句将现有表中的数据添加到已有的新表中
语法:insert into <;已有的新表> <;列名> select <;原表列名> from <;原表名>
  例:insert into address ('姓名','地址','电⼦邮件')select name,address,email  from  Strdents
注意:查询得到的数据个数、顺序、数据类型等,必须与插⼊的项保持⼀致
2、删:有2中⽅法
1).使⽤delete删除数据某些数据
语法:delete from <;表名> [where <;删除条件>] 
例:delete from a where name='张三'(删除表a中列值为张三的⾏) 
注意:删除整⾏不是删除单个字段,所以在delete后⾯不能出现字段名
2).使⽤truncate table 删除整个表的数据
语法:truncate table <;表名>
 例:truncate table addressList
 注意:删除表的所有⾏,但表的结构、列、约束、索引等不会被删除;不能⽤于有外建约束引⽤的表
truncate与delete 的区别:
1)delete数据DML语句,其事物可以回归,⽽truncate是DDL语句,不能回滚;
2)delete只是删除表中数据,如表中有⾃增长列,不会改变⾃增长的数值,仍按原数据增长,⽽truncate会连⾃增长数值⼀并删除,重新开始⾃增长;
3)truncate会释放表的存储空间,⽽delete 不会,⾼⽔位标记(HWM)不会降低。
注:
Drop :删除数据表或数据库,或删除数据表字段,此⽅法不可逆
语法:drop database 数据库名称
三、改  使⽤update更新修改数据
语法:update <;表名> set <;列名=更新值> [where <;更新条件>]
  例:update addressList set 年龄=18 where 姓名='张三'
  注意:set后⾯可以紧随多个数据列的更新值(⾮数字要引号);where⼦句是可选的(⾮数字要引号),⽤来限制条件,如果不选则整个表的所有⾏都被更新
四、查
1.普通查询
语法:select <;列名> from <;表名> [where <;查询条件表达试>] [order by <;排序的列
名>[asc或desc]]
truncate删除数据
   1).查询所有数据⾏和列
    例:select * from a
    说明:查询a表中所有⾏和
   2).查询部分⾏列--条件查询
    例:select i,j,k  from  a  where f=5
    说明:查询表a中f=5的所有⾏,并显⽰i,j,k3列
   3).在查询中使⽤AS更改列名
    例:select name as 姓名 from a where  gender='男'
    说明:查询a表中性别为男的所有⾏,显⽰name列,并将name列改名为(姓名)显⽰
   4).查询空⾏
    例:select name from a where email is null
    说明:查询表a中email为空的所有⾏,并显⽰name列;SQL语句中⽤is null或者is not null来判断是否为空⾏   5).在查询中使⽤常量
    例:select name '北京' as 地址 from a
    说明:查询表a,显⽰name列,并添加地址列,其列值都为'北京'
   6).查询返回限制⾏数(关键字:limit)
    Select * from 表名 limit 从第⼏条取,取⼏条
    例1:select * from students limit 3,5
    说明:查询表students ,显⽰列表的3-5⾏,limit 为关键字(oracle 中没有top关键字⽤rownum替代)
select  *  from  a where  rownum<6
   7).查询排序(关键字:order by , asc , desc)
    例:select * from students  where grade>=60 order by desc
    说明:查询表中成绩⼤于等于60的所有⾏,并按降序显⽰;默认为ASC升序
2.模糊查询
   1).使⽤like进⾏模糊查询
    注意:like运算副只⽤语字符串,
    例:select * from students where name like '赵%'
    说明:查询显⽰表students中,name字段第⼀个字为赵的记录
   2).使⽤between在某个范围内进⾏查询
    例:select * from students where age between 18 and 20
    说明:查询显⽰表a中年龄在18到20之间的记录
    3).使⽤in在列举值内进⾏查询(in后是多个的数据)
例:select name from students where address in ('北京','上海','唐⼭')
   说明:查询表students中address值为北京或者上海或者唐⼭的记录,显⽰name字段
3.分组查询
   1).使⽤group by进⾏分组查询
    例:select studentID as 学员编号, AVG(score) as 平均成绩  (注释:这⾥的score是列名)
      from score (注释:这⾥的score是表名)
      group by studentID
2).使⽤having⼦句进⾏分组筛选
    例:select studentID as 学员编号, AVG from score group by studentID having count(score)>1
    说明:接上⾯例⼦,显⽰分组后count(score)>1的⾏,由于where只能在没有分组时使⽤,分组后只能使⽤having来限制条件,
4.多表联接查询
   1).等号联接
    ①在where⼦句中指定联接条件
    例:select a.name,b.mark from a,b where a.name=b.name
    说明:查询表a和表b中name字段相等的记录,并显⽰表a中的name字段和表b中的mark字段
    注:上述sql中where后条件a.name=b.name⼀定要有,否则会出现笛卡尔结果
2)Left join:左连接,连接两张表,以左边表的数据匹配右边表中的数据,如果左边表中的数据在右边表中没有,会显⽰左边表中的数据。
select a.name 学⽣姓名,b.score 学⽣成绩 from students a left join score b on a.id=b.student_id;
  3)Right join:右连接,连接两张表,以右边表的数据匹配左边表中的数据,如果左边表中的数据在左边边表中没有,会显⽰右边表中的数据。
    select a.name 学⽣姓名,b.score 学⽣成绩 from students a right join score b on a.id=b.student_id;
  4)Inner join:内连接,连接两张表,匹配两张表中的数据,和前⾯两个不同的是只会显⽰匹配的数据。
    select a.name 学⽣姓名,b.score 学⽣成绩 from students a INNER join score b on a.id=b.student_id;
⼆、合并查询
合并多个select的查询结果,可使⽤集合操作符UNION,UNION ALL,intersect,minus
1)union查询结果会⾃动去掉重复项,⽽union all不会去掉重复项
2)intersect取交集
3)minus 取差集
a1 minus a2 结果取a1中去掉与 a2相同的部分,如没有相同部分则不去掉。
注:mysql中仅⽀持union与union all查询,不知最新版mysql是否⽀持其他的合并查询
Select avg(sal),deptno,job from emp group by cube(deptno,job);deptno--先按deptno分组,再按job分组
三、序列
在mysql的⼀张表中,我们希望有列,假设该列是整形,我们希望当我们添加⼀条记录的时候,该列值
能够⾃动的增长(⽐如从1开始增长,每次增长1)
下⾯分别说下不同数据库建序列⽅式:
1)oracle
例:创建⼀个序列
  create sequence myseq
  Start with 1
  Increment by 1
  minvalue 1
  maxvalue 30000
  cycle                //cycle表⽰当前序列增加30000,从1开始,每次增加1
  nocache
使⽤:创建⼀张表
Create table aa (id number primary key,name varchar2(32));
使⽤: insert into aa val,’abc’);
序列细节说明:
⼀旦定义了某个序列,你就可以⽤currval,nextval
Currval:返回sequence的当前值
Nextval:增加sequence的值,然后返回sequence值
⽐如:
序列名.currval
序列名.nextval
什么时候使⽤序列:
1)不包含⼦查询、snapshot、view 的select语句
2)Insert语句的⼦查询中
3)Insert语句的values中
4)Update的set中
序列注意事项:
1)currval总是返回当前sequence的值,但是在第⼀次nextval初始化之后才能使⽤currval,否则会出错。⼀次nextval会增加⼀
次sequence的值,所以如果同⼀个语句⾥⾯使⽤多个nextval,其值就是不⼀样的。
2)第⼀次nextval返回的是初始值,随后的nextval会⾃动增加你定义的increment by值,然后返回增加后的值
3)如果指定cache值,oracle就可以预先在内存⾥⾯放置⼀些sequence,这样存取的快些,cache⾥⾯的取完后,oracle⾃动再取⼀组
到cache。使⽤cache或许会跳号,⽐如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失,所以可以在create sequence的时候⽤nocache防⽌这种情况
2)
在sql server和MySQL中都是可以在定义表的时候,直接指定⾃增长
Sqlserver
Crete table temp1(
Id int primary key identity(1,1),
Name varchar(36));
Mysql:
Create table temp1(
Id int primary key c,
Name varchar(36));
四、索引
所谓索引可以简单的理解为⼀本书的⽬录,通过⽬录我们能快速的到我们所要查的内容
索引分类
1)单列索引
  Create index 索引名 on 表名(列名)
2)复合索引