澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站MySql学习笔记06,MySQL学习笔

2019-10-05 作者:数据库网络   |   浏览(171)

学科回看

  1. 一对一事关 案例1:查询各个职员和工人的名字和掌管长官的名字

    select e.ename 员工姓名,m.ename 领导姓名
    from emp e join emp m
    on e.mgr=m.empno;
    

     

    案例2: 查询高管理事名为blake的装有职工名字 

    select e.ename 员工姓名,m.ename 领导姓名 from emp e join emp m on e.mgr=m.empno where m.ename='blake'
    

     

    案例3:查询有商品的归类新闻及上级分类音讯往titemcategory表内部插入以下数据 id 162 name 办公用品 id 229 name 文具 id 913 name 户外用品 -插入数据

     insert into titemcategory (id,name) values(162,'办公用品'),(229,'文具'),(913,'户外用品');
    

     

     -查询全体有商品的分类id

    SELECT DISTINCT categoryid FROM titem WHERE categoryid IS NOT NULL
    

     

    * -查询分类详细的情况*

    select * from titemcategory where id in (SELECT DISTINCT categoryid FROM titem WHERE categoryid IS NOT NULL)
    

     

     -查询上级分类

     select n.*,c.name 上级分类名称 from (select * from titemcategory where id in (SELECT DISTINCT categoryid FROM titem WHERE categoryid IS NOT NULL)) n join titemcategory c on n.parentid=c.id
    

     

    -查询有商品的分类音信及上级分类音信达成步骤:1.通过子查询查到有商品的归类id 2.把近日分类和上面分类通过内接连构建关系 3.然后把分类的id作为筛选标准 -简单写法 

    select c.*,m.name 上级分类 from titemcategory c join titemcategory m on c.parentid=m.id where c.id in (SELECT DISTINCT categoryid FROM titem WHERE categoryid IS NOT NULL);
    

     

  2. 一对多涉及

    机构 员工 分类 商品 客商 地址 userid -一对多的表中 在多的表中增加关系字段

    案例1:查询每个分类下所对应的富有商品

    select *
    from t_item_category c left join t_item i
    on c.id=i.category_id
    

     

    案例2:查询部门平均薪水 大于 全体职工的平均薪给的有所机关下的有着职员和工人

    SELECT * FROM emp 
    WHERE deptno IN (SELECT deptno FROM emp
    WHERE deptno IS NOT NULL
    GROUP BY deptno
    HAVING AVG(sal)>(SELECT AVG(sal) FROM emp))
    

     

    案例3:上题结果上再多彰显出 部门的名字

     select n.*,d.dname from(SELECT * FROM emp WHERE deptno IN (SELECT deptno FROM emp WHERE deptno IS NOT NULL GROUP BY deptno HAVING AVG(sal)>(SELECT AVG(sal) FROM emp)))n join dept d on n.deptno=d.deptno
    

     

  3. 多对多关系 -多对多要求单独通过新建的涉及表保存数据

    create table teacher(id int primary key auto_increment,name varchar(20));
    
    insert into teacher values(null,'唐僧'),(null,'赵本山'),(null,'刘老师'); create table student(id int primary key autoincrement,name varchar(10)); insert into student values(null,'八戒'),(null,'悟空'),(null,'宋小宝'),(null,'小沈阳'),(null,'小明'),(null,'小红'); create table ts(tid int,sid int); insert into t_s values(1,1),(1,2),(2,3),(2,4),(3,5),(3,6),(1,5),(2,5); 案例1:查询每个老师对应的所有学生信息 1. 子查询 select name from student where id in (select sid from ts where tid in(select id from teacher)) 2. 内连接 SELECT n.name tname,s.name FROM (SELECT * FROM teacher t JOIN ts ts ON t.id=ts.tid)n JOIN student s ON n.sid=s.id
    

     

    案例2:查询 小明 对应的持有老师 

    SELECT n.name tname,s.name FROM (SELECT * FROM teacher t JOIN t_s ts ON t.id=ts.tid)n JOIN student s ON n.sid=s.id where s.name='小明'
    

     

    案例3:刘先生 对应的装有学生新闻 

    SELECT n.name tname,s.name FROM (SELECT * FROM teacher t JOIN t_s ts ON t.id=ts.tid)n JOIN student s ON n.sid=s.id where n.name='刘老师';
    

     

一、数据库的创立

mysql -uroot -proot

MySQL 学习笔记 一

 

视图

  create database database_name  DEFAULT CHARACTEENCORE SET utf8;  //创造三个数据库  

查询全数 show databases;

创建 create database 库名;

查询实际情况 show create database 库名;

点名字符集 create database 库名 character set utf8;

删除 drop database 库名;

使用 use 库名;

导入数据库 source 路线;

询问全体 show tables;

创建 create table t1(name varchar,age int);

询问详细情形 show create table t1;

点名引擎和字符集 create table t1(name varchar,age int) engine=myisam/innodb charset=utf8;

----------------innodb:辅助数据库的错综相连操作,包罗外键、事务等

----------------myisam:只支持数据基础的增加和删除改查操作

翻开表字段 desc 表名;

删除表 drop table 表名;

修改表名 rename table 原名 to 新名;

修改表的引擎和字符集 alter table 表名 engine=myisam/innodb charset=utf8;

增添表字段

--最末尾: alter table 表名 add 字段名 字段类型;

--最前头: alter table 表名 add 字段名 字段类型 first;

--XX后边: alter table 表名 add 字段名 字段类型 after xxx;

删除表字段 alter table 表名 drop 字段名;

修改表字段的名字和项目 alter table 表名 change 原字段名 新字段名 新字段类型;

修改表字段的档案的次序和职务 alter table 表名 modify 字段名 字段类型 地方;

删去并新建 truncate table 表名;

封存数据 insert into 表名 values(字段值,字段值,...);

点名字段插入 insert into 表名 values ;

查询数据 select * from 表名 where 条件;

修改数据 update 表名 set 字段名=字段值,字段名=字段值,... where 条件;

去除数据 delete from 表名 where 条件;

查询到的字段更名 select 原字段名 新字段名 from 表名;

询问去重 select distinct 字段名 from 表名;

in 查询有些字段的值为多少个的时候 select * from where 字段名 in(值1,值2,...);

查询某些字段的值不为**的时候 select * from where 字段名 not in(值1,值2,...);

between查询在**之间 select * from where 字段名 between 值1 and 值2;

查询不在**之间的 select * from where 字段名 not between 值1 and 值2;

模糊查询: like

_:代表单个未知字符

%:代表0个大概四个不为人知字符

升序 select * from 表名 order by 字段 asc;

降序 select * from 表名 order by 字段 desc;

分组 select 字段 from 表名 group by 字段;

分页查询 select * from 表名 limit *每页数量,每页数量 -----limit 7,7

取余 mod -----7%2

收获当前几天子 时间 select now();

获得当前几天子 select curdate();

赢妥帖前时光 select curtime();

从年月日时分秒中领取日期 select date;

从年月日时分秒中领到时间 select time;

从年与日时转眼中领到时间分量:

