zoukankan      html  css  js  c++  java
  • [原创]MYSQL的简单入门

    MYSQL简单入门:

    查询库名称:show databases;
    information_schema
    mysql
    test
    2:创建库
    create database 库名 DEFAULT CHARACTER SET utf8;//修改编码
    3:删除库
    drop database 库名
    4:进入当前库
    use 库名;


    #表管理
    1:创建表
    create table 表名(列名 类型,列名 类型);
    数据类型
    整型
    -TINYINT 年龄常用
    -INT {常用}
    -BIGINT
    小数
    -DOUBLE
    -DECIMAL 货币常用
    字符串类型
    char(10) 固定长度字符串 如果字符不足10位,那么后面自动补充空格
    varchar(10) 可变长度字符串{常用} 如果字符不足10位,那么长度自动缩短到字符的长度
    日期类型
    datetime 日期和时间-范围大{常用}
    timestamp 日期和时间
    date 日期
    time 时间


    示例:创建表

    1 use test;
    2 create table t_stu(
    3 id int,
    4 name varchar(25),
    5 age tinyint,
    6 rdate datetime
    7 ); 

    查询当前库中的表 show tables;
    查询创建表指令

    1 show create table t_stu;

    :2:更新表
    #添加一列

    1 alter table t_emp add rdate datetime;
    2 alter table t_emp add age int;

    #删除一列

    1 alter table t_emp drop age;

    #修改列的属性

    1 alter table t_emp MODIFY age tinyint;

    #修改列的名称

    1 alter table t_emp CHANGE age age1 tinyint;

    表操作
    #添加
    (1):按顺序将所有列添加数据

    1 insert into t_emp values(1,'tom',100000,now(),19);

    (2):不按顺序只添加部分数据

    1 insert into t_emp(id,name,salary)values(2,'Jerry',9000.00);

    (3):mysql特有的插入方法,一次添加多行

    1 insert into t_emp values(3,'tom3',10000,now(),19),(4,'tom4',100000,now(),20);

    #建议使用第二种方式
    #更新

    1 update t_emp set salary=salary*1.1,age1=age1+1;

    #删除
    #删除之前一定确认(留备份)
    #删除记录之前给条件(全删)

    1 delete from t_emp where salary<10000;

    :3:删除表
    delete from t_emp where 条件

    练习1:
    1:创建两张表 emp 雇员表
    dept 部门表
    2:添加记录
    emp
    empno ename rdate sal comm deptno job
    001 tom 2000-10-9 1000 null 10 经理
    002 jerry 2000-11-12 2000 null 30 工程师
    003 kk 2000-1-1 3000 null 10 工程师
    004 cc 2000-10-12 800 null 20 工程师
    005 qq 1999-10-03 1000 null 10 工程师
    dept

    dept
    deptno dname loc
    10 财务部 洛杉矶
    20 工程部 纽约
    30 销售部 德州

    #创建emp表

    1 create table t_emp(
    2 empno int,
    3 ename varchar(25),
    4 rdate datetime,
    5 sal decimal(10,2),
    6 comm decimal(10,2),
    7 deptno int,
    8 job varchar(20)
    9 );


    #创建dept

    1 create table t_dept(
    2 deptno int,
    3 dname varchar(20),
    4 loc varchar(20)
    5 );

    #对emp表插入数据

    1 insert into t_emp(empno,ename,rdate,sal,comm,deptno,job) values (001,'tom1','2000-10-9',1000.00,null,10,'经理');
    2 insert into t_emp(empno,ename,rdate,sal,comm,deptno,job) values (002,'jerry','2000-11-12',2000.00,500.00,30,'工程师');
    3 insert into t_emp(empno,ename,rdate,sal,comm,deptno,job) values (003,'tom2','2000-10-3',3000.00,null,10,'工程师');
    4 insert into t_emp(empno,ename,rdate,sal,comm,deptno,job) values (004,'tom3','2000-10-1',800.00,1000.00,20,'工程师');
    5 insert into t_emp(empno,ename,rdate,sal,comm,deptno,job) values (005,'tom4','1999-10-12',1000.00,300.00,10,'工程师');

    #对dept表插入数据

    1 insert into t_dept(deptno,dname,loc)values(10,'财务部','洛杉矶');
    2 insert into t_dept(deptno,dname,loc)values(20,'工程部','纽约');
    3 insert into t_dept(deptno,dname,loc)values(30,'销售部','德州');

    #查询
    #*所有列

    1 select * from emp;

    #优化方案

    1 select empno,ename,sal,comm,deptno,job from t_emp;

    #条件
    where sal>2000;

    #and 并且 or 或者 not 不

    练习二:
    1:工资大于1000所有员工信息

    1 select * from t_emp where sal>1000;

    2:职务等于工程师所员工信息

    1 select * from t_emp job='工程师';

    3:入职时间1999-10-12~2000-10-3 范围入职员工

    1 select * from t_emp where rdate between '1999-10-12' and '2000-10-3';

    4:没有奖金的员工

    1 select * from t_emp where isnull(comm);

    4.1:有奖金的员工

    1 select * from t_emp where not isnull(comm);

    5:查询部门编号10所有员工信息

    1 select * from t_emp where deptno=10;

    #解决乱码

    1 set names utf8;
    2 source d:db.sql;

    ------------------
    set names gbk;
    删除表中所有的数据
    重新插入

    6:排序

    1 select empno,ename,sal from t_emp
    2 where sal>1000 order by sal desc;//desc 降序 asc 升序

    7:分组 统计按照所有的部门分组求工资总和

    1 select sum(sal) from t_emp;
    2 select empno,sum(sal) from t_emp group by
    3 deptno;
    4 
    5 select deptno,avg(sal) from t_emp
    6 group by deptno;

    #查询 按职务分组 显示职务名称
    #工资总和

    1 select job,sum(sal) from t_emp group by job;

    #查询:按职务分组,显示职务名称
    #该职人数,count()
    #人数大于1显示

    1 select job ,count(job) from t_emp group by job
    2 having count(job)>1;

    #强调
    #max() min() count() sum()
    1:如果条件中出现分组函数 将where换成having
    2:在select语句中出现的字段 如果有分组语句
    字段一定要加分组函数
    或者在group by 中出现


    8:子查询
    #查询与tom2员工相同的职务

    1 select job from t_emp where ename='tmo2'

    #所有员工的信息

    1 select empno,ename,job,sal
    2 from t_emp where job=(select job from t_emp where ename='jerry');

    9;多表查询
    #查询员工的编号,员工姓名,职务,部门名称

    1 select e.empno,e.ename,e.job,d.dname
    2 from t_emp e,t_dept d
    3 where e.deptno=d.deptno;

    练习:
    1:查询员工信息 条件工资900-1000之间

    1 select * from t_emp where sal between 900 and 1000;

    2:查询员工姓名与工资,按工资排序

    1 select ename,sal from t_emp order by sal;

    3:查询员工信息,条件 部门编号与tom1相同
    所有员工

    1 select * from t_emp where deptno=(select deptno from t_emp where ename='tom1');

    4:按员工部门编号分组,查询部门平均工资
    大于1000的部门编号

    1 select deptno,avg(sal) from t_emp group by deptno
    2 having avg(sal)>1000;

    5:查询,员工姓名,员工工资 ,部门位置

    1 select e.ename,e.sal,d.loc
    2 from t_emp e,t_dept d
    3 where e.deptno=d.deptno;

    #索引
    索引:数据库一个对象
    作用:提高查询速度
    缺点:控制繁琐
    #原理:
    1:索引独立对象单独保存{有序}索引表
    2:查询方式{类二分查找法}查询速度极快

    1:创建索引
    #手工创建:

    1 CREATE INDEX idx_empno
    2 on t_emp(empno);

    #idx_empno:索引名称
    #emp:表名
    #empno:列名

    #唯一索引(这一列名所有数据是唯一不能重复)
    #效率比较高

    1 CREATE UNIQUE INDEX idx_empno
    2 on t_emp(empno);

    #组合索引

    1 CREATE UNIQUE idx_empno_ename
    2 ON t_emp(empno,ename);

    #部分索引

    1 CREATE INDEX idx_ename
    2 on t_emp(ename(5));

    #自动创建:

    c:查询当前表中所有索引的名称与类型

    1 show index from t_emp G; 

    2:删除索引

    1 DROP INDEX idx_empno ON t_emp;
    2 DROP INDEX idx_ename ON t_emp;
    3 DROP INDEX idx_empno_ename ON t_emp;

    练习:
    1:dept表的deptno 列添加唯一索引

    1 CREATE UNIQUE INDEX idx_deptno
    2 ON t_dept(deptno);

    2:dept表的dname 列添加前缀索引(5)

    1 CREATE INDEX idx_dname ON t_dept(dname(5));

    3:查询dept表中所有索引

    1 show index from t_dept G;

    3:使用索引(分析索引生效)
    3.1:哪些列需要加索引
    a:经常作为条件的列加索引

    1 select empno,ename,sal,job
    2 from emp
    3 where empno = 1;

    b:列:唯一性太差不用加索引
    性别:
    c:频繁更新的列不用加索引
    logincount
    3.2:查询时应该如何写
    a:添加索引的列放在条件中

    1 select empno,ename,job
    2 from emp
    3 where empno = 12;

    b:组合索引注意(最左前缀原则)

    1 create index idx_no_name_sal on emp(empno,ename,sal);
    2 select empno,ename,sal,job,rdate
    3 from emp
    4 where
    5 empno = 1 and
    6 ename = 'tom' and
    7 sal < 1000;

    3.3:如何分析索引是否生效

    1 explain select empno,ename,sal
    2 from emp G;
    3 
    4 explain select empno,ename,sal
    5 from emp
    6 where empno = 1 G;

    #本次查询可能用到索引
    possible_keys: idx_no_name_sal
    #本次查询用到索引
    key: idx_no_name_sal
    #查询索引用到索引长度
    key_len: 5
    #查询一行
    rows: 1

    #约束
    :数据为中一种强制性手段
    :保存数据正确性完整性
    1:主键 {强制要求当前列不能为空,不能重复}
    a:创建表时指定
    b:后在加

    1 alter table emp add PRIMARY KEY(empno);

    #强调:添加主键mysql会自动为当前列
    # 添加索引
    #固定套路
    #没有特殊原因:一张表加主键 id {记录编号}
    #主键列没有任何实际含义

    2:不为空
    #当前列不能为空

    1 alter table emp modify ename not null;

    #固定套路
    #所有列都加 not null
    #所有not null 后添加默认值(防止mysql BUG)

    1 alter table emp modify ename varchar(25) not null default '';
    2 alter table emp modify sal decimal(10,2) not null default 0;

    3:唯一性 {当前列不能重复}

    1 alter table emp add UNIQUE (ename);

    4:外键

    1 alter table dept add PRIMARY KEY(deptno);

    #添加外键

    1 alter table emp add FOREIGN KEY(deptno)
    2 REFERENCES dept(deptno);

    5:检查(mysql不支持) enum()替换

    1 alter table emp add sex enum('F','M') not null default '

    #表设计



    #事务 一般在出现并发数据访问时采用(就是一条数据同时被多个用户操作)
    概念:多条不可分割的sql语句
    作用:保存数据完整性一致性
    相关概念:
    1:事务ACID特性
    1:原子性 A 不可分割(要成功都成功,如果一个失败全失败)
    2:一致性 C (将数据库从一种状态转变为下一种状态){前后一致}
    3:隔离性 I {一个事务在未提交之前其他事务不可见}
    4:持久性 D {事务一旦提交,结果是永久的}
    2:事务隔离级别{级别高}
    脏读:一个事务读取到另一个事务未提交的数据
    不可重复读:同一个事务内,二次读同一条数据,结果不一致
    幻读:很少出现
    mysql以上三种情况都不会出现

    #如何使用事件
    START TRANSACTION 开始事务(begin)
    commit; 提交事务
    rollback; 回滚事务

    练习:
    1:创建表

    1 create table t_bank(
    2 id int,
    3 name varchar(20),
    4 m decimal(10,2)
    5 )ENGINE=innodb;
    6 insert into t_bank values(1,'wqh',7200);
    7 insert into t_bank values(2,'tom',1000);

    2:开始事务/更新

    1 wqh: START TRANSACTION
    2 update t_bank set m=0 where id=2;
    3 update t_bank set m=m+100 where id=1;
    4 commit;

    1:开启事务
    2:
    3:提交事务
    #表引擎
    mysql 数据库特性
    作用:不同的业务要求可以选择不同的表引擎
    哪些表引擎:
    myisam:
    1:表查询的多 更新的少
    2:表数据量小
    3:表不需要事务和外键支持
    4:便于管理(copy/备份)
    #现在很少使用了
    innodb
    1:功能强(事务,外键支持)
    2:查询速度快
    3:管理稍复杂

    #建议:都使用innodb
    如何使用表引擎:
    1:创建表指定表引擎

    2:创建表后修改(建议不用)

    1 create table t_bank(
    2 id int,
    3 name varchar(20),
    4 m decimal(10,2)
    5 )ENGINE=innodb;

    //修改mysql的配置文件
    my.ini中的编码 utf8
    修改完后 到服务中去关闭 在打开服务

    SQL注入
    SQL注入:网络攻击手段
    statement 安全漏洞
    PreparedStatement: 几乎没有

    1 "SELECT count(*) FROM t_user
    2 WHERE name='"+name+"' and pwd = '"+pwd+"';
    3 String name = "' or 1=1 #";
    4 
    5 select count(*) from t_user
    6 where name='' or 1=1 #


    用户名:tom jerry james tuodou

    1 drop table;
    2 delete from t_user;
    3 delete from mysql.user;

    连接池:阿里driud{效率极快,安全性}

    =======================================
    分页查询
    问题:什么是分页,为什么使用分页?
    分页就是将数据以多页去展示,使用分页可以提高客户的感受。

    分页分类:
    1.物理分页
    只从数据库中查询出当前页的数据。
    优点:不占用很多内存
    缺点:效率比较低
    2.逻辑分页
    从数据库中将所有记录查询出业,存储到内存中,要想展示当前页
    数据,直接从内存中获取。
    优点:效率高
    缺点:占用内存比较高

    在java开发领域,我们使用的比较多的是物理分页。
    物理分页的实现:

    1.直接使用jdbc完成
    使用滚动结果集. 优点:跨数据库。缺点:性能低。
    2.使用数据库本身提供的分页操作.
    会使用每一个数据库特定的分页函数,优点:性能高 缺点:不能跨数据库。

    mysql:limit
    sqlservlet:top
    oracle:rownum

    介绍limit使用.
    select * from 表 limit m,n;
    m:代表的是从第几条开始 注意:它是从0开始记录.
    n:代表查询几条记录.

    示例:分页音,每页显示6条,要查询第2页的数据.

    select * from 表 limit (页码-1)*每页条数,每页条数;

    ------------------------------------------------------------------------------
    分页分析:
    1.页码 默认第一页
    2.每页条数 人为定义
    3.总条数 select count(*) from 表
    4.总页数 总页数=总条数%每页条数==0?总条数/每页条数:总条数/每页条数+1
    总页数=Math.ceil(总条数*1.0/每页条数);

    5.当前页的数据 List<?>----->select * from 表 limit (页码-1)*每页条数,每页条数;

     作者:little飞 出处:http://www.cnblogs.com/little-fly/ 欢迎转载 也请保留这段声明 谢谢!

    大家可以相互学习,我们都是热爱编程的IT少年,大家一起努力,让我们的IT梦飞得更高吧!!!
  • 相关阅读:
    面试官:请说一下对象锁和类锁的区别
    手撕 JVM 垃圾收集日志
    JVM 问题排查和性能优化常用的 JDK 工具
    JVM 中你不得不知的一些参数
    微信授权就是这个原理,Spring Cloud OAuth2 授权码模式
    基准测试了 ArrayList 和 LinkedList ,发现我们一直用 ArrayList 也是没什么问题的
    Spring Cloud OAuth2 实现用户认证及单点登录
    后端开发有必要学习前端吗,如何入门呢
    无意间做了个 web 版的 JVM 监控端(前后端分离 React+Spring Boot)
    走进AngularJs(一)angular基本概念的认识与实战
  • 原文地址:https://www.cnblogs.com/little-fly/p/6252650.html
Copyright © 2011-2022 走看看