zoukankan      html  css  js  c++  java
  • 2.Mysql SQL基础

    2.Mysql SQL基础
    2.1 SQL简介
    SQL(Structure Query Language)是结构化查询语言。
    2.2 SQL使用入门
    2.2.1 SQL分类
    SQL分为DDL、DML(DQL)、DCL3类。
    DDL(Data Definition Language)数据定义语言,用来定义数据库对象,如:表、列、索引、数据库(模式)等,包括:createdropalter runcate等。
    DML(DQL)(Data Manipulation LanguageData Query Language)数据操作(查询)语言,用来操作记录数据,包括:insertupdatedeleteselect等。
    DCL(Data Control Languages)数据控制语言,用来控制事务和权限,包括:commit ollbackgrant evoke等。
    2.2.2 DDL语句
    1).创建数据库(mysql的数据库其实是schema)
    语法:
    crete database 数据库名;
    举例:
    create database test1;
    --查看数据库
    show databases;
    --使用数据库
    use test1;
    --查看表
    show tables;

    2).删除数据库
    语法:
    drop database 数据库名;
    注意:数据库删除后,数据库下的表和数据都会被删除。
    举例:
    drop database test1;
    3).创建表
    语法:
    create table 表名(
    列名 列数据类型 约束,
    ...
    ) ENGINE=存储引擎名 DEFAULT CHARSET=字符集;
    举例:
    create table emp(
    empno int(8) not null,
    ename varchar(20),
    sal decimal(10,2),
    hiredate date,
    deptno int(8)
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk;

    --查看表定义
    desc emp;
    show create table emp;

    4).删除表
    语法:
    drop table 表名;
    举例:
    drop table emp;

    5).修改表
    5.1) 增加列
    语法:
    alter table 表名 add [column] 列名 数据类型 约束 [FIRST|After col_name];
    举例:
    alter table emp add column comm decimal(10,2) After sal;
    5.2) 修改列类型或列顺序
    语法:
    alter table 表名 modify [column] 列名 数据类型 约束 [FIRST|After col_name];
    举例:
    alter table emp modify column comm int(8) after deptno;
    5.3) 修改列名
    语法:
    alter table 表名 change [column] 旧列名 新列名 数据类型 约束 [FIRST|After col_name];
    举例:
    alter table emp change column comm com decimal(10,2) after sal;
    5.4) 删除列
    语法:
    alter table 表名 drop [column] 列名;
    举例:
    alter table emp drop column com;
    5.5) 修改表名
    语法:
    alter table 表名 rename [to] 新表名;
    举例:
    alter table emp rename to emp1;

    2.2.3 DML语句
    6).新增记录
    语法:
    insert into 表名(列名,...) values (值,...);
    举例:
    insert into emp (empno,ename,sal,hiredate,deptno) values (1,'张三',1000,'2000-01-01',10);
    按列的顺序,插入所有列值时,可以省略列名
    insert into emp values (2,'李四',1000,'2000-01-01',10);
    插入部分列值时,不可省略列名
    insert into emp (empno,ename,sal) values (3,'王五',1000);
    支持多行插入
    insert into emp (empno,ename,sal,hiredate,deptno) values
    (4,'马六',1000,'2000-01-01',10),
    (5,'孙七',1000,'2000-01-01',10);
    支持子查询
    insert into emp (empno,ename)
    (select empno+10,concat(ename,'_10') from emp where empno<3);

    7).更新记录
    语法:
    update 表名 set 列名=值,... where 条件;
    支持同时更新多个表的数据:
    update 表1,表2,... set 表1.列名=表2.列名,... where 条件;
    举例:
    SET SQL_SAFE_UPDATES = 0;
    update emp set sal=sal+1000,hiredate=now() where ename='马六';
    update emp t1,emp t2 set t2.sal=t1.sal,t2.hiredate=t1.hiredate,t1.deptno=t2.deptno
    where t1.ename=substring(t2.ename,1,2) and t2.empno in (11,12);
    update emp set sal=(select deptno*1000 from dept where dname='销售部') where empno=3;
    --update emp set (sal,ename)=(select deptno*100,loc from dept where deptno=emp.deptno) where empno=20;
    不支持

    8).删除记录
    语法:
    delete from 表名 where 条件;
    支持同时删除多个表的数据:
    delete 表1,表2,... from 表1,表2,... where 条件;
    支持子查询:
    delete from 表名 where 子查询;
    例子:
    create table dept(
    deptno int(8) not null,
    dname varchar(20),
    loc varchar(100)
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk;
    insert into dept values (10,'开发部','北京');
    insert into dept values (20,'销售部','上海');
    delete from emp where ename='孙七';
    delete emp,dept from emp,dept where emp.deptno=dept.deptno and dname='开发部';
    insert into dept values (10,'开发部','北京');
    update emp set deptno=10 where empno in (1,11);
    update emp set deptno=20 where empno in (2,12);
    delete from emp where deptno=(select deptno from dept where dname='开发部');
    delete from emp where not exists (select 1 from dept where dept.deptno=emp.deptno);

    9).查询记录
    语法:
    select [distinct] *|列,...
    from 表
    where 条件
    group by 分组列,... [with rollup] having 分组后条件
    order by 排序列 asc|desc,...
    limit 起始行数,显示行数
    说明:
    distinct 去重
    * 代表所有列
    条件 可以使用比较运算符= > < >= <= !=,还可以使用逻辑运算符关联多个条件,如and or not
    order by可以按照多个列排序,ASC升序,DESC降序,默认是升序
    limit 起始行数,显示行数 用于分页查询,如limit 100,10 即显示101行到110行这10行记录。
    起始行数不写时默认为0,如limit 100 即显示前100行记录。
    group by 按列进行分组聚合,聚合函数有sumcountmaxminavg等
    with rollup 表明是否对聚合后的结果进行再汇总
    having 表示对分类后的结果再进行条件过滤(即使用分组后的条件)
    举例:
    select count(1) from emp;
    select deptno,count(1) from emp group by deptno;
    select deptno,count(1) from emp group by deptno with rollup;即分组统计部门人数又统计了所有部门的总人数

    10).表连接
    准备数据:
    delete from emp;
    delete from dept;
    insert into emp (empno,ename,sal,hiredate,deptno) values (1,'张三',1000,'2000-01-01',10);
    insert into emp values (2,'李四',1000,'2000-01-01',20);
    insert into emp values (12,'李四_1',1000,'2000-01-01',20);
    insert into emp (empno,ename,sal) values (3,'王五',1000);
    insert into dept values (10,'开发部','北京');
    insert into dept values (20,'销售部','上海');
    insert into dept values (30,'xx部',null);
    连接分为5种:笛卡尔积cross join,内连接(等值连接)inner join,左外连接left join,右外连接right join,全外连接full join。
    10.1) 笛卡尔积cross join
    select * from emp cross join dept;
    10.2) 内连接(等值连接)inner join
    select * from emp inner join dept on emp.deptno=dept.deptno;
    select * from emp,dept where emp.deptno=dept.deptno;
    10.3) 左外连接left join
    select * from emp left join dept on emp.deptno=dept.deptno;
    --select * from emp,dept where emp.deptno=dept.deptno(+);
    10.4) 右外连接right join
    select * from emp right join dept on emp.deptno=dept.deptno;
    10.5) 全外连接full join(mysql不支持full join)
    --select * from emp full join dept on emp.deptno=dept.deptno;
    select * from emp left join dept on emp.deptno=dept.deptno
    union
    select * from emp right join dept on emp.deptno=dept.deptno;

    11).子查询
    11.1)select子查询
    select
    empno,ename,deptno,
    (select dname from dept where deptno=emp.deptno) dname
    from emp;
    11.2)from子查询
    select *
    from dept,(select * from emp where sal>2000) emp
    where dept.deptno=emp.deptno;
    11.3) where子查询
    select * from emp
    where deptno in (select deptno from dept where dname='RESEARCH');
    11.4) insert子查询
    insert into dept (deptno,dname)
    select round(empno/100),upper(ename) from emp where job='MANAGER';
    11.5) update子查询
    SET SQL_SAFE_UPDATES = 0;
    update emp set sal=(select deptno*1000 from dept where deptno=emp.deptno) where empno=7369;
    --update emp set (sal,ename)=(select deptno*100,loc from dept where deptno=emp.deptno) where empno=7369;
    等价修改为:
    update emp,dept
    set sal=dept.deptno*10,ename=dept.loc
    where emp.deptno=dept.deptno and ename='SMITH';
    11.6) delete子查询
    delete from emp where deptno=(select deptno from dept where dname='开发部')and empno=7639;
    delete from emp where not exists (select 1 from dept where dept.deptno=emp.deptno) and empno=7639;

    12).并交差
    12.1) union all 合并不去重
    select * from emp where deptno in (10,20)
    union all
    select * from emp where deptno in (10,30);
    12.2) union 合并且去重(union all+distinct)
    select * from emp where deptno in (10,20)
    union
    select * from emp where deptno in (10,30);
    12.3) Intersect 交集 mysql不支持
    select * from emp where deptno in (10,20)
    intersect
    select * from emp where deptno in (10,30);
    等价实现:
    select * from
    (select * from emp where deptno in (10,20)) t1,
    (select * from emp where deptno in (10,30)) t2
    where t1.empno=t2.empno;
    12.4) minus/except 差集 mysql不支持
    select * from emp where deptno in (10,20)
    minus/except
    select * from emp where deptno in (10,30);
    等价实现:
    select * from emp where deptno in (10,20)
    and empno not in (select empno from emp where deptno in (10,30));

    2.2.4 DCL语句
    commit 提交
    rollback 回退
    grant 授权
    revoke 回收权限
    例子:
    update emp set ename='SMITH' where empno=7369;
    commit;
    update emp set ename='SMITH_1' where empno=7369;
    rollback;
    --因为mysql设置的自动提交,所以不需要使用commit显示提交,且rollback回退命令失效。
    语法:
    grant 权限 on 模式.表 to 用户;
    revoke 权限 on 模式.表 from 用户;
    例子:
    grant select,insert on scott.* to 'li'@'%' identified by '123'; -- 授权并创建用户
    revoke insert on scott.* from 'li'@'%'; -- 回收权限

    2.3 帮助的使用
    2.3.1 按照层次看帮助
    ? contents 用来显示可供查询的分类
    ? 类别名称 可以查看某个类别的详细信息,如:
    ? data type 查看到所有的数据类型
    ? auto_increment 查看自增长类型
    ? int 查看int类型
    2.3.2 快速查阅帮助
    ? 关键字 关键字快速查询
    ? show 查看show命令可以查看的内容及show命令语法
    ? create table 查看建表语句语法
    2.3.3 常用的网络资源
    https://dev.mysql.com/downloads/ mysql官网,可以下载mysql及相关开发工具
    https://dev.mysql.com/doc 文档下载
    https://bugs.mysql.com bug列表及bug报告提交
    https://www.mysql.com/news-and-events/newsletter/ mysql最新消息

    2.4 查询元数据信息
    元数据是指数据的数据,即表名、列名、列类型、索引名等
    5.0之前的版本查看元数据只能通过如下命令:
    show tables; 查看模式下的所有表
    show create table table_name; 查看某个表的建表语句
    show table status; 查看模式下所有表的状态
    举例:
    show tables;
    show create table emp;
    show table status;
    show databases;
    show tables from scott;
    show columns from scott.emp;
    show index from scott.emp;
    5.0之后的版本新增了information_schema库(模式),用来记录mysql中的元数据,可以通过下列表批量查看元数据:
    SCHEMATA:记录mysql实例中所有的数据库信息,show databases命令取自SCHEMATA;
    TBALES:记录数据库中所有表的信息及表的属性信息,show tables from schemaname命令取自TBALES;
    COLUMNS:记录数据库中表的所有列信息及列的属性信息,show columns from schemaname.tablename命令取自COLUMNS;
    STATISTICS:提供有关表索引的信息,show index from schemaname.tablename命令取自STATISTICS。
    举例:
    select * from information_schema.SCHEMATA;
    select * from information_schema.TABLES where table_schema='scott';
    select * from information_schema.COLUMNS where table_schema='scott' and table_name='emp';
    select * from information_schema.STATISTICS where table_schema='scott' and table_name='emp';

    2.5 小结

  • 相关阅读:
    Dubbo学习记录(一)
    Quartz定调度简单案例
    oracle中批量生成字段类型的脚本
    MsSQLserver中修改字段值系统自动生成的脚本
    根据oracle的主键列生成SQLserver的主键
    SQLServer2005如何批量修改架构名
    win10 下oracle tns通过IP无法访问的解决办法
    PD PDM模型中关系设置为概念模型样式
    PB12.5.2安装
    Java Web 项目目录规范
  • 原文地址:https://www.cnblogs.com/BradMiller/p/9511310.html
Copyright © 2011-2022 走看看