年 select extract(year from now; ------select extract(year from 字段) from 表名;

月 select extract(month from now;

日 select extract(day from now;

时 select extract(hour from now;

分 select extract(minute from now;

秒 select extract(second from now;

日子格式化:

%Y 四位年 YYYY

%y 两位年 yy

%m 两位月

%c 一位月

%d 日

%H 24小时

%h 12小时

%i 分

%s 秒

-------select date_format,'%Y年%m月%d日 %H时%i分%s秒');

非规范格式调换为标准格式

str_to_date('非行业内部格式的时日',格式); --------select str_to_date('2018年11月16日 15时49分08秒','%Y年%m月%d日 %H时%i分%s秒');

ifnull ----update emp set comm = ifnull;

创立表的时候定义主键和自增 注释 create table 表名(字段名 字段类型 primary key auto_increment comment '内容',....);

查看自动提交状态 show variables like '%autocommit%';

设置自动提交的处境 set autocommit=0/1;

开启事务 begin;

付给业务 commit;

封存回滚点 savepoint 名;

回滚到回滚点 rollback to 名;

平均值 avg; ------select avg from emp;

最大值 max; ------select max from emp;

最小值 min; ------select min from emp;

求和 sum; ------select sum from emp;

计算数据 count; ------select count from emp;

拼接 concat('xx','xx');

获得长度 select char_length from emp;

赢得字符串在其余二个字符串中出现的岗位 instr(str,substr);

插入字符串 insert(str,start,length,newstr);

转大写 upper;

转小写 lower;

去两端空白 trim;

截取字符串

从左截取 left;

从右截取 right;

自定义截取 substring(str,start,len);

重复 repeat;

轮换 replace(str,要替换的,替换后的);

反转 reverse;

向下取整 select floor;

四舍五入 select round; ------select round(23.4782,2) 23.48

非四舍五入 select truncate -----select truncate 23.87

随机数 rand() 0-1

获取3、4、5 随机数 select floor 3;

内接连 select from 字段 from 表1 join 表2 on 等值条件

外连接 select from 字段 from 表1 left join 表2 on 等值条件

创造视图 create view 视图名 as 子查询 with check option;

创建或调换视图 create or replace view 视图名 as 子查询;

删去视图 drop view 视图名;

格式: constraint 约束名称 foreign key references 信任的表名

格式: create index 索引名 on 表名)

除去索引 drop index 索引名 on 表名;

一、数据库简介

时间:2016-3-28 19:40

视图概述

-数据库中存在多种对象,表和视图都是数据库中的对象 **表和视图不能重名**
-视图是张虚拟的表,是通过sql的查询语句查询的结果集的表保存成了一个视图 
-视图中的数据 会随着真实表中的数据改变而改变
-视图实际上就是代表了一部分sql语句

-创制视图

-格式:create view 视图名 as 子查询;

create view v_emp_10 as (select * from emp where deptno=10); 

案例:创建emp表的部门是20 工资小于3000的 视图
    只保存名字 工资 部门id

create view v_emp_20 as (select ename,sal,deptno from emp
    where deptno=20 and sal<3000);

案例:创建emp表 每个部门的工资平均值 的视图

create view v_emp_dept_avg as (select deptno,avg(sal) from emp group by deptno)

 

-若是创设视图的时候利用了外号,那视图今后的操作只认知小名

-视图的行使格局 和 table 同样 -格式:select * from 视图名

 select * from v_emp_10;

 

  • 修改视图 -格式:create or replace view 原视图名 as 新的子查询

    create or replace view v_emp_10 as
    (select * from emp where deptno=10 and sal<3000);
    

     

  • 视图的分类 -视图分为:简单视图和千头万绪视图 -轻易视图:在创建视图的子查询中 不包罗:关联查询、去重、函数、分组的视图称为轻易视图 -复杂视图:和轻巧视图相反

  • 对视图举行dml操作,只针对简单视图能够动用 因为复杂查询普通状态只是为了浏览数据的,没有要求也不能进行增加和删除改的操作

视图的字段 遵循原表字段的束缚 - 视图的多寡污染 假设往视图中插入一条在视图中不现实 不过在原表中呈现的数量,称之为数据污染,不建议如此操作 唯有insert命令才会产出数量污染,因为update和delete命令只好操作视图中有的数据

  • with check option create view vemp10 as select * from emp where deptno=10 with check option;

  • 视图的功能

    1. 重用子查询 进步开垦功用
    2. 限制数量的走访 举个例子:能够创建三个视图把原表的机敏新闻过滤掉就可以 
      create view v_emp as select empno,ename,deptno,comm,job from emp
      
  • 做事中对视图平常只实行DQL,不选取DML

  • 删去视图

    drop view vemp10;
    

     

    -案例:创制一个错综复杂视图:展现部门的平均薪俸,最高级技术员资,最低薪水,薪给总额,部门职员和工人人数;

    create view v_emp_deptinfo as
    select deptno,avg(sal),max(sal),min(sal),sum(sal),count(*) 
    from emp 
    group by deptno;
    

     

  drop database database_name;  //删除数据库

注意:

1、where后边无法写聚合函数,使用having

2、如若成立视图的子查询中使用了小名,则对视图操作时不得不选取外号

3、not null 不能够为空

4、unique 不可能再一次

5、primary key 主键,不可能为空,无法再度

6、auto_increment 自增

7、展现一行 select depto,group_concat from emp group by deptno;

1、 依据数据库的开荒进取时间顺序,重要出现了以下项目数据库系统:

 

目录原理

  1.1 DOS常用命令

Ø 网状型数据库

 

目录概述

  1. 目录是用来增长查询速度的本事
  2. 只要不利用索引mysql会从第一条数据依次今后查询,假诺数据量一点都不小,极其耗费时间
  3. 加多索引能够交给查询品质,不过假使数据量十分的小,增多索引大概会稳中有降功效
  4. 目录的扭转是数据库内部生成,借使查询数据时意识有个别字段已经增添过索引会自动使用

  5. 复合索引

    创制索引时只要设置八个索引字段 则称为复合索引

  6. 创设表的时候向来增添索引

    create table t11 (id int,name varchar(10), age int, index index_name(name(10)));
    

     

  7. 改变表的索引 

    alter table t11 add index index_age(age);
    

     

  8. 除去索引

    drop index index_age on t11;
    

     

    1.1.1 数据库命令

Ø 等级次序型数据库

读书就怕心浮气躁,有个三脚猫的功力,就感到什么都会了。                                                                                                                                                   ——  赠自身

目录计算

1. 索引不是越多越好 
2. 数据量小的时候不需要用到索引
3. 经常出现在 where、order by、 distinct的字段添加索引,效果会更好
4. 不要在经常做增删改的表中添加索引

      mysqld install      // 安装MySQL数据库服务

Ø 关系型数据库

 

MySQL 约束

                net start mysql 或 net stop mysql     // 运转或甘休MySQL服务

Ø 面向对象数据库

新手不挨训,怎么发展。

独一约束(UNIQUE)

如果数据库中的数据需要保证唯一性则添加此约束
CREATE TABLE T1( ID INT, AGE INT UNIQUE, NAME VARCHAR(20));

 

      mysql -u username -p  // 登陆MySQL管理种类  

地方4中数据库系统中,关系型数据库使用最为遍布。面向对象数据库则是由面向对象语言催生的摩登数据库,近期的有个别数据库系统,如:SQL Server 二〇〇五、Oracle10g等都初始增添面向对象的性子。

 

非空约束(NOT NULL)

如果某个字段的值不能为null 需要使用此约束

create table t2(id int,age int not null,name varchar(10));
-以下两种都不可以
insert into t2 (id,name)values(2,'a');
insert into t2 values(3,null,'b');

 

      use database_name;  // 援引数据库

二、常用基本SQL语句/语法

 
——数据库的基本概念

暗中同意约束(DEFAULT)

如果需要让某个字段插入数据时有默认值时使用此约束
create table t3 (id int,age int default 0,name varchar(10));

 

      show databases;    // 显示全体数据库

Ø SQL语句基础理论

一、定义:
    1、数据库指的是以一定艺术存款和储蓄在一同、能为多个客商提供共享,具备尽或许小的冗余度的特点,是与应用程序互相独立的数目集合。

主键约束(P陆风X8IMA揽胜极光Y KEY)

1. 非空、唯一
2.如何添加主键
-创建表时添加主键
    create table t4(id int primary key,age int );
    create table t5(id int,age int,primary key(id));
-创建表之后添加主键
    alter table t6 add primary key(id);
    alter table t6 modify id int primary key
-删除主键约束
    alter table t3 drop primary key;
-自增约束 auto_increment
1.当字段赋值为null的时候,字段自动增长 
2.如果删除了某一条数据 自增的数值不回减少
3.如果插入数据时指定了一个特别大的数,下次自增则从这个数基础上 1

 

      source path(.sql文件路线)  //导入数据库文件,生成数据库,即依据sql脚本生成数据库;比方:source F:mysql.sql

SQL是操作和寻找关系型数据库的正统语言,标准SQL语句可用于操作然后关系型数据库。

    2、数据库是比照某种数据结构(档期的顺序性,网状型,关系型)组织起来并存放二级存款和储蓄器(外部存储器)中的数据集结。这种多少集结具备如下特点:尽恐怕不另行,以最优办法为有个别特定组织的种种应用服务,其数据结构独立于采纳它的应用程序,对数码的增加和删除改查由统一软件进行政管理制和决定。

外键约束(FOREIGN KEY)

  1. 专业中,除非极度意况,平常不行使外键,使用代码通过逻辑实行限定
  2. 外键约束是有限协助一个或五个表之间数据的一致性和完整性的
  3. 表的外键日常选用的是另一张表的主键
  4. 外键能够再度、能够是null、但不得以是另一张表不设有的数目
  5. 动用外键约束的尺度 -必得保险两张表使用同样的积累引擎 -存储引擎必得是innodb,myisam不帮忙外键约束 -外键和涉及字段必得有类同的数据类型,数字长度必需一律 -外键约束对应的字段必得成立索引,假设不设有索引,mysql会活动创造索引

    1.1.2 数据表操作命令

正式的SQL语句平时划分为以下项目:

二、数据库发展阶段:
    1、人工管理阶段
    2、文件系统阶段
        文件分享性差,不轻松同步。
    3、数据库系统阶段

创设外键约束

1. mysql支持外键的列级语法,但是没有效果,是为了保证和sql的规范的一致性
2. 表级约束的添加方式
-格式:CONSTRAINT 约束名 FOREIGN KEY(当前表添加约束的字段名) REFERENCES 关联表表名(关联表的字段名)
create table classes(id int primary key auto_increment,name varchar(20));
insert into classes values(null,'一班'),(null,'二班');
CREATE TABLE student(
id INT AUTO_INCREMENT PRIMARY KEY,         
name VARCHAR(20),                                
class_id INT,
CONSTRAINT fk_class_id FOREIGN KEY(class_id) REFERENCES classes(id)
);
1.创建班级(classes)表 id name
2.创建学生表(student)id name classid
给classid添加外键约束 
3.先往班级表中插入数据 然后往学生表插入数据,

 

测量试验插入错数据 和删除 被提到的班级数据

      show tables;         // 呈现某数据库中全数表

查询语句:最首要由于select关键字完成,查询语句是SQL语句中最复杂,效率最丰盛的言语。

三、数据库体系:
    1、档期的顺序模型(树状结构)
    2、网状模型(只有概念,尚未落到实处)
    3、关系模型(一数据库中,二个表便是二个涉嫌)

CHECK约束

mysql语法支持,但是没有效果
create table t7(id int,name varchar(10),
age int,check(age>20));

 

      desc table _name;   //突显表的字段新闻

DML(Data Munipulation Language,数据操作语言)语句,这组DML语句修改后数据将保障较好的一致性;操作表的话语,如插入、修改、删除等;

四、常见的关系型数据库:
    1、SqlServer:
        微软旗下数据库
        适用于Windows平台
        服务器版供给付费
    2、MySQL
        属于Oracle公司
        质量较高
        社区版无偿
        体量小、速度快、总体具有费用低
        开源
        适用平台:
            Windows
            Linux
            Unix
    3、DB2
        IBM公司旗下数据库
            IBM1969年首次建议关系型数据库模型。
            IBM一九七二年提议了SEQUEL语言,即SQL语言的前身。

哪些是事情

事务是一组原子性的 SQL 查询, 或者说是一个独立的工作单元. 在事务内的语句, 要么全部执行成功, 要么全部执行失败

      show create table table_name;  //展现表的创办音信

DDL(Data Definition Language,数据定义语言)语句,操作数据对象的语言,有create、alter、drop。

五、从多少个地方学习数据库

事务的 ACID 性质

**必须背下以下4点 面试常考**
-原子性:最小的单元,不可分割
-一致性: 保证sql执行的一致 要么都成功,要么都失败,保证执行前后数据一致
-隔离性:多个事务并发时,互不影响
-持久性:commit提交之后,数据保存到数据库中

 

   1.2 查询关系运算符

DCL(Data Control Language,数据调节语言)语句,首要有grant、revoke语句。

    1、数据库是如何存款和储蓄数据的

MySQL事务

1.查看事务是否是自动提交
    show variables like '%autocommit%';
2.关闭自动提交
    set autocommit=0;

begin 开始事务
commit 提交事务
rollback 回滚事务

 

  • =、 !=、 <>、<、<=、>、>=;
  • between   ·····  and ········;
  • in(set) ; //set是集合
  • is null;is not null
  • and ;
  • or;
  • not;
  • like  '%三';          //%象征任性八个字符,_意味着猖狂单个字符

事情调整语句:首要有commit、rollback和savepoint三个基本点字完毕

        字段  记录  表 约束(主键、外键、唯一键、非空、check、default、触发器)

事务案例

转账案例:

1.创建user表
    create table user(id int,name varchar(20), money int);
    insert into user values(1,'苍老师',2000),(2,'刘老师',100);
2.转账sql
    update user set money=money 500 where id=2;
    update user set money=money-500 where id=1;

 

学科回想:

1.什么样是视图 实际上海广播台图正是一段sql语句

2.视图中多少实际上都以原表中的数据,假设改造视图中的数据 原表数据跟着变动

3.防止现身数据污染 能够透过增添 with check option 幸免出现数据污染

4.视图经常只举办询问操作

5.视图意义:子查询复用、限制数量的会见

6.索引index 须要调节 创设命令和删除命令

7.约束:unique、not null、primary key、default foreign key,check

8.事务 背下来第四次全国代表大会特点: 原子性、一致性、隔开分离性、长久性

day01:

数据库相关的sql:show databases create database db1 character set utf8 show create database db1 drop database db1;

表相关: create table show tables; show create table t1; desc t1; rename table t1 to t2; alter table t1 change age age2 int; alter table t1 modify age long first/after id; add age int; drop age; drop table t1;

insert update delete select

day02:

1.主键 自增 not null 注释:comment

2.去重 distinct

3.事务

4.sql分拣 ddl 数据定义语言 create alter drop truncate:删除表内全体数据,内部贯彻原理:先删除表再创制贰个新表 执行功用高 dml 数据操作语言 insert update delete select 支持工作 dql 数据查询语言:select tcl 事务调节语言:begin commit rollback dcl 数据调节语言:调节权限

5.数据类型 整数: int bigint 浮点数: double decimal(m,d)

6.字符串: char varchar text

7.日期:date time datetime timestamp

day03:

聚合函数:sum count avg min max

字符串:charlength instr(x,y) locate(x,y) insert(str,begin,length,newStr) lower upper left right substring(str,begin,length) trim() replace(str,old,new); repeat(str,2); reverse

日期相关:now date(now()) time(now()) extract(year from now()) month day time hour second minute dateformat(now(),'%Y-%m-%d %H-%i-%s') strtodate('','')

数学:  - * / % mod(2,3)
数学函数: floor  round() rand()

  1.3 内三番两次和外接连

DDL语句

    2、数据库是哪些操作数据的

练习

1.案例:创建一张表customer2,id number(4),
name varchar2(50),password varchar2(50)
,age number(3),address varchar2(50),修改
customer2表的时候设置主键约束
pk_id_name_cus2修饰id和name列。




2.案例:创建一张book3表,id number(4),
name varchar2(50),author varchar2(50),
pub varchar2(50),numinput number(10)。
修改book3的时候,设置主键约束
pk_id_name_b3修饰id和name列,设置唯一约束uq_author_pub_b3修饰author和pub列



3.案例:删除temp中的唯一约束uk_name_pwd

4.案例:在book表中author和pub列上添加索引index_author和index_pub


5.案例:删除book中在pub和author上的索引


6.案例:创建一个视图emp_view1,查询emp表中所有的数据,查询语句作为视图emp_view1


7.案例:创建一个视图dept_view,查询dept表中所有的数据,查询语句作为视图dept_view


8.案例:创建一个视图emp_view2,查询emp表中所有员工的编号,姓名,职位,工资,上级领导的编号以及工资的等级,该等级的最低工资和最高工资,查询语句作为emp_view2


9.案例:查询emp表中10,20号部门员工的编号,姓名,职位,工资,所属部门的编号,使用查询语句来修改视图emp_view1


10.案例:删除视图emp_view1,emp_view2

    >内连接:

DDL语句是操作数据库对象的口舌,包涵创制create、删除drop、修改alter数据库对象。

        insert、update、delete、T-Sql、存款和储蓄进程、函数、触发器

        select  t1.id,t1.name,t1.age,t2.score  from table1_name t1  join table2_name t2 on t1.id=t2.id

大范围数据库对象

    3、数据库是怎么着浮现数据的

        或:

对象名称

对应关键字

描述

table

表是数据库存储的逻辑单元,以行和列的形式存在;列是字段,行就是一条数据记录

数据字典

 

就是系统表,存储数据库相关信息的表,系统表里的数据通常有数据库系统维护。系统表结构和数据,开发人员不应该手动修改,只能查询其中的数据

视图

view

一个或多个数据表里的数据的逻辑显示,视图就是一张虚拟的表,并不真正存储数据

约束

constraint

执行数据检验规则,用于保证数据完整性的规则

索引

index

用于提高查询性能,相当于书的目录

函数

function

用于完成一个特定的计算,具有返回值和参数

存储过程

procedure

完成某项完整的业务处理,没有返回值,但可通过传出参数将多个值传个调用环境

触发器

trigger

相当于一个事件的监听器,当数据库发生特定的事件后,触发器被触发,完成响应处理

        select(注重的重大)

        select  t1.name,t1.age,t2.score  from table1_name t1 , table2_name t2 where t1.id=t2.id

下边包车型大巴靶子都能够经过用create、alter、drop达成有关的始建、修改、删除操作。

——数据库是怎么着消除多少存款和储蓄难题的

    >外连接:

常用数据类型

表的连锁数据

        select  t1.id,t1.name,t1.age,t2.score  from table1_name t1  left join table2_name t2 on t1.id=t2.id    //左连接

列类型

说明

tinyint/smallint/mediumint int(integer)/bigint

1字节、2字节、3字节、4字节、8字节整数,又可分有符号和无符号两种。这些整数类型的区别仅仅表现范围不同

float/double

单精度、双精度浮点类型

decimal(dec)

精确小数类型,相当于float和double不会产生精度丢失问题

date

日期类型,不能保存时间。当Java里的Date对象保存到该类型中,时间部分丢失

time

时间类型,不能保存日期。当Java的Date对象的保存在该类型中,日期部分丢失

datetime

日期、时间类型

timestamp

时间戳类型

year

年类型,仅保存年份

char

定长字符串类型

varchar

可变长度字符串类型

binary

定长二进制字符串类型,它以二进制形式保存字符串

varbinary

可变长度的二进制字符串类型,二进制形式保存字符串

tingblob/blob

mediumblob/longblob

1字节、2字节、3字节、4字节的二进制大对象,可存存储超图片、音乐等二进制数据,分别可存储:255/64K/16M/4G的大小

tingtext/text

mediumtext/longtext

1字节、2字节、3字节、4字节的文本对象,可存储超长长度的字符串,分别可存储:255/64K/16M/4G的大小的文本

enum(‘val1’, ‘val2’, …)

枚举类型,该列的值只能是enum括号中出现的值的之一

set(‘value1’, ‘value2’, …)

集合类型,该列的值可以是set中的一个或多个值

    字段(列)

        或:

Ø 常用查询

        二个事物的某四个静态特征(属性)。

        select  t1.id,t1.name,t1.age,t2.score  from table1_name t1 right join table2_name t2 on t1.id=t2.id    //右连接

MySQL停止符是“;”停止。

    记录(行)

        select  t1.id,t1.name,t1.age,t2.score  from table1_name t1 full join table2_name t2 on t1.id=t2.id    //全连接,MySQL不支持!

1、    展现全部数据库

        字段的重组,表示的是叁个有血有肉的东西

   1.4 数据库备份和东山再起

show databases;

    表

    a. 备份  

2、    删除数据库

        记录的咬合,表示的是均等体系事物的集纳

      mysqldump -u root -p123 database_name>d:myDBdemo.sql 

drop database dbName;

    表和字段、记录的关系

    b. 恢复

3、    创立数据库

        字段表示的是事物的性质

       mysql -u root -p123 database_name<d:myDBdemo.sql

create database [if not exists] dbName;

        记录代表的是东西自己

      或:

中括号部分可选的,推断该数量空头支票就创办

        表是事物的晤面

      步入需求还原到的目标数据库;

4、    切换、使用内定数据库

 

      source d:myDBdemo.sql

use dbName;

    列

 

5、    凸显当前应用数据库全数的表对象

        字段的另一称呼

二、基本表的创立

show tables;

    属性(列)

  2.1 创建表

6、    呈现表结构describe(desc)

        字段的另一种称谓

   数据类型:int,char,varchar,text(字符串类型),blob(字节类型);double(5,2)表示最多5位,在这之中2位小数。

desc tableName;

    元组(行)

    create table 表名

7、    创制一张表

        行、记录的另一种称谓

    (

create table user (

 

      字段名1 数据类型 [not null] [默认值],

        --int 整型

——MySQL数据库的下载和装置

      字段名2 数据类型,

        uId int,

安装完结后安装数据库字符集为UTF-8:
    查看字符集:show variables like 'character%';
    修改字符集:
        打开my.ini文件,在ini文件中#意味着注释。
        添加:default-character-set=utf8
                  character-set-server=utf8
    修改完结后重启服务器。

      字段名3 数据类型

        --小数

1、MySQL安装成功后会在四个目录中蕴藏文件
    >   D:Program FilesMySQL Server 5.6
        DBMS管理程序
    >   C:ProgramDataMySQL Server 5.6data
        DBMS数据库文件,卸载数据库时不会去除该目录,要求和睦手动删除。

    );

        uPrice decimal,

2、MySQL重要文件
    >   D:Program FilesMySQL Server 5.6binmysql.exe
        顾客端程序,用来操作服务器,但不能够不确定保障服务器已经运转才具三番两次数据库。
    >   D:Program FilesMySQL Server 5.6binmysqld.exe
        服务器程序,必得先运营它,然后客商端才具三翻五次服务器。
    >   D:Program FilesMySQL Server 5.6binmy.ini
        服务器配置文件。

  例如:

        --普通长度文本,default设置默许值

3、C:ProgramDataMySQLMySQL Server 5.6data
    该目录下的每一个目录都意味叁个数据库,比方该目录下有一个mysql目录,表达DBMS中有七个名叫mysql的databases。
    在各种数据库目录下会有0~N个扩充名叫frm的文件,每一种frm文件表示三个table,不要接纳文本编辑器张开。

    create table student

        uName varchar(255) default ‘zhangsan’,

4、my.ini
    配置MySQL的端口:默认为3306,
    配置字符编码:
        *   [client]下安插客户端编码:default-character-set=utf8
        *   [mysqld]下安插服务器编码:character-set-server=utf8
    配置二进制数据大小上限:
        *   在[mysqld]下配置:max_allowed_packet=8M

    (

        --超长文本

5、导出数据库及数量
    mysqldump -uroot -pAdmin123 mydb3 >f:sql1.sql

      stu_num int auto_increment,  //自增量

        uRemark text,

——MySQL数据库基本操作

      stu_name char(10) not null,

        --图片

1、服务器的运维与甘休
    在services中运维或终止。
    1)开启服务:net start mysql
    2)关闭服务:net stop mysql
    服务器:平素处于监听状态,等待接受命令
2、MySQL顾客端登陆
    mysql -uroot -p123 -hlocalhost
    >   -u:表示客商名
    >   -p:表示密码
    >   -h:表示主机(IP地址)
        *   root客户能够使用自便IP,普通顾客则绑定IP。
3、退出客商端
    exit、quit
3、查看数据库
    查看全数数据库:show databases;
    information_schema:提供访谈数据库元数据的法子。
    mysql:与数据库系统服务有关的数据。
    performance_schema:采摘服务器数据库质量的参数
    test:客户测验表。
            
翻开全体数据库:show databases;
切换来近日数据库:use 数据库名;
翻看当前数据库中全数表:show tables;
询问某表中的数据:select * from 表名;

      stu_gender char(2),

        uPhoto blob,

——管理数据库

      stu_score int,

        --日期

1、数据库相关概念
    1)数据库 DataBase
        分类:
            针对于系统数据库
                information_schema
                mysql
                performance_schema
                    用于帮助数据库系统常规运行的数据库。
            客商数据库:
                针对于特定类型必要所开创的数据库
        组成:
            逻辑结构:
                数据库汉语件的团伙结构。
            物理结构:
                存储在磁盘上的公文结构。
    2)数据库管理种类 DBMS
        DataBase Management System
        管理数据库的阳台:
        服务器
        客户端

      primary key(stu_num),  //主键

        uBirthday datetime

2、管理办法
        1)可视化管理
            举个例子navicat管理数据库
        2)SQL语言管理
            Structured Query Language
            针对于数据库操作的言语,程序开辟进度中所必要的语言。
            分类:
                DDL:Data Description Language,数据定义语言
                    用于成立,从无到有。

      foreign key(stu_name) references anotherTable_name(stu_name)  //外键

);

                    对数据库或表的构造进行操作。

    );

8、    子查询建表方法

                DML:Data Manipulation Language,数据操作语言
                    操作数据库,举个例子增加和删除改。
                    insert  delete  update 

  2.2 常用约束

一对列名相配形式:

                DQL:Data Query Language,数据查询语言
                    select  查询

      主键约束: primary key(字段名);  //或在概念字段时直接在后面扩展 primary key

create table userInfo (

                DCL:Data Control Language,数据调控语言
                    对顾客的开创及授权。
                    revoke  create  table  from  user1

    外键约束: foreign key(字段名) references 表名(字段名);

name varchar(20),

                DAC:Data Administrate Command,数据管理命令。

    非空约束: 字段名 数据类型 not null

sex char

                TCC:Thing Control Command,事务调整命令。

    独一性约束: 字段名 数据类型 unique

)

3、数据库的保管表达
    1)成立:create database 数据库名;    创制在暗中认可data目录下。
    2)删除:drop database 数据库名;

    默许约束: 字段名 数据类型 default 默许值

as

——管理表

    自增量: 字段名 数据类型 auto_increment  //默许开头值为1,增量为1;如需从100开端,能够设置为auto_increment=100

select name, sex from user;

1、表的相关概念
    关周全据库(Relational DataBase, 科雷傲DB):就是基于关系模型的数据库,在管理器中,关周全据库是数量和数据库对象的组成关系型数据库基础数据是数据表。

  2.3 修改表

上边的列名和子查询的列名以及项目要对应

2、实体
    数据表是由行row和列column组成的二维表,每行描述三个实体,数据表中的列经常叫做字段,他代表数据表中存储实体的共有属性。
    属性值的不等代表差别的实体。
    数据表中积攒的多少正是全部分化属性的的不等实体的联谊。

    alter table 旧表名 rename 新表名  //修改表名

全副列名情势:

3、数据表的田间处理
    设计某类实体具有何样属性(字段)、表结构
        类似于统一策动类,该类具备哪些属性。
        依据项目实在须要设计怎样表,每一种表满含怎样字段。
    对质量有何限定条件——约束。

    alter table 表名 modify 字段名 数据类型;  //修改字段数据类型

create table userInfo

    数据类型:
        整型:
            int
                占4个字节。
            tinyint
                占1个字节,在数据库优化的时候能够应用tinyint。
        浮点型:
澳门新萄京官方网站,            float / double
                double(5, 2)表示最多5位整数,个中必须有2位小数,即最大值为999.99
        浮点型:
            decimal(6,2)
                用于开展十进制运算,正确度高,不会扬弃二进制数据,常用于表示金额。
                一共六个人数,小数占2位。
                此时decimal占8个字节。
                在筹算数据库时要在乎不要浪费空间。 
        日期:
            date:
                占3个字节。
                日期类型,无法保留时间
                格式:YYYY-MM-DD
                范围:1000-01-01 到 9999-12-31
                假如越过范围,则存款和储蓄0000-00-00
            time:
                占3个字节。
                时间项目,无法保留日期
            datetime:
                占8个字节。
                日期、时间项目,即年月日时分秒
            timestamp:
                占4个字节,而且能够代表年月日时分秒.
                能够代表阿秒。
                ts timestamp default CURRENT_TIMESTAMP(这是三个常量,表示系统当下岁月。)
                因为timestamp也能够表示年月日时分秒,何况所需空间是datetime的四分之二,所以在统一准备数据库时得以用时间戳表示时间
            year:
                表示年,占1个字节,范围是一九零二-2155年,若无则0000。
        字符:
            char(m)
                m指的是字符数,并非字节数。
                定长字符串,数据长度相差钦定长度,会活动补足到钦定长度。
                最大值为255。
                日常用于保存时间等稳固长度字符串。
            varchar
                可变长度字符串类型,最大值为65535。
                会单独采用二个字节保存字符串长度。
        大字符串类型(CLOB):(MySQL独有)
            tinytext:2^8-1B  255
            text:2^16-1B  65535
            mediumtext:2^24-1B  3KB
            longtext:2^32-1B  4GB
        BLOB:(大字节类型)

    alter table 表名 change 旧字段名 新字段名 新数据类型  //修改字段名

as

    注意:数据库优化
        当每一条记下都以定长数据时,会小幅度的升高数据库的物色功效。
        因为每一行的长短都以固定的,所以寻觅时的定址、寻址异常快。
        当存在多少浪费和频率增高三种情状还要设有是,以成效为准。(不能够浪费太多)
        时间与上空是一对抵触体,无非是光阴换空间,可能空间换时间。
        当数码表中的某一列影响了整机进程并且无法张开空间优化时,何况该列修改频率也不高,
        那么可以将该列单独收取存为一张表。
        在开采进度中,数据库优化往往是把频仍用到的新闻囤积到一张表中,优先思量寻觅功用。
        一时用的音信和相比较并吞空间的消息,优先思念空间攻下,单独存款和储蓄到别的一张表中。
        而且日常时间并不采用datetime存款和储蓄,而是使用时间戳,因为datetime固然直观,但不平价计算,影响功能。

    alter table 表名 add 新字段名 数据类型  //加多字段

select * from user;

4、SQL管理表结构
    1)建表语法
        use 数据库名;
        create table [if not exists] 表名
        (
            id int not null,
            name varchar(20) not null
        );

    alter table 表名 drop 字段名  //删除字段

直白将整体表的项目和数据备份到新表userInfo中

    2)查看表结构
        desc t1;    description描述
        查看表结构。
        show create table t1;
        查看创设表的长河。

    alter table 表名 AUTO_INCREMENT=100  //设置自增量开始值为100

9、    增多表字段

    3)列的特点
        是还是不是为主键
        是或不是为空
        是还是不是为自动增进列
        是不是有暗中同意值

   2.4 删除表

增加单列

        以上特征都属于数据表的封锁

    drop table [if exist] 表名;

alter table user add tel varchar(11) default ‘02012345678’;

    4)表字段修改
        修改字段定义:
            修改数据类型用modify
            alter table 表名
            modify 字段名 数据类型;
 
        修改字段名用change
            alter table 表名;
            change 旧字段名 新字段名 新数据类型;
 
        扩充字段:
            alter table 表名 
            add 字段名 数据类型 (完整性约束标准)

三、视图的创制

增加多列

            /*假诺想在率先个职位增添字段,须要在数据类型前面加上first*/
            /*澳门新萄京官方网站MySql学习笔记06,MySQL学习笔记。假设想在钦命地方增添,能够使用after 字段名;   在该字段之后增加*/

    create view view_name(字段名,字段名,字段名)

alter table user

        删除字段:
            alter table 表名 drop 字段名;

    as <select查询语句>

add (

        删除表:
            drop table 表名;

  例如:

photo blob,

5、管理约束
    概念:
        对三个表中的性质操作的限量叫做约束。
        约束是数据库提供的全自动强制数据完整性的一种艺术,它是透过定义列的取值准绳来维护数据的完整性。
    数据完整性:
        实体完整性:要求数据表中不可能冒出重复行(完全同样数据行)
        域完整性:域,范围,其实正是性质,供给列的数据类型,取值范围,特定值等契合规定须要
        引用完整性:需要三个或四个以上表之间的关系,关连串在数值上保持一致。
        自定义完整性:针对于具身体表面的求实规定。
    约束类型:
        1)主键约束
            primary key
            维护实体完整性
            该字段独一,况兼不能够为null
            常常是一向不工作含义的数码做主键
            含有主键的表叫做主键表

    create view stu_sub(stu_num,stu_name)  //创设视图

birthday date

            主键日常都是整数,不建议选拔字符串当主键(假设主键是用来集群式服务,能够虚构用字符串当主键)。

    as select stu_num,stu_name

);

            主键的值日常差异意修改,除非本记录被剔除。

      from student;

地方就同有时间扩张了多列字段

        2)外键约束
            foreign key
            维护引用完整性
            不是本表的主键,但却是另一个表的主键。
        问题:

    drop view stu_sub;  //删除视图

10、    修改表字段

            假诺删表,先删主键表依然先删外键表?

四、触发器

修改tel列

        答案:先删外键表

    create trigger trigger_name  //创制触发器

alter table user modify tel varchar(15) default ‘02087654321’;

            如若先删主键表,会报错,因为那会促成外键表中的数目援用退步。

    on table(表名)

修改tel列的地方,在率先列展现

            假诺外键表存在,则主键表不能够删除。

    for insert|delete|update

alter table user modify tel varchar(15) default '02087654321' first;

        3)独一约束
            unique
            维护实体完整性
            和主键的区分:unique允许有且只有二个null(Oracle中允许null 重复)

    as <sql_statement>(sql语句)

修改tel列的职位,在钦定列之后显得

            二个表中能够有八个unique列。

  例如:

alter table user modify tel varchar(15) default '02087654321' after age;

        4)检查约束
            check
            维护数据完整性
            在MySQL中数据库引擎会深入分析check语句,然则会忽略check约束。
            所以有关字段范围的操作,能够在前后相继中限定。
        5)私下认可约束
            default
            维护域完整性
        6)非空约束
            not null
            维护域完整性
            如果不加约束,暗许同认为空。
        7)自动增进列
            auto_increment
            能够自行增进的项目必需是整型
            默认从1开始
            假如想改动开首值,代码如下:
            create table 表名
            (
                id int primary key auto_increment
            )auto_increment=20160001;
            那样就将机关增加的初阶值改为201五千1了。
            修改约束:
                alter table 表名
                auto_increment = 1001;

    create trigger student_backup  //学生备份表随学生表的更改而改换

留心:alter modify不援救一回修改多个列,可是Oracle帮助多列修改

6、如何设计主外键:

    on student        

而是MySQL能够透过多少个modify的章程形成:

    create table product

    for insert,delete,update

alter table user

    (

    as

modify tel varchar(15) default '02087654321' first,

        pid int not null default 0,

    begin

modify name varchar(20) after tel;

        name varchar(10) not null default '',

      if((select count(*) from deleted) > 0)

11、    删除钦点字段

        price int,

      begin

alter table user drop photo;

        store int

        delete from student_backup

12、    重命名表数据

    );

        where stu_name in(select stu_name from deleted)

表重命名

 

      end

alter table user rename to users;

    create table sale

      if((select count(*) from inserted) > 0)

字段重命名

    (

      begin

alter table users change name u_name varchar(10);

        sid int not null default 0,

        insert into student_backup

alter table users change sex u_sex varchar(10) after u_name;

        pid int not null default 0,

        select *

假若须要更改列名提议使用change,假诺急需转移数据类型和出示地点能够行使modify

        salecount int default 0,

        from inserted

13、 删除表

        saledate date default '0000-00-00'

      end

drop table users;

    );  

    end

drop删除表会删除表结构,表对象将海市蜃楼多少中;数据也不会存在;表内的靶子也不设有,如:索引、视图、约束;

/*

       

truncate删除表

-- 成立外键表

五、事务

truncate都被当成DDL出来,truncate的效果正是去除该表里的所有事数量,保留表结构。也正是DDL中的delete语句,

商品表中pid是商品编号,应该是独一的,在商品表中pid应该安装为主键,

  5.1 事务四大特点

唯独truncate比delete语句的快慢要快得多。但是truncate无法带条件删除钦定数量,只会去除全部的数量。借使剔除的表有外键,

在出售表中,只要迈出一件货品,就必要在出卖表中增多一条记下,因为三个货物能够卖数十次,

    原子性;

剔除的快慢类似于delete。但新本子的MySQL中truncate的进度比delete速度快。

所以该表中pid允许再一次,所以pid无法作为该表的主键,可是她在商品表中作为主键,

    一致性;

Ø 约束

故而pid能够当做sale表中的外键。

    隔离性;

MySQL中约束保存在information_schema数据库的table_constraints中,能够由此该表查询约束消息;

*/

    持久性。

封锁首要成就对数码的核查,保障数据库数据的完整性;要是有互相信赖数据,保障该数量不被删除。

7、SQL管理约束
    加多约束:
        创设表时加上
            非空约束
                not null

  5.2 事务隔断等级

常用五类约束:

                日常不钦命列为null值,因为不易于相比与查询。

    赃读:二个事务A读取另贰个事务B未提交的数量;

not null:非空约束,钦命某列不为空

                因为null是一连串型,相比时只可以用特地的is null和is not null进行相比,费时费事,要是运用运算符举行相比较,则一律重回null,功能不高且不低价数据库优化(影响索引效果)。
                因而在建表时,平时钦命not null default ’ ’ 恐怕default 0。

    不可重复读:贰个事务A读取另叁个事务B提交后的多寡(update);

unique: 独一约束,内定某列和几列组合的数码无法再一次

            主键约束
                primary key,主键默许非空。
            独一约束
                直接写
            缺省封锁
                default '男'
            自动增加列
                auto_increment
                创造表后加多
                    格式
                        alter table 表名
                        add
                            constraint 约束名
                            具体约束表达;
            外键约束
                格式
                    alter table 外键表名
                    add constraint 约束名    (fk_主键表_外键表_外键)
                    foreign key(外键)references 主键表(主键)
                删除此而外键约束:
                    alter table 表名 drop foeign key 外键小名;

    虚读(幻读):一个事务A读取另几个事务B插入的数额(insert),前后不等同。

primary key:主键约束,钦赐某列的数量不能够再度、独一

——数据库操作

    以上气象均为事务A已开启,但未提交时发出!

foreign key:外键,内定该列记录属于主表中的一条记下,参照另一条数据

    增加和删除改中都不会师世table关键字。

    多少个等级:

check:检查,钦定一个表明式,用于核准钦命数量

    增:
        1、insert [into] <表名> [(列明)] values<(值列表)>
            < >必写、[ ] 可选,最棒都写,方便移植。
            能够不点名列名,但是值列表中值的各样必得与表中字段顺序保持一致。
            能够钦定列名,并且不依据数据库表中字段顺序插入,不过值供给和点名列名保持一致。
        2、对于活动拉长列的拍卖:
            1)能够钦赐自动拉长列的数值。
                insert into t1 values(10,'qq',21,2);
            2)假设不点名,则根据前段时间列的最大值自动扩充。
                insert into t1 (name,age,class)values('dd',19,5);
            3)能够以钦赐自动增进列,赋值时赋null,依旧自动增加。
                insert into t1 (id,name,age,class) values (null,'qq',21,2);
            4)不钦点列,况兼自动增进赋null。
                insert into t1 values(null,'aa',21,2);
            只要插入值和插入列不相配,就要钦点列。
        3、当存在暗中认可值时,有三种插入格局:
            1)内定全部值
            2)指定列,指定值
            3)使用default关键字来钦命使用暗中认可值。
        4、三回性插入多行
            insert into 表名 values (值列表1),(值列表2),(值列表);

    1* read uncommitted :赃读,不可重复读,虚读都有一点都不小希望产生;

MySQL不援助check约束,但足以选取check约束,而未有别的作用;

    改
        修改数据
            日常依据主键来修改,因为主键是独一的。
            语法
                修改单列值:
                    update 表名
                    set 字段名 = 修改的值
                    where 字段名 = 值;

    2* read commited :制止赃读。不可重复读,虚读都有相当的大可能率产生;

凭借约束数据列限制,约束可分为:

                修改多列值:
                    update 表名
                    set 字段名1 = 值1,字段名2 = 值2
                    where 字段名 = 值;

澳门新萄京官方网站MySql学习笔记06,MySQL学习笔记。    4* repeatable read :幸免赃读,不可重复读。虚读有非常的大希望发生;

单列约束:每一种约束只约束一列

                多条件
                    where 字段名1 = 值1 and 字段名2 = 值2; 

    8* serializable :幸免赃读,不可重复读、虚读;

多列约束:每一种约束约束多列数据

    删
        delete from 表名
        where 删除条件
            删除表中数据,保留表结构。
            事务提交后才生效,不然回滚。
            借使有对应的触发器,会重罚实行。

    品级越高,安全性越高,质量越差!

MySQL中约束保存在information_schema数据库的table_constraints中,能够透过该表查询约束音信;

        delete from 表名
            删除表中全体数据,保留表结构,记录日志。
        
        truncate 表名
            删除表中数据,保留表结构。
            不记录日志,删除后不足苏醒。
            删除后一定于保留表结构,全数境况回涨到后期。(无数据,也就是格式化)
            truncate属于DDL,数据定义语言。
    
        drop table 表名
            直接从数据库中删除表。

   5.3 查看和安装职业等级

1、    not null约束

——单表查询

    查看当前事情隔开分离品级:select @@tx_isolation;  //dos命令

非空约束用于确定保证当前列的值不为空值,非空约束只好出现在表对象的列上。

    1、查询和记录集的定义
        查询:在现成的数据表中过滤切合条件的音信。
        记录集:查询的结果日常堪称“记录集”,记录集平日是贰个设想表。

    设置职业隔开分离等第:set transaction isolation level 多个等级之一;  //dos命令

Null类型特征:

    2、基本select查询语句
        语法格式:
                select 列名 from 表名
                where 查询条件表达式
                group by 属性名1 having 条件表明式    -- 用于分组
                order by 排序的列名 asc | desc;  -- 用于排序
        查询表中全部列:
                select * from 表名;
                查询全部列,顺序遵照表的本来面目顺序呈现。
                select 列名2,列名1 from 表名,调解列名的依次。
        查询表中有的列:
                select 列名1,列名2 from 表名 where 条件;
                在询问全数记录的根基上过滤新闻。
                条件大小顺序不可能改变,必得扩大。
                条件:
                        比较
                        钦点范围:between and  /  not between and
                            能够and五个典型化
                        钦定集结:in  /  not in
                        相称字符:like  /  not like
                            %:相称任意多少个字符
                            _: 匹配任意一个字符
                             [a-f]

    设置隔断等第,必需在开启事务以前!

抱有的项目标值都足以是null,蕴涵int、float等数据类型

                                可以是字符列[a-f]中的率性三个字符。

    

空字符串“”是不等于null,0也不等于null

                                --查询ename字段中第二个字符是A到F中放肆二个单一字符的职工音讯。

    

create table temp(

                                    select * from emp

 

        id int not null,

                                        where ename like '_[A-F]%' 

        name varchar(255) not null default ‘abc’,

                            [a,f]

        sex char null

                                能够是a或f的单一字符。

)

                                --查询ename字段中第一个字符是A或F的职工音信。

地点的table加上了非空约束,也可以用alter来修改或扩展非空约束

                                    select * from emp

增添非空约束

                                        where ename like '_[A,F]%' 

alter table temp

                            [^a-c]

modify sex varchar(2) not null;

                                不在字符列中的大肆三个字符。

撤除非空约束

                                --查询ename字段中第二个字符不在A到F的限量内的职工消息。

alter table temp modify sex varchar(2) null;

                                    select * from emp

打消非空约束,扩展默许值

                                        where ename like '_[A-F]%'

alter table temp modify sex varchar(2) default ‘abc’ null;

                        注意:匹配的标准必需用单引号括起来。(单引号代表字符串,双引号表示一个对象的名字)

2、    unique

                        --倘使要查询% _ 通配符等特殊字符,能够运用:

独一约束是钦定table的列或列组合不可能再度,有限支撑数据的唯一性。即使唯一约束不容许出现重复的值,可是可感到两个null

                            select * from emp

同三个表能够有八个唯一约束,七个列组合的束缚。在开创唯一约束的时候,假设不给独一约束名称,就暗中认可和列名同样。

                                where ename like '%%%' escape ''

独一约束不只好在三个表内创造,并且能够同有的时候间多表创立组合独一约束。

                            --当中escape关键字将''转变到“转义字符”,使 '' 之后的字符不再是本来意义。

MySQL会给独一约束的列上暗许创立八个独一索引;

                        是还是不是为空值:is null  /  is not null
                        多少个查询条件:and  /  or                 

create table temp (

        使用distinct关键字屏蔽重复数据:
                select distinct 列名 from 表名;
                    对点名列屏蔽重复值。

        id int not null,

        使用limit关键字查询表中限定行:
                select * from 表名 limit m,n
                m是开端记录,从0起始,n为查询的记录数
                当m为3时,从第4条记下伊始,显示五行。
                不点名起初地方时,暗中同意从记录第一行初阶。

        name varchar(25),

            公式:(当前页-1) * 每页记录数,得出的就是起头行

        password varchar(16),

    3、对查询结果举办排序
        select 列名 from order by 排序字段 排序格局
        order by 放在查询的最后面。
        order by暗中认可升序排序。
                asc:升序    desc:降序
        还足以按多列举行排序,当当中三个队列值同样有时间按另一列排序(多门课程成绩)
                order by sclass,sbirthday;    -- 先遵照班级排序,当班级同样临时候,再根据出生之日排。

        --使用表级约束语法,

——分组总计与多表关联合检查询
    1、聚合函数
        where中不能够包蕴聚合函数。
        凡是聚合函数,重临的都以单值。
            sum
            avg
            max
            min
        以上各个聚合函数通用特点:
            select 聚合函数(列名) from 表名

        constraint uk_name_pwd unique(name, password)

            count
                总结记录数,不过不记录null。
                count(*)   count(列名)

);

    2、分组查询
        --分组查询只可以突显分组之后的完全新闻,不能够呈现组内部某一字段的信息。
        语法:
                select 字段列表 [聚合函数] from 表
                [where 条件]
                group by 字段列表
                [having 筛选标准]
                [order by 排序字段]

代表客户名和密码组合无法重复

        单列分组:
                对中间一列分组,对另一列进行总结。
                查询项只含有分组列和计算列。
                例:总括教授表中各岗位的平均年龄。
                        -- 计算教授表中各职位的平均年龄

加多独一约束

                        select tjob,avg(tage) from t_teacher

alter table temp add unique(name, password);

                        group by tjob;
                        总计学生表中各班级人数
                            -- 总结学生表中各班级人数

alter table temp modify name varchar(25) unique;

                            select sclass,count(*) from t_student

去除约束

                            group by sclass 

alter table temp drop index name;

        多列分组:
                对多列进行分组,对另一列实行计算。
                对分组列按梯次实行分组总结,先对tjob实行分组,再对tsex进行分组。
                select tjob,tsex,avg(tage) from t_teacher
                group by tjob,tsex;
        HAVING:    
            使用having子句对分组音信重新过滤。
            筛选分组后的新闻。
            必得协作group by使用。
            having语句可以遵照select字段名举行过滤,能够用聚合函数举办过滤,不得以应用小名和歪曲查询进行询问。

3、    primary key

            having中不得不查询组的总体音信,但无法查询组的详细消息。
             where必需写在having前边,顺序不可秦伯嫁女,不然运营出错。

主键约束也正是独一约束 非空约束的三结合,主键约束列不允许再一次,也不允许出现空值;即使的多列组合的主键约束,

        对分组结果进行排序:
            order by放在查询语句的最后。

那就是说这么些列都不容许为空值,並且结合的值不容许再一次。

        select语句中查询列必需在聚合函数中或group by中。
            
    3、条件总括
        where
            针对于表中装有音信实行筛选。
        having
            针对于分组后的新闻进行筛选。

每个表最多只同意一个主键,创立主键约束可以在列等第创建,也足以在表等第上创制。MySQL的主键名总是PPRADOIMA本田CR-VY,

    4、多表关联合检查询
        1、使用多表关联合检查询的案由:
                查询的新闻布满在三个表中。
                多少个表四个延续条件,七个表七个延续条件。
        2、交叉连接
                获得的结果是贰个笛Carl积,是多少个表记录的穿插乘积,列是三个列表的会见。
                一旦表名内定了外号,则整个询问必得选拔小名。
        3、内连接
                语法
                        join on法
                            select 字段名
                            from 表1 inner join 表2
                            on 表1.字段名 = 表2.字段名
                            where 筛选规范
                            order by 排序列
                            条件运算符 = 或 <>
                        说明
                            列名能够试表1和表第22中学的大肆字段。
                            若查询列现身共有字段则必得内定该字段取自哪个表,格式是:表名.列名。
                            表1.列名 = 表2.列名:使用五个表共有的字段建构联系。
                            能够钦点表的外号,一旦钦命别称后,全部出现表名的地方都要动用别称。
                        where条件法
                            select 字段名 from 表1,表2
                步骤总括
                    列出查询字段
                    观望询问字段在什么样表中
                    提取个表的公物字段作为接二连三条件
                    分析条件
        4、外连接
                左外连接
                    什么人做主表,哪个人的新闻全体出示,即使音信不包容,则右表音讯显示null。
                        语法
                            select 字段名 from 左表 left [outer] join 右表
                                on 左表.列名 条件运算符 右表.列名
                                where 条件
                            含义
                                左外连接是以左表为主表,去老是右表(从表),结果聚焦包涵主表全部数据行,假诺主表的某行在从表中没
                                有相当时,则从表的抉择列为null值。
                                例如:
                                        以学员表作为主表,连接战表表。
                右外接连
                    主从表与左外连接相反。
                    
——子查询
    1、子查询的概念
        倘使一个select语句能够回到二个单值或一列值并嵌套在二个select、insert、update或delete语句中,则称之为子查询也许
        内层查询,而带有多个子查询的语句则改为主查询或外层查询。
        实施进程:
            先实施子查询,再施行主查询。
        难点深入分析:
            查询出出生之日期小于小Miko技董事长雷军的学员新闻:
                第一步:
                        深入分析查询字段-学生表的有所新闻字段。
                        select * from student
                第二部:
                        深入分析查询条件,出出生之日期小于小Miko技董事长雷军的出寿辰期。
                        where birthday < (雷布斯的出寿辰期)
                第三部:查询雷布斯的出生日期。
                        select birthday from student
                        where name = '雷军'
    2、子查询的归类
        1)相比子查询
            带有相比运算符的查询
                单值相比查询
                    where id = (子查询)
                批量比较子查询
                    澳门新萄京官方网站 1
                    语法:
                        select 字段名 from 表名
                        where 字段名 相比运算符 any | all ( 子查询 )
                    说明:
                        在蕴藏any或all运算符的子查询中,子查询的结果是一个汇集,在选用时必需同一时间接选举择相比较运算符。
                    示例:
                        在学员表中查询比2班中某一上学的小孩子出生日期小的学员消息。
                            select * from student
                            where birthday < any
                            (
                                select birthday from student
                                where class = 2
                            );
        2)带有in或not in的子查询
            语法:
                select 字段名 from 表名
                where 字段名 [not] in (子查询)
                示例:
                    查询选修了课程的学习者音信
                    select * from student
                    where sid in 
                    (
                        select sid from score
                    )
        3)连接查询和子查询的总括
            连接查询:
                查询的字段存在于七个表中
                    首先分析查询字段
                    再查看查询字段布满的表
                    然后搜索表之间的公家字段(创立连接的原则)
                    最后再分析任何规范
            子查询:
                查询的字段在同三个表中
                    首先深入分析查询字段
                    再深入分析查询条件
                    然后找寻查询条件用到的字段
                    再深入分析该字段关联的表

当创造主键约束时,系统暗中同意会在所在的列和列组合上确立相应的独占鳌头索引。

——函数
    具备一定功能的方法    
    常用在成立表和查询表中。
    
    mod(x,y)
    rand()
    round(x,y)

列模式:

    curdate()
    curtime()
    now()
    datediff(expr1,expr2)

create table temp(

    concat(str1,str2)
    lower(str)
    upper(str)
    length(str)
    trim(str)
    replace(str,oldstr,newstr)
    substring(str,pos,len)

    /*主键约束*/

    database()
    version()
    user()

    id int primary key,

    常用函数  

    name varchar(25)

        -- database()

);

        -- 重临当前多少库名

create table temp2(

        select database();

    id int not null,

 

    name varchar(25),

        -- version()

    pwd varchar(15),

        -- 重临当前数据库版本

    constraint pk_temp_id primary key(id)

        select version();

);

 

结缘方式:

        -- user()

create table temp2(

        -- 返回当前报到顾客名

    id int not null,

        select user();

    name varchar(25),

 

    pwd varchar(15),

        -- inet_aton(ip)

    constraint pk_temp_id primary key(name, pwd)

        -- 再次来到IP地址的数字代表情势

);

        select inet_aton('192.168.1.127');

alter删除主键约束

 

alter table temp drop primary key;

        -- inet_ntoa(ip)

alter增添主键

        -- 重返数字代表的IP地址

alter table temp add primary key(name, pwd);

        select inet_ntoa(3232235903);

alter修改列为主键

 

alter table temp modify id int primary key;

        -- password(str)

安装主键自增

        -- 再次来到字符串str的加密版本,加密是单向的(不可逆),适用于MySQL数据库的客户密码加密,44人稳固长度。

create table temp(

        select password('aaa');

        id int auto_increment primary key,

 

        name varchar(20),

        -- md5(str)

        pwd varchar(16)

        -- 再次来到字符串str的MD5值,该值以32人十六进制数字的二进制字符串的格局再次回到。

);

        select md5('aaa');

auto_increment自增形式,设置自增后在插入数据的时候就无需给该列插入值了。

    字符串函数

4、    foreign key 约束

        -- concat(str1,str2)

外键约束是承接保险二个或多个表之间的参照他事他说加以考察完整性,外键是营造于二个表的三个字段或是三个表的多个字段之间的参照关系。

        -- 连接字符串,重回多个子串。

也正是说从表的外键值必需在主表中能找到也许为空。

        select concat('aaa','222');

当主表的笔录被从表参照时,主表的笔录将分歧意删除,若是要去除数据,须要先删除从表中信任该记录的数量,

    

接下来才可以去除主表的数额。还也许有一种正是级联删除子表数据。

        -- insert(str,pos,len,newstr)

留心:外键约束的参照列,在主表中引用的只可以是主键或独一键约束的列,假定引用的主表列不是独一的笔录,

        -- 将字符串str从第pos地方上马的len个字符替换为新串newstr

那正是说从表引用的数额就不分明记录的岗位。同三个表能够有三个外键约束。

        select insert('aaaaaa',1,4,'ss')

始建国门外键约束:

        -- 假若新串长度不足len,则将len长度的字符串全体替换为newstr

主表

        select insert('aaaaaa',1,4,'ss')

create table classes(

        str = ssaa

        id int auto_increment primary key,

        -- 假使newstr长度超越len,则将newstr全体插入内定地方,固然高出长度。

        name varchar(20)

        select insert('aaaaaa',1,4,'sssss')

);

        str = sssssaa

从表

        

create table student(

        -- lower(str)

        id int auto_increment,

        -- 转变来小写

        name varchar(22),

        select lower('AAA');

        constraint pk_id primary key(id),

        

        classes_id int references classes(id)

        -- upper(str)

);

        -- 变换来大写

平常先建主表,然后再建从表,那样从表的参照援用的表才存在。

        select upper('aaa');

表等第创制外键约束:

        

create table student(

        -- length(str)

        id int auto_increment primary key,

        -- 获取字符串长度

        name varchar(25),

        select length('aa');

        classes_id int,

        

        foreign key(classes_id) references classes(id)

        -- char_length(str)

);

        -- 重回字符串str的长短

地点的创导外键的格局未有一点名约束名称,系统会默许给外键约束分配外键约束名称,命名称为student_ibfk_n,

        select char_length('aa');

中间student是表名,n是当前封锁从1起来的卡尺头。

        

点名约束名称:

        -- lpad(str,len,padstr)

create table student(

        -- 再次回到字符串str,其左边由字符串padstr填补到len字符长度。

        id int auto_increment primary key,

        select lpad('aaaaa',5,'c');

        name varchar(25),

        -- 当str不满意len长度时,才会选取padstr填补,假如str超过len长度限制,则不开展填空。

        classes_id int,

        

        /*钦点约束名称*/

        -- rpad(str,len,padstr)

        constraint fk_classes_id foreign key(classes_id) references classes(id)

        -- 与lpad相反。

);

        

多列外键组合,必须用表等第约束语法:

        -- trim(str)

create table classes(

        -- 去掉字符串两侧的空格。

        id int,

        select trim('  a');

        name varchar(20),

        

        number int,

        -- repeat(str,count)

        primary key(name, number)

        -- 重返str重复count次的结果。

);

        select repeat('a',5);

create table student(

        

        id int auto_increment primary key,

        -- replace(str,from_str,to_str);

        name varchar(20),

        -- 用字符串to_str替换字符串str中具备的字符串from_str

        classes_name varchar(20),

        select replace('aabbccdd','bb','ss');

        classes_number int,

        

        /*表等第联合外键*/

        -- substring(str,pos,len)

        foreign key(classes_name, classes_number) references classes(name, number)

        -- 再次来到从字符串str的pos地方起len个字符长度的子串。

);

        select substring('aaabbbccc',3,2);

去除却键约束:

    时间函数

alter table student drop foreign key student_ibfk_1;

        -- curdate()

alter table student drop foreign key fk_student_id;

        -- 再次来到当前几天子 年月日

追加外键约束

        select curdate();

alter table student add foreign key(classes_name, classes_number) references classes(name, number);

        

自引用、自关联(递归表、树状表)

        -- curtime()

create table tree(

        -- 重回当前光阴 时分秒

        id int auto_increment primary key,

        select curtime();

        name varchar(50),

        

        parent_id int,

        -- now()

        foreign key(parent_id) references tree(id)

        -- 重回当前的日子和时间

);

        select now();

级联删除:删除主表的数量时,关联的从表数据也删除,则必要在创制外键约束的背后增添on delete cascade

        

或on delete set null,后面一个是级联删除,后面一个是将从表的关联列的值设置为null。

        -- week(date)

create table student(

        -- 重返内定日期为一年中的第几周

        id int auto_increment primary key,

        -- 其中date可以是date time datetime timestamp

        name varchar(20),

        select week(timestamp(now()));

        classes_name varchar(20),

        

        classes_number int,

        select timestamp(curdate())

        /*表等第联合外键*/

        

        foreign key(classes_name, classes_number) references classes(name, number) on delete cascade

        -- year(date)

);

        -- 再次来到钦命日期的年份

5、    check约束

        select year(now());

MySQL能够选择check约束,但check约束对数听别人讲明未有另外成效。

        

create table temp(

        -- hour(time)

        id int auto_increment,

        -- 重临日期的小时值

        name varchar(20),

        select hour(now());

        age int,

        

        primary key(id),

        -- minute(time)

/*check约束*/

        -- 重回time的分钟值

check(age > 20)

        select minute(now());

);

        

地点check约束供给age必需大于0,但绝非别的功效。可是成立table的时候从不别的不当或警示。

        -- monthname(date)

 

        -- 重回date的月份名

Ø 索引

        select monthname(now());

目录是寄放在在格局(schema)中的叁个数据库对象,索引的效劳便是加强对表的追寻查询速度,

        

目录是通过急迅访问的方法来扩充神速稳固数据,进而减少了对磁盘的读写操作。

        -- date_format(date,fmt)

目录是数据库的多个指标,它不可能独立存在,必得对某些表对象实行注重。

        -- 重返按字符串fmt格式化日期date的值

唤醒:索引保存在information_schema数据Curry的STATISTICS表中。

        -- %a:缩写星期名

始建索引方式:

        -- %b:缩写月名

机关:当表上定义主键约束、独一、外键约束时,该表会被系统自动增添上索引。

        -- %d:日(05,06)

手动:手动在相关表或列上扩大索引,提升查询速度。

        -- %e:日(5,6)

除去索引情势:

        -- %H:24小时制(05,06)

机动:当表对象被剔除时,该表上的目录自动被去除

        -- %h:12小时制(05,06)

手动:手动删除钦定表对象的相关列上的目录

        -- %k:24小时制(5,6)

目录类似于书籍的目录,能够高速牢固到有关的数目,叁个表能够有八个目录。

        -- %l:12小时制(5,6)

创造索引:

        -- %s:秒

create index idx_temp_name on temp(name);

        -- %S:秒

组合索引:

        -- %Y:年,4位

create index idx_temp_name$pwd on temp(name, pwd);

        -- %y:年,2位

删除索引:

        select date_format(now(),'%yy年%M月%d日');

drop index idx_temp_name on temp;

        

Ø 视图

        -- date_add(date,interval exp type)

视图正是叁个表或多少个表的询问结果,它是一张虚构的表,因为它并无法储存数据。

        -- 再次来到八个日子或时间值加上上三个时间距离的时日值。

视图的功力、优点:

        -- year:年 -- YY

限定对数据的拜会

        -- month:月 -- MM

让复杂查询变得轻巧

        -- day:日 -- DD

提供数据的独立性

        -- hour:时 -- hh

可以做到对同一数量的两样展现

        -- minute:分 -- mm

   

        -- second:秒 -- ss

创制、修改视图

        select date_add(now(),interval 1 year);

create or replace view view_temp

        date = 2017-04-05 12:29:19

as

        

    select name, age from temp;

        -- datediff(expr1,expr2)

普普通通我们并不对视图的数据做修改操作,因为视图是一张设想的表,它并不存款和储蓄实际数据。倘诺想让视图不被涂改,能够用with check option来完毕限制。

        -- 再次回到起初时间expr1和终止时间expr2之间的大运。

create or replace view view_temp

        select datediff('2012-08-08',now());

as

        -- 注意:expr必需是正式时间格式。

    select * from temp

 

with check option;

    数学函数

修改视图:

        -- abs(x)

alter view view_temp

        -- 再次回到x的绝对值

as

        select abs(-1);

    select id, name from temp;

 

删去视图:

        -- ceil(x)

drop view view_temp;

        -- 重回非常的大于x的细微整数值

来得创制语法:

        select ceil(3.8);

show create view v_temp;

 

Ø DML语句

        -- floor(x)

DML首要针对数据库表对象的数额来讲的,日常DML实现:

        -- 重返十分的小于x的最大整数值

插入新数据

        select floor(3.9);

修改已加多的数额

    

剔除无需的多寡

        -- mod(x,y)

1、    insert into 插入语句

        -- 返回x/y的模(取余)

insert into temp values(null, ‘jack’, 25);

        select mod(5,3);

主键自增能够不插入,所以用null替代

        select round(1.5,0);   该方法能够四舍五入取整数。

指定列

        

insert into temp(name, age) values(‘jack’, 22);

        -- rand()

在外表后边带括号,括号中写列名,values中写钦赐列名的值就可以。当省略列名就代表插入全部数量,

        -- 重返二个0-1.0之间的轻便浮点数,(0 <= x <=1.0)

瞩目插入值的一一和列的各类供给保持一致。

        select rand();

Set方式插入,也得以指定列

        

insert into temp set id = 7, name = 'jason';

        -- round(x,y)

MySQL中外键的table的外键引用列能够插入数据可感觉null,不参照主表的多寡。

        -- 重返参数x的四舍五入的y位小数的值

使用子查询插入数据

        -- 只四舍五入小数位,不取整

insert into temp(name) select name from classes;

        select round(1.2338,3);

多行插入

        

insert into temp values(null, ‘jack’, 22), (null, ‘jackson’ 23);

        -- truncate(x,y)

2、    update 修改语句

        -- 重临数字x截断为y位小数的结果

update主要完毕对数据的改造操作,能够修改一条或多条数据。修改多条或钦点条件的多寡,须求用where条件来完结。

        select truncate(1.222333,5);

修改全部数据

——索引

update temp set name = ‘jack2’;

    索引管理
        概念:
                索引是成立在表上,是对数据库表上的一列大概多列进行排序的一种结构
                作用:
                        进步对数码库表查询的快慢。
                        相当于依靠拼音或部首查找某字在词典中的地方——词典的目录。
                        对于数据库来说,创建索引,正是将数据库中至关心注重要字的职位树立目录,方便于查找。
                索引的仓库储存类型:
                        BTREE:
                        HASH:
                        分歧的累积引擎采取索引的储存类型不一致。
                        查看数据库引擎:
                                show engines;
                        各个引擎辅助的法力不一,所以索引的存放类型也不及,innodb存款和储蓄类型是BTREE
        使用索引的带价:
                1、索引供给占用数据表以外的轮廓存款和储蓄空间。
                2、创设索引和维护索引要耗时(数据库实行的操作,并非程序猿进行的操作)
                          只要插入也许去除数据,索引都要修改。(能够整个去除,然后再一次建表,速度略快)
                3、当对表实行立异操作时,索引须求被重新创建,裁减数据的尊敬速度。
        索引类型:
                1、普通索引
                        能够在数据表的大肆列创建该索引。
                        创制格局:
                            1)创立表时成立索引
                                create table 表名
                                (
                                    [字段表达]
                                    index [索引名] ( 列名 [长度] )
                                );
                            2)修改表时增加索引
                                alter table 表名
                                add index[索引] (列名 [长度])
                            3)成立表后创建索引
                                create index 索引名 on 表名(列名[长度])
                        注意:
                                若是要创设索引的列是char或varchar类型,长度能够低于实际尺寸。
                2、独一索引
                        创造索引列的举世无双值
                        相对于通常索引,唯一索引创造索引时在index前增进unique
                3、主键索引
                        主键索引是一种特其余无可比拟索引,不相同意为null。
                        主键索引是在给表设置主键时自动成立。
                        多少个表只可以有二个主键,即只好有叁个主键索引。
                4、全文索引
                5、单列索引和多列索引
                        单列索引:
                                索引建设构造在表中的某一列上。
                        多列索引:
                                索引组建在表中的四个列上
                                例如:
                                        create index 索引名 on 表名(列名1[长度],列名2[长度])
                                        create index index_id_name on t1(id,name(2))
                                            将多少个列作为一个目录,能够抓牢查询效用。
                6、删除索引
                    无法修改索引,只好删除索引,再成立。
                        alter table 表名
                        drop index 索引名;
                    或者
                        alter table 表名
                        drop index 索引名 on 表名;
                    例如
                        alter table t1
                        drop index index_id;
                7、创设目录的口径
                    最符合创建目录的列是where子句中的列。
                    索引列的值不雷同的更多,索引效果越好
                            比如:不建议在x性别列建索引,因为重新值太多。
                    使用短索引
                            取字符类型的前多少个字符。
                    利用最左前缀
                            多列索引
                            create index index_id_name on t1(id,name(2))
                                当创立了index_id_name索引时,查询id可以,查询id,name也可以。
                                只倘若左边手的索引列就能够。
                    不要过于使用索引
                            因为制造和爱戴索引须求费用时间。

抱有的数量的name会被修改,要是改变多列用“,”分开

——视图

update temp set name = ‘jack’, age = 22;

    视图、存款和储蓄进程和自定义函数的差异:
            视图只限于查询,而存储进程和自定义函数能够操作表。

修改指定条件的笔录供给用where

    能够将具备音信贮存到一张视图中,再由别的条件举行筛选。
    定义:
            视图是一种数据库对象,其内容由询问(来自于查询)定义
            实例:创立视图,查询学号,姓名,联系电话,班级,选课号,课程名,战表,助教名称
                    create view view_v

update temp set name = ‘jack’ where age > 22;

                    as

3、    delete 删除语句

                    select t_student.sid,sname,stelephone,sclass,t_score.cid,cname,score,tname

除去table中的数据,能够去除全部,带条件得以去除钦赐的笔录。

                    from t_student,t_score,t_course,t_teacher,t_teachcourse

剔除全体数据

                    where t_student.sid = t_score.sid and t_score.cid = t_course.cid

delete from temp;

                    and t_course.cid = t_teachcourse.cid and t_teachcourse.tid = t_teacher.tid

除去钦定条件数据

 

delete from temp where age > 20;

                    select * from view_v
    目的:
            用于集中、简化和定制展现数据库中的数据新闻。
            增扩充少的安全性。
            升高表的逻辑独立性。
                数据的退换不会潜移默化视图定义。 
    成立视图
            T-SQL语句
            语法:
                create [or replace] view 视图名
                as
                <select 语句> 

Ø select 查询、function 函数

            or replace 是替换当前视图。
    对视图的尤其验证
        1、视图是叁个设想表,从二个或多个表中程导弹出(查询)
        2、视图也可以从视图中程导弹出。
        3、其内容由询问语句(select)定义生成
        4、在数据库中官样文章视图的查询内容,只设有视图的概念,什么日期用实体,什么日期实践视图的定义。
    处理视图
        1、使用视图:对视图能够像对待表同样举行询问和改变
                查询:select * from view_v
                修改:
                        update view_v
                        set score = 65
                        where sid = 2016001;
                        因为视图是表的照耀,所以修改视图也就是修改表。
                        只可以修改表的原数据,不能改改总结出来的数量。
        2、查看视图定义(命令)
                desc 视图名;
                show create view 视图名;
        3、修改视图定义
                适用于初次创立和改换:
                    create or replace view 视图名
                    as
                    select 语句;
                    假如视图不设有,则创制视图,假使存在则修改视图

select查询语句用得最广大、作用也最丰硕。能够形成单条记录、多条记下、单表、多表、子查询等。

                必得保险视图已经存在:
                    alter view 视图名
                    as
                    select 语句;
                    只限于修改已存在的视图。

1、    查询某张表全体数据

        4、删除视图
                drop view [if exists] 视图名
                决断若是视图存在,则删除视图视图。

select * from temp;

目录练习-student数据库

*表示享有列,temp代表表名,不带条件就询问全数数据

    1、在t_student 表中的sname列创建独一索引

2、    查询钦点列和规范的数目

        create index index_sname on t_student(sname(2));

select name, age from temp where age = 22;

 

查询name和age这两列,age 等于22的数据。

        alter table t_student

3、    对查询的数额举办演算操作

        add index ss (sname(2)); 

select age 2, age / 2, age – 2, age * 2 from temp where age – 2 > 22;

    2、在t_student表中的sname和stelephone列创造多列索引

4、    concat函数,字符串连接

    3、在t_teacher表中的tname创设普通索引

select concat(name, ‘-eco’) from temp;

    4、在t_course表中的cname列创造独一索引

concat和null实行连接,会促成连日后的数码形成null

    5、删除上述索引

5、    as 对列重命名

    drop index index_sname on t_student;

select name as ‘名称’ from temp;

 

as也得以归纳不写,效果等同

    alter table t_student

假诺重命名的列名出现特殊字符,如“‘”单引号,那就供给用双引号引在外场

    drop index index_sname;

select name as “名’称” from temp;

 

6、    也足以给table去别称

视图演习-student数据库

select t.name Name from temp as t;

 

7、    查询常量

    1、创立视图

类似于SQL Server

        a)创立视图view_selStu,能够显得选修课程的学习者的学号,姓名,选修科目代号,科目名称,科目成绩

select 5 2;

            create view view_selstu

select concat('a', 'bbb');

            as

8、    distinct 去掉重复数据

            select t_student.sid,t_student.sname,t_course.cid,cname,score

select distinct id from temp;

            from t_student,t_course,t_score

多列将是构成的重新数据

            where t_student.sid = t_score.sid 

select distinct id, age from temp;

            and t_score.cid = t_course.cid;

9、    where 条件查询

        b)创设视图view_selSubject,能够展现选修科目代号,科目名称和学科战表

超过>、大于等于>=、小于<、小于等于<=、等于=、不对等<>

            create view view_selstu

都得以出现在where语句中

            as

select * from t where a > 2 or a >= 3 or a < 5 or a <= 6 or a = 7 or a <> 0;

            select t_student.sid,t_student.sname,t_course.cid,cname,score

10、    and 并且

            from t_student,t_course,t_score

select * from temp where age > 20 and name = ‘jack’;

            where t_student.sid = t_score.sid 

询问名称等于jack并且年龄大于20的

            and t_score.cid = t_course.cid;

11、    or 或者

        c)创制视图view_execllent,能够呈现选修课成绩>85的学员的学号,姓名,选修科目名称,成绩

满意三个就可以

            create view view_execllent

select * from tmep where name = ‘jack’ or name = ‘jackson’;

            as

12、    between v and v2

            select t_student.sid,sname,cname,score

跨越等于v且小于等于v2

            from t_student,t_course,t_score

select * form temp where age between 20 and 25;

            where t_student.sid = t_score.sid

13、    in 查询

            and t_score.cid = t_course.cid

能够八个标准 类似于or

            and score > 85;

select * from temp where id in (1, 2, 3);

        d)成立视图view_fail,可以显得选修课成绩比不上格的学员学号,姓名,班级,课程号,课程名,战表新闻

询问id在括号中冒出的数码

            create view view_fail

14、    like 模糊查询

            as

查询name以j开头的

            select t_student.sid,sname,sclass,t_course.cid,cname,score

select * from temp where name like ‘j%’;

            from t_score,t_student,t_course

查询name包含k的

            where t_student.sid = t_score.sid

select * from temp where name like ‘%k%’;

            and t_score.cid = t_course.cid

escape转义

            and score < 60

select * from temp where name like ‘_%’ escape ‘’;

    

指定为转义字符,上面包车型地铁就能够查询name中含有“_”的数据

    2、通过所创造的视图查询数据音讯

15、    is null、is not null

        a)在view_execllent 中查询选修课成绩在85-95的音讯

查询为null的数据

            select * from view_execllent

select * from temp where name is null;

            where score between 85 and 95;

查询不为null的数码

        b)在view_fail中询问各班不比格的大成音讯

select * from temp where name is not null;

            select * from view_fail

16、    not

            where score < 60;
        c)在view_selSubject中执会考查计算局计各科指标最高成绩,最低战表,平均战表

select * from temp where not (age > 20);

            select max(score) '最高成绩',min(score) '最低战表',avg(score) '平均战绩'

取小于等于20的数目

            from view_selsubject

select * from temp where id not in(1, 2);

    3、通过视图修改数据

17、    order by

        a)修改view_fail,将某一比不上格成绩新闻修改成60分

排序,有desc、asc升序、降序

            update view_fail

select * from temp order by id;

            set score = 60

默认desc排序

        b)修改view_selStu,修改某一学员的选修科目代号及学科名称

select * from temp order by id asc;

            update view_selstu

多列组合

            set cname = '2'

select * from temp order by id, age;

            where cid = 2

 

    4、修改视图定义

        a)修改视图view_execllent, 能够显得选修课成绩>85的学员的学号,姓名,选修科目,成绩,科目先生

            alter view view_execllent

            as

            select t_student.sid,sname,cname,score,tname

            from t_student,t_score,t_course,t_teachcourse,t_teacher

            where t_student.sid = t_score.sid

            and t_score.cid = t_course.cid

            and t_course.cid = t_teachcourse.cid

            and t_teachcourse.tid = t_teacher.tid

            and score > 85;

        b)修改视图view_selStu,可以呈现选修课程的学生的学号,姓名,选修科目代号,科目名称,科目战表,班级,教授姓名

            create or replace view view_selstu

            as

            select t_student.sid,sname,t_course.cid,cname,score,sclass,tname

            from t_student,t_course,t_score,t_teachcourse,t_teacher

            where t_student.sid = t_score.sid

            and t_score.cid = t_course.cid

            and t_course.cid = t_teachcourse.cid

            and t_teachcourse.tid = t_teacher.tid

    

    5)删除视图:将上述某些视图删除

        drop view if exists view_selstu

 

——存款和储蓄进程

    存储进程概述
            概念:
                    存款和储蓄进度是一种数据库对象,是为了达成某些特定义务,将一组预编写翻译的SQL语句以一个存款和储蓄单元的花样积累在服务器上
                    ,由客户通过点名存款和储蓄进程的名字钦赐它。
                    MySQL5.0在此以前不接济存款和储蓄进程。
                    示例:
                            创造三个存款和储蓄进程,输入学生的学号,查询学生的详细消息。

                            delimiter &&            //分隔符,当下贰回相遇&&时就可以终止     能够利用别的字符 比方://

                            create procedure sp_stu(in inputsid int )    in 输入     int 参数类型

                            reads sql data

                            begin 

                            select * from t_student

                            where sid = inputsid;

                            end && 
                            delimiter;            // 将分隔符再一次设为分号  ;  

                            call sp_stu(二零一四003);        // 使用存款和储蓄进程

                            对于 select * from where sid = 2014001,数据库每趟实践都亟待解析查询语句,转成试行。
                            而对此仓库储存进程,在服务器已经编写翻译好,不须求再去分析语句。 

                意义:
                        1、存款和储蓄进度只在创造刻实行编写翻译,今后施行都没有须求编写翻译,而貌似的SQL语句实行叁回就需求编写翻译一次,所以利用存款和储蓄
                             进度会加强实践效用。
                        2、存款和储蓄进度能够重复使用,可以减去数据库开采人士的工作量。

 

    创立存储进程
            不带参数的寄放过程
                    语法:
                            delimiter &&
                            create procedure 存储进程名()
                            reads sql data
                            begin
                                    存款和储蓄进程语句
                            end &&
                            delimiter ;
                    示例:
                            创立存储进度sp_fail,查询全部选修课成绩不如格的上学的小孩子学号,姓名,课程号,课程名。

                            delimiter &&

                            create procedure sp_fail()

                            reads sql data

                            begin

                                select t_student.sid,sname,t_course.cid,cname from t_student,t_course,t_score

                                where t_student.sid = t_score.sid

                                and t_score.cid = t_course.cid

                                and score < 60;

                            end &&

                            delimiter ;

                            执行:call sp_fail(); 

                带有输入与参数的囤积进程。
                        语法:
                                delimiter &&
                                create procedure 存款和储蓄进度名(in 参数名 参数数据类型,......)    // 能够输入四个参数。
                                reads sql data
                                begin
                                        存款和储蓄进程语句
                                end &&
                                delimiter ;

                        说明:
                                输入参数平常作为查询条件。
                                 
                        示例:
                                创设存储进度sp_stuscore输入学生学号,查询学生学号,姓名,课程名和大成。
                                delimiter &&

                                create procedure sp_stuscore(in inputsid int)

                                reads sql data

                                begin

                                    select t_student.sid,sname,cname,score

                                    from t_student,t_course,t_score

                                    where t_student.sid = t_score.sid

                                    and t_score.cid = t_course.cid

                                    and t_student.sid = inputsid;

                                end &&

                                delimiter ;

                        执行:call sp_stuscore(2016001)

                带输出参数的存款和储蓄过程:
                        语法:
                                delimiter &&

                                create procedure sp_phone(in inputsname varchar(20),out otelephone varchar(11))

                                reads sql DATA

                                begin

                                    select stelephone into otelephone from t_student    -- 将查找到的stelephnoe赋值给otelephone

                                    where sname = inputsname;

                                end&&

                                delimiter;

 

                                -- 调用

                                call sp_phone('马云',@telephone);

                                -- 输出

                                select @telephone;

 

                        示例:
                                -- 定义存款和储蓄进程sp_score,输入学生学号和学科号,再次来到学生的成绩

                                delimiter &&

                                create procedure sp_score(in inputsid int,in inputcid int,out outscore int)

                                reads sql data

                                begin

                                    select score into outscore 

                                    from t_student,t_score

                                    where t_score.sid = t_student.sid

                                    and inputsid = t_student.sid

                                    and inputcid = t_score.cid;

                                end &&

                                delimiter;

 

                                drop procedure sp_score;

 

                                -- 调用

                                call sp_score(2016001,2,@score);

 

                                -- 输出

                                select @score;

                        银行转账示例:

                                -- 成立银行表

                                create table bank

                                (

                                    id int not null primary key,

                                    name varchar(5) not null default'',

                                    balance float not null default 0

                                );

 

                                insert into bank values(10001,'张三',100);

                                insert into bank values(10002,'李四',200);

 

                                -- 创制存款和储蓄进程

                                delimiter &&

                                create procedure bank_test(in inputid int,in outputid int, in money float)

                                modifies sql data    // 此处使用midifies  因为急需修改七个内容

                                begin

                                    -- 转入账户

                                    update bank

                                    set balance = balance money

                                    where id = inputid;

 

                                    -- 转出账户

                                    update bank

                                    set balance = balance - money

                                    where id = outputid;

                                end &&

                                delimiter;

 

                                call bank_test(10001,10002,100);

 

                                select * from bank;

 

                删除存款和储蓄进程:
                        drop procedure 存款和储蓄进程名;

                        

——触发器

    触发器的概念
            触发器是由inert update delete等事件来触发某种特定事件

    触发器的多个特性
            原子性:Atomiity
                    事务是四个完全的操作,事务的各步操作都以不可分的(原子的);要么都举行,要么都不试行。
             一致性:Consistency
                    当事情完结时,数据必得处于一样状态。相当于说,在业务早先以前,数据存款和储蓄中的数据处于同一状态。在正在进
                    行的作业中,数据可能处于差异等的场合,譬喻,数据可能有局地修改。但是,当职业成功做到时,数据必需再度
                    回到已知的平等状态,通过业务对数码所做的改变不可能破坏数据,或许说事务不能够使数码存款和储蓄处于不安宁的事态。
            隔离性:Isolation
                    对数据开展退换的具有并发事务是互相隔绝的,那标记事业必得是单独的,它不应以别的格局信任于或影响别的业务。
            永久性:Durability
                    事务完结后,它对数据库的改造被永世保存,事务日志能够保持工作的永恒性。
    成立触发器的语法
            语法格式
                    create trigger 触发器名
                    before | after 触发事件
                    on 表名 for each row
                    触发实践语句
            说明:
                    trigger:触发器关键字
                    before | after:钦命实践语句在接触前还是接触后。
                    触发事件:insert  delete  update
                    触发施行语句:当有接触事件发生所实行的言辞。
                    on表名:触发事件发生的表。
    创制触发器示例
            new代表新加上的数据行对象。
            old表示刚删除的数据行对象。
            1、扩大一条选课音讯后,相应的学科实际选课人数增1。
                    -- 1、增添一条选课新闻后,相应的实际上选课人数增添1

                    create trigger tr_choose

                    after insert

                    on t_score for each row

                    -- 插入一条选课音信后 需求明白选课号是稍稍

                    update t_course

                    set realcount = realcount 1

                    where cid = new.cid

 

                    select * from t_course

                    -- 使用触发器

                    insert into t_score (sid,cid)values(2016001,1)

            2、删除一条选课新闻后,相应的教程实际选课人数减1

                    create trigger tr_del

                    after delete

                    on t_score

                    for each row

 

                    update t_course

                    set realcount = realcount -1

                    where cid = old.cid;

 

                    select * from t_course;

                    select * from t_score

 

                    delete from t_score

                    where cid = 1 and sid = 2016001;

    删除触发器
            drop trigger 触发器名;

——MySQL保存大数据类型

标准SQL中提供了如下类型来保存大数据类型:
    BLOB:binary 字节流
    CLOB:character 字符流
    类型                        长度
tinyblob                    2^8-1B(256B)
blob                          2^16-1B(64KB)
mediumblob             2^64-1B(16MB)
longblob                   2^32-1B(4GB)

tinyclob                    2^8-1B(256B)
clob                          2^16-1B(64KB)
mediumclob             2^64-1B(16MB)
longclob                   2^32-1B(4GB)

只是在MySQL中从不提供以上字符流的种种数据类型,二十利用如下各类档案的次序来管理大文本数据:
    tinytext、text、mediumtext、longtext

首先供给创制一张表,表中有二个mediumblob(16M)类型的字段:
create table tab_bin(
    id int primary key auto_increment,
    filename varchar(100),
    data mediumblob
);

向数据库插入二进制数据须要选取PreparedStatement为原serBinaryStream(int, InputStream)方法来完毕。

还亟需在my.ini中加多如下配置:
    max_allowed_packet=102400
安装最大可传输数据包 大小。

亲自过问代码:

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.sql.Blob;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

 

import javax.sql.rowset.serial.SerialBlob;

 

import org.apache.commons.io.IOUtils;

import org.junit.Test;

 

import sun.nio.ch.IOUtil;

 

import com.wyc.demo03.JDBCUtils;

 

/*

 * 2016年12月1日15:45:48

 * 向数据库中插入大文本数据

 */

public class Demo04 {

    /*

     * 把VCD保存到数据库中

     */

    @Test

    public void fun1() throws Exception {

        /*

         * 1、得到Connection对象 2、给出SQL模板,创立pstmt 3、设置SQL模板中的参数

         * 4、调用pstmt的executeUpdate()方法实行SQL语句

         */

        Connection conn = JDBCUtils.getConnection();

        String sql = "insert into tab_bin values(?,?,?)";

 

        PreparedStatement pstmt = conn.prepareStatement(sql);

        pstmt.setInt(1, 1);

        pstmt.setString(2, "Alan Walker - Fade.mp3");

        /*

         * 获得Blob 1、现把公文形成byte数组 2、再使用byte数组创设Blob

         */

        // 使用字节数组创立Blob

        byte[] bytes = IOUtils.toByteArray(new FileInputStream("F:/Alan Walker - Fade.mp3"));

        // Blob是多少个接口,能够行使它的兑现类来创造对象

        Blob blob = new SerialBlob(bytes);

        // 设置参数

        pstmt.setBlob(3, blob);

        pstmt.executeUpdate();

    }

 

    /*

     * 从数据库中抽出mp4

     */

    @Test

    public void fun2() throws Exception {

        // 得到Connection对象

        Connection conn = JDBCUtils.getConnection();

        // 给出select模板,创建pstmt

        String sql = "select * from tab_bin";

        PreparedStatement pstmt = conn.prepareStatement(sql);

 

        // pstmt实践executeQuery方法,实践查询,获得ResultSet

        ResultSet rs = pstmt.executeQuery();

 

        // 获取第三列名称叫data数据

        if (rs.next()) {

            Blob blob = rs.getBlob("data");

            /*

             * 将Blob保存到硬盘 1、通过Blob获得输入流对象 2、自身成立输出流对象 3、把输入流的多少写入到输出流中

             */

            InputStream in = blob.getBinaryStream();

            OutputStream out = new FileOutputStream("D:/Alan Walker - Fade.mp3");

            IOUtils.copy(in, out);

        }

    }

}

——MySQL事务

为了便于业务的操作,要求创设二个account表:
create table account(
    id int primary key auto_increment,
    name varchar(20),
    balance number(10,2)
);
insert into account(name, balance) values ("张三", 100000);
insert into account(name, balance) values ("李四", 100000);
insert into account(name, balance) values ("王五", 100000);

面试轻便问到:
1、事务的四大特点(ACID)
    1)原子性(Atomicity):事务中有着操作是不可再分开的原子单位,事务中颇具操作依然全体执行成功,要么全体执行停业。
    2)一致性(Consistency):事务实施后,数据库状态与其余工作法规保持一致,如转账业务,无论业务实施成功与否,加入转载的四个账号越之和相应是不改变的。其余本性皆感觉了这一表战胜务的。
    3)隔开性(Isolation):隔开性是指在出现操作中,分裂事物之间应当隔绝开来,使各个并发中的实物不会相互烦懑。
    4)悠久性(Durability):一旦事情提交成功,事务中具备的数据操作必得被长久化到数据库中,固然付出业务后,数据库爆发崩溃,在重启数据库时,也必须能担保通过某种机制复苏数据。

2、MySQL中的事务
    在默许情状下,MySQL每实行一条SQL语句,都是一个独自的事务,假诺急需在一个工作中蕴涵四个SQL语句,那么要求敞开事务和终止职业:
        *   开启事务:start transaction;
        *   截止事业:commit或rollback
    在实施SQL语句在此以前,先进行start transaction,那就翻开了三个作业(事务的源点),然后能够实行多条SQL语句,最终要截止专业,能够选拔commit提交事务,即职业中的多条SQL语句所作出的熏陶会被长久化到数据库中,或然选用rollback回滚,即回滚到事情的源点,以前所作的具有操作都被打消了。

——事务隔断等第

1、事务的出现读取难题
    *   脏读:读取到另三个事务未提交的数额,即读取到了脏数据。
    *   不可重复读:两遍读取内容分裂,因为另一业务对该记录做了改造。
    *   虚读:对同样张表的三遍搜索内容不雷同,读到另一作业已交付的数据。

    不可重复读和虚读的区分:
        *   不可重复读是读取到了另一作业的更新。
        *   虚读是读取到了另一东西的插入(MySQL中不或许测量检验虚读)。

2、四大隔绝品级
    4个级次的事务隔绝等第,在一样数量情形下,使用同一的输入,实行相同的办事,依照不相同的割裂品级,可以引致分裂的结果,区别工作隔开分离等第能够缓和的数量现身难题的力量是不一样的。
    1)SERIALIZABLE(串行化):
        *   不会晤世其余并发难点,因为它是对同一数据的拜访是串行的,非并发访问。
        *   品质最差。
    2)REPEARABLE READ(可重复读):(MySQL默许)
        *   幸免脏读和不得重复读,不可能管理虚读难点。
        *   性能比SERIALIZABLE好。
    3)READ COMMITTED(读取已交付数据):(Oracle私下认可)
        *   防止脏读,无法管理不可重复读,也不可能管理虚读。
        *   性能比REPEATABLE READ好。
    4)READ UNCOMMITTED(读取未提交数据):
        *   大概出现任何事情并发难点。
        *   质量最高。

    MySQL默许的隔离等第为REPEATABLE READ,能够因而上边的语句查看:
        select @@tx_isolation
    也足以因此上面语句来设置当前三回九转的割裂等级:
        set transaction isolationlevel [4 选 1]

——MySQL语句

     建表

            通过图形化分界面建表。

            通过命令建表:

                create table Course

                (

                        Cou_name nvarchar(50) not null,

                        Cou_id int not null primary key,

                        Cou_tercher nvarchar(20) not null

                )

 

                create table Student

                (

                        Stu_id int not null primary key,

                        Stu_name nvarchar(50) not null,

                        Stu_sex nchar(2) not null,

                        Stu_age int not null,

                        Cou_id int foreign key references Course(Cou_id) not null

                )

            create table 最后一个字段的末尾提议不要写逗号。

                references的机能是外键表成立外键时援用主键表的主键。

    修改字段属性:
        update 表名
        set 字段名 = 需求修改的值
        where 字段名 = 值;    //要是不加限制,则会将该字段全体修改。
    
    增加记录:
        insert into 表名 (列名) values(值列表);
        列名可以省略,依照值列表举行判别。

    删除:
        delete from 表名
        where 字段 = 值;

    创建表:
        create table 表名
        (
            字段名 数据类型
        );

    查看表结构:
        desc 表名;
        show create table 表名;

    字段修改属性:
        修改字段数据类型:
            alter table 表名
            modify 字段名 数据类型;
    
    修改字段名:
            alter table 表名
            change 旧属性名 新属性名 新属性类型;
            当不点名原有字段的自增进时,自增进会错失。

    增添字段:
        alter table 表名
        add 字段名 数据类型(完整性约束标准);
            如若想在首先个任务扩展字段,须要在数据类型前边加上first
            假若想在钦点地点增加,能够运用 after 字段名;    意思是在该字段前边加多。

    删除字段:
        alter table 表名
        drop 字段名;

    删除表:
        drop table 表名;

    主键约束:
        create table 表名
        (
            主键 数据类型 primary key
        );

    外键约束:
        create table 表名
        (
            外键名 数据类型,
            constraint fk_主键约束名 foreign key (外键名) references 主键表(主键)
        );

    唯一约束:
        create table 表名
        (
            字段名 数据类型 unique
        );

    默许约束:
        create table 表名
        (
            字段 数据类型 default 私下认可值
        );

    检查约束:
        在MySQL中数据库引擎会剖析check语句,不过会忽略check约束,所以关于字段限制范围的操作,能够在先后中限定。

    非空约束:
        create table 表名
        (
            字段名 数据类型 not null
        );

    自动增长列:
        create table 表名
        (
            字段名 数据类型(必需是int型) primary key(必得是主键) auto_increment
        ) auto_increment = 一千1;(能够在此处内定暗中认可值开端值)

——MySQL入门最基本语句
    连接服务器:
        mysql -uusername -ppassword
    当连上服务器后,大家率先面对的是库,库有贰个或多少个,借使不知情有哪些库,须要查阅全部的库,语句如下
    查询全体库:
        show databases;

    设置字符集:
        set names gbk;
        设置mysql字符集为gbk。 

   大家要想对表/行实行操作的话,首先要选库
    选库语句:
        use 库名;

    选库之后,面临的是多张表:
    查看全体表:
        show tables;

    创设八个数据库:
        create database [IF NOT EXISTS] 数据库名 [charset=字符集];    -- 中括号内容可选
        create database if not exists mydb charset=utf8;

    删除数据库:
        drop database 数据库名;

    修改数据库编码:
        alter database mydb character set utf8;

    数据库怎么着改名?
        MySQL中,表和列能够改名,可是database不能够改名。
        修改表名
            rename table oldname to newname;
            或者:alter table 原表名 rename to 新表名;

        PHPMyAdmin:新建库,把持有表复制到新库,再删除旧库完成的。

    创建表:
        create table test
        (
            id int
        ); 

    清空表
        truncate 表名;
        truncate和delete的区别:
            truncate清空表並且保留表结构,不记录日志。
            delete只删除数据,记录日志。

    退出
        exit;
        quit;
        c  跳出实践

——错误提醒
    1366:客商端未评释字符集。
    1064:语法错误。

 

————————————————————————————————————————————————————————

查询!!!!!!!!!!!!!!!!!!

以goods表作为练习表。

-- 创建goods表

create table goods

(

    goods_id mediumint(8) unsigned primary key not null auto_increment,

    cat_id smallint(5) unsigned not null default '0',

    goods_sn varchar(60) not null default '',

    goods_name varchar(120) not null default '',

    click_count int(10) unsigned not null default '0',

    goods_number smallint(5) unsigned not null default '0',

    market_price decimal(10,2) unsigned not null default '0.00',

    shop_price decimal(10,2) unsigned not null default '0.00',

    add_time int(10) unsigned not null default '0',

    is_best tinyint(1) unsigned not null default '0',

    is_new tinyint(1) unsigned not null default '0',

    is_hot tinyint(1) unsigned not null default '0'

);

 

-- 将shop.goods表中的数据插入testshop.goods表

insert into testshop.goods

select goods_id,cat_id,goods_sn,goods_name,click_count,goods_number,market_price,shop_price,add_time,is_best,

is_new,is_hot from shop.goods;

goods_id cat_id goods_sn goods_name click_count goods_number market_price shop_price add_time is_best is_new is_hot

|  1 |  4| ECS000000 | KD876                        |       7 |                 1 |         1665.60 |    1388.00 | 1240902890 |       1 |      1 |      1 |

|  3 |  8| ECS000002 | 索尼爱立信原装5800动铁耳机  |       3 |               24 |             81.60 |        68.00 | 1241422082 |       0 |      0 |      0 |

|  4 |  8| ECS000004 | 摩托罗拉N85原装充电器|       0 |               17 |             69.60 |        58.00 | 1241422402 |       0 |      0 |      0 |

|  5 |11| ECS000005 | 黑莓原装M2卡读卡器  |       3 |                8 |              24.00 |        20.00 | 1241422518 |       1 |      1 |      0 |

|  6 |11| ECS000006 | 胜创KINGMAX内存卡 |       0 |               15 |              50.40 |       42.00 | 1241422573 |       0 |      0 |      0 |

|  7 | 8| ECS000007  | 三星N85原装立体声耳机HS-82 | 0 |   20 |           120.00        100.00 | 1241422785 |       0 |      0 |      0 |

|  8 | 3| ECS000008  | 飞利浦9@9v              |       9 |                  1 |           478.79 |      399.00 | 1241425512 |       1 |      1 |      1 |

|  9 | 3| ECS000009  | 诺基亚E66                 |      20 |                 4 |         2757.60 |    2298.00 | 1241511871 |       1 |      1 |      1 |

|10 | 3| ECS000010  | 索爱C702c                |      11 |                  7 |         1593.60 |    1328.00 | 1241965622 |       0 |      0 |      1 |

|11 | 3| ECS000011  | 索爱C702c                 |       0 |                  1 |               0.00 |    1300.00 | 1241966951 |       0 |      0 |      0 |

|12 | 3| ECS000012  | HUAWEIA810           |      13 |                 8 |          1179.60 |      983.00 | 1245297652 |       0 |      1 |      0 |

|13 | 3| ECS000013  | 诺基亚5320 XpressMusic |13|                 8 |         1573.20      1311.00 | 1241967762 |       0 |      0 |      1 |

|14 | 4| ECS000014  | 诺基亚5800XM          |       6 |                  1 |         3150.00      2625.00 | 1241968492 |       0 |      0 |      1 |

|15 | 3| ECS000015  | 索尼爱立信A810           |       8 |                  3 |           945.60 |       788.00 | 124一九七〇703 |       0 |      1 |      1 |

|16 | 2| ECS000016  | 恒基伟绩G101           |       3 |                 0 |           988.00 |       823.33 | 1241966949 |       0 |      0 |      0 |

|17 | 3| ECS000017  | 夏新N7                      |       2 |                 1 |          2760.00 |    2300.00 | 1241969394 |       1 |      0 |      1 |

|18 | 4| ECS000018  | 夏新T5                      |       0 |                 1 |          3453.60 |    2878.00 | 1241969533 |       0 |      0 |      0 |

|19 | 3| ECS000019  | 三星SGH-F258         |       7 |               12 |          1029.60 |      858.00 | 1241970139 |       1 |      1 |      1 |

|20 | 3| ECS000020  | 三星BC01                 |      14 |              12 |            336.00 |      280.00 | 1241970417 |       1 |      1 |      1 |

|21 | 3| ECS000021  | 金立 A30                   |       4 |               40 |          2400.00 |   2000.00 | 1241970634 |       0 |      0 |      0 |

|22 | 3| ECS000022  | 多普达Touch HD       |      15 |                1 |          7198.80 |   5999.00 | 1241971076 |       1 |      1 |      0 |

|23 | 5| ECS000023  | 诺基亚N96                |      17 |                8 |          4440.00 |   3700.00 | 1241971488 |       1 |      1 |      0 |

|24 | 3| ECS000024  | P806                         |      35 |            100 |          2400.00 |   2000.00 | 1241971981 |       1 |      1 |      1 |

|25 |13| ECS000025 | 小灵通/固话50元充钱卡 |    0 |                2 |              57.59 |       48.00 | 124一九七四709 |       1 |      0 |      1 |

|26 |13| ECS000026 | 小灵通/固话20元充钱卡 |    0 |                2 |              22.80 |       19.00 | 124一九七五789 |       0 |      0 |      1 |

|27 |15| ECS000027 | 联通100元充钱卡       |        0 |               2 |             100.00 |       95.00 | 1241973894 |       1 |      1 |      1 |

|28 |15| ECS000028 | 联通50元充钱卡         |        0 |               0 |              50.00 |        45.00 | 124壹玖柒肆976 |       0 |      0 |      1 |

|29 |14| ECS000029 | 移动100元充钱卡       |        0 |               0 |                0.00 |        90.00 | 124一九七一022 |       1 |      0 |      1 |

|30 |14| ECS000030 | 移动20元充钱卡         |        1 |               9 |              21.00 |        18.00 | 124一九七一114 |       1 |      0 |      1 |

|31 | 3| ECS000031  | NokiaE8                |        5 |               1 |          1604.39 |    1337.00 | 1242110412 |       0 |      0 |      0 |

|32 | 3| ECS000032  | 诺基亚N85                 |        9 |               4 |          3612.00 |    3010.00 | 1242110760 |       0 |      1 |      1 |

——where条件查询

    比较运算符
        <    <=    =    >    >=    <>    in
    逻辑运算符
        not 或 !    or 或 ||    and 或 &&
    -- 1、查询主键为32的货色

    select * from goods

    where goods_id = 32;      

    -- 2、查询不属于第三栏的兼具商品

    select * from goods

    where cat_id <> 3;

    

    -- 3、本店价格高于三千元的货品

    select * from goods

    where shop_price > 3000;

    

    -- 4、本店价格低于或等于100元的商品

    select * from goods

    where shop_price <= 100;     

    -- 5、抽取第4栏和者第11栏的货色(不能用or)

    select * from goods

    where cat_id in (4,11);     

    -- 6、收取100<=店肆价格<=500的物品(不许用and)

    select * from goods

    where shop_price between 100 and 500;     

    -- 7、抽出不属于第3栏目且不属于第11栏指标物品(and,或not in分别完结)

    select * from goods

    where cat_id <> 3 and cat_id <> 11;

    

    select * from goods

    where cat_id not in(3,11);

    

    -- 8、收取商店价格高于100且低于300,可能高于6000且低于伍仟的商品()

    select * from goods

    where (shop_price > 100 and shop_price < 300)

    or (shop_price > 4000 and shop_price < 5000);

        

    -- 9、抽取首个栏目上边价格<一千或>三千,而且点击量>5的八种商品

    select * from goods

    where cat_id = 3 and (shop_price < 1000 or shop_price > 3000) and click_count > 5;

        注意:必需加括号,不然暗中同意or两侧各为四个原则。
                   or的优先级最低。     

    -- 10、收取第四个栏目上边的物品(注意:1栏目下边没商品,但其子栏目下有)
        无限极分类,超级分类,也正是该大类上边未有直接数据,而是二级分类。     

    -- 11、取知名字以"酷派"开始的物品

    select * from goods

    where goods_name like '诺基亚%';
        此处使用模糊查询,并不是正则相称,因为正则匹配效用低。
        %:匹配零到多少个字符。
        _:匹配一个字符。
    
    -- 12、取著名字不以"索爱"起初的货色

    select * from goods

    where goods_name not like '诺基亚%';

    

    -- 13、抽取第4个栏目上面价格在1000到3000里边,何况点击量>5 "HUAWEI"最早的数不尽商品

    select * from goods

    where (cat_id = 3 and shop_price > 1000 and shop_price < 3000 and click_count > 5)and goods_name like '诺基亚%';

    

    面试题

    有如下表和数组,把num值处于[20,29]的数改为20,把num值处于[30,39]时期的数改为30。

     ------

    | num  |

     ------

    |    3 |

    |   12 |

    |   15 |

    |   25 |

    |   23 |

    |   29 |

    |   34 |

    |   37 |

    |   32 |

    |   45 |

    |   48 |

    |   52 |

     ------

    

    update test

    set num = 20

    where num between 20 and 29;

    update test 

    set num = 30

    where num between 30 and 39;
    
    或者:
    
    update test
    set num = floor(num/10)*10
    where num >= 20 and num <= 30; 

    
    where查询模型
        可以把字段看成变量,把where看做Java中if语句中的条件,便是哪条记下能让if为真,就会抽取哪条记下。
        非零 並且 非null 非字符串 都为真。
        既然字段是变量,那么变量之间就足以运算。
        例如:
                select market_price - shop_price as discount from goods

                where goods_id = 1;
                注意:不可能在where中行使discount,因为where是对原表进行筛选生成三个临时表,discount存在于有时表中,所以where无
                           法使用discount对原表进行筛选。 
                           假使想对结果也正是discount举办筛选,只好采纳having,因为在where生成结果后,having是对结果反复回实行筛选。
     
 ——group by分组查询

    
        max()函数取最大值。
        min()函数取最小值。
        avg()总括平均值
        count(*)函数总结个数,假如count(列名),在内定列名时则不总结null值。
        那么使用count(*)和count(1)何人更加行吗?
            对于myisam引擎的数据库未有区分,这种电动机的数据库内部有三个计数器总括那行数,当供给输出游数的时候,会间接抽出游数
            对于利用innodb引擎的数据库,使用count(*)直接读行数,会招致功能低下,因为innodb会一行一行的数。
    
        有如下语句:
            select goods_id,sum(goods_number) from goods;
            抽出结果为:
            goods_id    sum(goods_number)
                  1                        314
            对于SQL标准来说,该语句是大错特错的,不可能被实行,然则在MySQL中得以被推行,但是为了可移植性和标准性,不推荐应用。     

    -- 1、查询出最贵的货品价位

    select max(shop_price) from goods;

    

    -- 2、查询最新的商品编号

    select max(goods_id) from goods;

    

    -- 3、查询最有利的的商品价位

    select min(shop_price) from goods;

    

    -- 4、查询最旧的商品编号

    select min(goods_id) from goods;

    

    -- 5、查询该店全数商品的仓库储存总数

    select sum(goods_id) from goods;

 

    -- 6、查询全体商品的平均价

    select avg(shop_price) from goods;

    

    -- 7、查询该店一共有多少种商品

    select count(goods_id) from goods;

    

    -- 8、查询各种栏目上边

    -- 最贵商品价位

    -- 最低商品价位

    -- 商品平均价格

    -- 仓库储存总数

    -- 商品体系

    -- (提醒:5个聚合函数sum avg max min count 与 group by综合运用)

    select cat_id,max(shop_price),min(shop_price),avg(shop_price),sum(goods_number) from goods

    group by cat_id;

    
    
——having分组筛选

 

    -- 1、查询该店的货品比市镇价所节省的价位

    select goods_id,market_price - shop_price from goods;

 

    -- 2、查询每种商品所积压的货款(仓库储存*单价)

    select shop_price,(goods_number * shop_price) from goods;

    

    -- 3、查询该店积压的总货款

    select sum(goods_number * shop_price) from goods;

    

    -- 4、查询该店每个栏目下边积压的货款

    select cat_id,goods_number * shop_price from goods

    group by cat_id;

    

    -- 5、查询比市场价积攒闲钱200元以上的货品及该商品所省的钱。

    -- 用where和having分别达成

    select goods_id,market_price - shop_price as price

    from goods

    where market_price - shop_price > 200;

    

    select goods_id,market_price - shop_price as price

    from goods

    having price > 200;

    

    -- 6、查询积压货款抢先2万元的栏目,以及该栏目积压的货款

    select cat_id,sum(goods_number * shop_price) as price

    from goods

    group by cat_id

    having price > 20000;

    

    -- 7、where group by having综联合排练习题

    -- 有如下表及数量

    -- 查询出2门及2门以上不如格者的平分成绩

    -- ------ --------- -------

    -- | name | subject | score |

    -- ------ --------- -------

    -- | 张三 | 数学    |    90 |

    -- | 张三 | 语文    |    50 |

    -- | 张三 | 地理    |    40 |

    -- | 李四 | 语文    |    55 |

    -- | 李四 | 政治    |    45 |

    -- | 王五 | 政治    |    30 |

    -- ------ --------- -------

    create table score

    (

        sname char(4) not null,

        ssubject char(5) not null,

        sscore float not null

    );

    insert into score values('张三','数学',90);

    insert into score values('张三','语文',50);

    insert into score values('张三','地理',40);

    insert into score values('李四','语文',55);

    insert into score values('李四','政治',45);

    insert into score values('王五','政治',30);

    insert into score values('赵六','政治',90);

    insert into score values('赵六','政治',80);

    

    select sname,count(sscore < 60) as c,avg(sscore) as a 

    from score

    group by sname

    having c >= 2        -- 错误!因为不论是count()中是还是不是为真,都会将行数全体抽出,纵然全体过关,会全部抽取。

    ## 一种错误做法

    mysql> select name,count(score<60) as k,avg(score) from stu group by name having k>=2;

     ------ --- ------------

    | name | k | avg(score) |

     ------ --- ------------

    | 张三     | 3 |    60.0000 |

    | 李四     | 2 |    50.0000 |

     ------ --- ------------

    2 rows in set (0.00 sec)

    

    mysql> select name,count(score<60) as k,avg(score) from stu group by name;

     ------ --- ------------

    | name | k | avg(score) |

     ------ --- ------------

    | 张三     | 3 |    60.0000 |

    | 李四     | 2 |    50.0000 |

    | 王五     | 1 |    30.0000 |

     ------ --- ------------

    3 rows in set (0.00 sec)

    

    mysql> select name,count(score<60) as k,avg(score) from stu group by name having k>=2;

     ------ --- ------------

    | name | k | avg(score) |

     ------ --- ------------

    | 张三     | 3 |    60.0000 |

    | 李四     | 2 |    50.0000 |

     ------ --- ------------

    2 rows in set (0.00 sec)

    

    #加上赵六后错误暴光

    mysql> insert into stu 

        -> values 

        -> ('赵六','A',100),

        -> ('赵六','B',99),

        -> ('赵六','C',98);

    Query OK, 3 rows affected (0.05 sec)

    Records: 3  Duplicates: 0  Warnings: 0

    

    #错误显现

    mysql> select name,count(score<60) as k,avg(score) from stu group by name having k>=2;

     ------ --- ------------

    | name | k | avg(score) |

     ------ --- ------------

    | 张三 | 3 |    60.0000 |

    | 李四 | 2 |    50.0000 |

    | 赵六 | 3 |    99.0000 |

     ------ --- ------------

    3 rows in set (0.00 sec)

    

    #科学思路,先查看种种人的平均战表

    mysql> select name,avg(score) from stu group by name;

     ------ ------------

    | name | avg(score) |

     ------ ------------

    | 张三 |    60.0000 |

    | 李四 |    50.0000 |

    | 王五 |    30.0000 |

    | 赵六 |    99.0000 |

     ------ ------------

    4 rows in set (0.00 sec)

    

    mysql> # 看每种人挂科情形

    mysql> select name,score < 60 from stu;

     ------ ------------

    | name | score < 60 |

     ------ ------------

    | 张三 |          0 |

    | 张三 |          1 |

    | 张三 |          1 |

    | 李四 |          1 |

    | 李四 |          1 |

    | 王五 |          1 |

    | 赵六 |          0 |

    | 赵六 |          0 |

    | 赵六 |          0 |

     ------ ------------

    9 rows in set (0.00 sec)

    

    mysql> #算算各个人的挂科学科

    mysql> select name,sum(score < 60) from stu group by name;

     ------ -----------------

    | name | sum(score < 60) |

     ------ -----------------

    | 张三 |               2 |

    | 李四 |               2 |

    | 王五 |               1 |

    | 赵六 |               0 |

     ------ -----------------

    4 rows in set (0.00 sec)

    

    #并且总计每人的平分分

    mysql> select name,sum(score < 60),avg(score) as pj from stu group by name;

     ------ ----------------- ---------

    | name | sum(score < 60) | pj      |

     ------ ----------------- ---------

    | 张三 |               2 | 60.0000 |

    | 李四 |               2 | 50.0000 |

    | 王五 |               1 | 30.0000 |

    | 赵六 |               0 | 99.0000 |

     ------ ----------------- ---------

    4 rows in set (0.00 sec)

    

    #运用having筛选挂科2门以上的.

    mysql> select name,sum(score < 60) as gk ,avg(score) as pj from stu group by name having gk >=2; 

     ------ ------ ---------

    | name | gk   | pj      |

     ------ ------ ---------

    | 张三 |    2 | 60.0000 |

    | 李四 |    2 | 50.0000 |

     ------ ------ ---------

    2 rows in set (0.00 sec)

    准确答案:
        select sname,sum(sscore < 60) as s,avg(sscore) from score

        group by sname

        having s >= 2; 

——order by排序
    order by 列名 desc/asc

    当供给开展频仍排序时:

        order by 列名1 desc/asc,列名2 desc/asc,

    当获得最终结果集以后,技术够开展排序,因为在结果集生成进度个中进行排序无意义。

    反过来讲,排序是针对最后结果,即:order by要放在where/group by having之后,顺序不可能颠倒。

 

    知识点:

        回收站机制,逻辑删除。

 

——limit限制结果条数
    limit [offset,] n(不包含offset)

    offset:偏移量(跳过多少行,也便是从什么职位上马抽取记录,不带有offset)

    n:抽出条款。

    offset假诺不写,相当于limit 0,n

 

    -- 1、按价格由高到低排序

    select * from goods

    order by shop_price;

    

    -- 2、按发表时间由早到晚排序

    select * from goods

    order by add_time 

    

    -- 3、按栏目由低到高排序,栏目之中按价格由高到低排序

    select * from goods

    order by cat_id,shop_price desc;

    

    -- 4、抽取价格最高的前八个商品

    select * from goods

    order by shop_price desc

    limit 3;

    

    -- 5、收取点击量前三名到前五名的商品

    select * from goods

    order by click_count desc

    limit 2,3

    

    七个子句的演算顺序

        where  group by  having  order by  limit

 

——where型子查询

    把内层查询结果作为外层查询的相比规范

    例题:

        -- 抽出每种栏目下的新颖的货物

        -- 第一步:先查询每一个栏目下风行商品的goods_id

        select max(goods_id),cat_id from goods

        group by cat_id;

        -- 第二步:把goods_id对应的商品新闻输出就可以

        select * from goods

        where goods_id in

        (

            select max(goods_id) from goods

            group by cat_id

        );

    where子查询的SQL语句不可能select * from表

        因为:

            固然where 列名 = (内层SQL) 则内层SQL重临的总得是单列单行值,也正是单个值。

            假使where 列名 in (内层SQL) 则内层SQL只可以回去单列值,能够多行,也得以单个值。

 

——from型子查询

    将内层查询SQL的查询结果,当成一张临时表,供外层SQL再度开展询问。

    注意:

        一时表必要求起二个外号。

    例题:

        -- 抽出每一个栏目下的新颖的商品

            select * from 

            (

                select * from goods

                order by cat_id,goods_id desc

            ) as t

            group by cat_id

            order by goods_id;

 

 

——exists型子查询

    将外层的查询结果(查询字段)获得内层查询,判别内层的询问是或不是创制,要是内层的查询where创制,则该行抽出,
    并在外行输出展现,若是不创制则不出口。

    
    exists功能超越in,因为exists碰到满足条件就回来,而in则全体比较。

——两表之间的全连接查询

表与聚焦的关联

一张表便是二个相会。

每一行正是一个要素。

疑问:

集中无法重新,可是有十分大可能率有两行数据完全平等,如哪个地方理?

答:

MySQL内部每一行又一个rowid

在数据库中,怎样操作表来得到笛Carl积:

select * from table1,table2;

 

——左连接

A表与B表通过四个涉嫌来筛选B表的行

语法:

A left join B on 筛选规范

只要基准为真,则B表抽出对应的行。

该语句获得的结果也是三个不常表,能够用作一张表,设为C。

既是,就足以对C表做询问,所以where group by having order by limit都足以照常使用。

多表连接中的where和on

在多表连接之后,造成的是第三张新表,第三张新表中无任何索引字段,因而子表的目录发挥不了成效。

 

 

本文由澳门新萄京官方网站发布于数据库网络,转载请注明出处:澳门新萄京官方网站MySql学习笔记06,MySQL学习笔

关键词: