Wt Blog


  • 首页

  • 归档

MySQL-(练习题)

发表于 2019-06-24

练习题

  1. 查询没有上级领导的员工的编号,姓名,工资

    1
    select empno,ename,sal from emp where mgr is null;
  2. 查询emp表中没有奖金的员工的姓名,职位,工资,以及奖金

    1
    select ename,job,sal,comm from emp where comm=0 or comm is null;
  3. 查询emp表中含有奖金的员工的编号,姓名,职位,以及奖金

    1
    select empno,ename,job,comm from emp where comm>0;
  4. 查询含有上级领导的员工的姓名,工资以及上级领导的编号

    1
    select ename,sal,mgr from emp where mgr is not null;
  5. 查询emp表中名字以‘S’开头的所有员工的姓名

    1
    select ename from emp where ename like 's%';
  6. 查询emp表中名字的最后一个字符是’S’的员工的姓名

    1
    select ename from emp where ename like '%s';
  7. 查询倒数的第2个字符是‘E’的员工的姓名

    1
    select ename from emp where ename like '%e_';
  8. 查询emp表中员工的倒数第3个字符是‘N’的员工姓名

    1
    select ename from emp where ename like '%n__';
  9. 查询emp表中员工的名字中包含‘A’的员工的姓名

    1
    select ename from emp where ename like '%a%';
  10. 查询emp表中名字不是以’K’开头的员工的所有信息

    1
    select * from emp where ename not like 'k%';
  11. 查询emp表中名字中不包含‘A’的所有员工的信息

    1
    select * from emp where ename not like '%a%';
  12. 做文员的员工人数(job 中 含有 CLERK 的)

    1
    select count(*) from emp where job='clerk';
  13. 销售人员 job: SALESMAN 的最高薪水

    1
    select max(sal) from emp where job='SALESMAN';
  14. 最早和最晚入职时间

    1
    select min(hiredate),max(hiredate) from emp;
  15. 查询类别 163的商品总库存量

    1
    select sum(num) from t_item where category_id=163;
  16. 查询 类别 163 的商品

    1
    select * from t_item where category_id=163;
  17. 查询商品价格不大于100的商品名称列表

    1
    select title from t_item where price<=100;
  18. 查询品牌是联想,且价格在40000以上的商品名称和价格

    1
    select title,price from t_item where title like '%联想%' and price>40000;
  19. 查询品牌是三木,或价格在50以下的商品名称和价格

    1
    select title,price from t_item where title like '%三木%' or price<50;
  20. 查询品牌是三木、广博、齐心的商品名称和价格

    1
    select title,price from t_item where title like '%三木%' or title like '%广博%' or title like '%齐心%';
  21. 查询品牌不是联想、戴尔的商品名称和价格

    1
    select title,price from t_item where title not like '%联想%' and title not like '%戴尔%';
  22. 查找品牌是联想且价格大于10000的名称

    1
    select title from t_item where title like '%联想%' and price>10000;
  23. 查询联想或戴尔的电脑名称列表

    1
    select title from t_item where title like '%联想%' or title like '%戴尔%';
  24. 查询emp表中员工的编号,姓名,职位,工资,并且工资在1000~2000之间。

    1
    select empno,ename,job,sal from emp where sal between 1000 and 2000;
  25. 查询emp表中员工在10号部门,并且含有上级领导的员工的姓名,职位,上级领导编号以及所属部门的编号

    1
    select ename,job,mgr,deptno from emp where deptno=10 and mgr is not null;
  26. 查询emp表中名字中包含’E’,并且职位不是MANAGER的员工的编号,姓名,职位,以及工资。

    1
    select empno,ename,job,sal from emp where ename like '%e%' and job!='manager';
  27. 查询emp表中10号部门或者20号部门中员工的编号,姓名,所属部门的编号

    1
    select empno,ename,deptno from emp where deptno in(10,20);
  28. 查询emp表中没有奖金或者名字的倒数第2个字母不是T的员工的编号,姓名,职位以及奖金

    1
    select empno,ename,job,comm from emp where comm=0 or ename not like '%t_';
  29. 查询工资高于3000或者部门编号是30的员工的姓名,职位,工资,入职时间以及所属部门的编号

    1
    select ename,job,sal,hiredate,deptno from emp where sal>3000 or deptno=30;
  30. 查询不是30号部门的员工的所有信息

    1
    select * from emp where deptno!=30;
  31. 查询奖金不为空的员工的所有信息

    1
    select * from emp where comm is not null;
  32. 查询emp表中所有员工的编号,姓名,职位,根据员工的编号进行降序排列

    1
    select empno,ename,job from emp order by empno desc;
  33. 查询emp表中部门编号是10号或者30号中,所有员工姓名,职务,工资,根据工资进行升序排列

    1
    select ename,job,sal from emp where deptno in(10,30) order by sal;
  34. 查询emp表中所有的数据,然后根据部门的编号进行升序排列,如果部门编号一致,根据员工的编号进行降序排列

    1
    select * from emp order by deptno,empno desc;
  35. 查询emp表中工资高于1000或者没有上级领导的员工的编号,姓名,工资,所属部门的编号,以及上级领导的编号,根据部门编号进行降序排列,如果部门编号一致根据工资进行升序排列。

    1
    select empno,ename,sal,deptno,mgr from emp where sal>1000 or mgr isnull order by deptno desc,sal;
  36. 查询emp表中名字中不包含S的员工的编号,姓名,工资,奖金,根据工资进行升序排列,如果工资一致,根据编号进行降序排列

    1
    select empno,ename,sal,comm from emp where ename not like '%s%' order by sal,empno desc;
  37. 统计emp表中员工的总数量

    1
    select count(*) from emp;
  38. 统计emp表中获得奖金的员工的数量

    1
    select count(*) from emp where comm>0;
  39. 求出emp表中所有的工资累加之和

    1
    select sum(sal) from emp;
  40. 求出emp表中所有的奖金累加之和

    1
    select sum(comm) from emp;
  41. 求出emp表中员工的平均工资

    1
    select avg(sal) from emp;
  42. 求出emp表中员工的平均奖金

    1
    select avg(comm) from emp;
  43. 求出emp表中员工的最高工资

    1
    select max(sal) from emp;
  44. 求出emp表中员工编号的最大值

    1
    select max(empno) from emp;
  45. 查询emp表中员工的最低工资。

    1
    select min(sal) from emp;
  46. 查询emp表中员工的人数,工资的总和,平均工资,奖金的最大值,奖金的最小值,并且对返回的列起别名。

    1
    select count(*) 人数,sum(sal) 工资总和,avg(sal) 平均工资, max(comm) 奖最大, min(comm) 奖金最小 from emp;

关联

  1. 每个部门的人数,根据人数降序排序

    1
    select deptno,count(*) c from emp group by deptno order by c desc;
  2. 每个部门中,每个主管的手下人数

    1
    select deptno,mgr,count(*) from emp where mgr is not null group by deptno,mgr;
  3. 每种工作的平均工资

    1
    select job,avg(sal) from emp group by job;
  4. 每年的入职人数

    1
    select extract(year from hiredate) y,count(*) from emp group by y;
  5. 拿最低工资的员工信息

    1
    select * from emp where sal=(select min(sal) from emp);
  6. 少于等于3个人的部门信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    不考虑40号部门	
    select deptno from emp group by deptno having count(*)<=3;
    select * from dept where deptno in(上面一坨);
    考虑40号部门
    select d.*
    from emp e right join dept d
    on e.deptno=d.deptno
    group by d.deptno
    having count(e.ename)<=3;
  7. 只有一个下属的主管信息

    1
    2
    3
    4
    查询只有一个下属的主管编号
    select mgr from emp where mgr is not null group by mgr having count(*)=1;
    通过主管编号查询主管信息
    select * from emp where empno in(select mgr from emp where mgr is not null group by mgr having count(*)=1);
  8. 每月发工资最多的部门信息

    1
    2
    3
    4
    5
    6
    得到最高的工资数
    select sum(sal) s from emp group by deptno order by s desc limit 0,1;
    通过最高工资获取部门编号
    select deptno from emp group by deptno having sum(sal)=(select sum(sal) s from emp group by deptno order by s desc limit 0,1);
    通过部门编号得到部门信息
    select * from dept where deptno in(上面一坨);
  9. 下属最多的人,查询其个人信息

    1
    2
    3
    4
    5
    6
    - 得到最多的人数
    select count(*) from emp group by mgr order by count(*) desc limit 0,1;
    - 通过人数获取主管编号
    select mgr from emp group by mgr having count(*)=(select count(*) from emp group by mgr order by count(*) desc limit 0,1);
    - 通过主管编号得到员工信息
    select * from emp where empno in(上面一坨);
  10. 拿最高工资员工的同事信息

    1
    2
    3
    4
    5
    6
    - 查询最高工资
    select max(sal) from emp;
    - 查询最高工资员工的部门编号
    select deptno from emp where sal=(select max(sal) from emp);
    - 通过部门编号查询员工信息
    select * from emp where deptno=(select deptno from emp where sal=(select max(sal) from emp)) and sal!=(select max(sal) from emp);
  11. 和最后入职的员工在同一部门的员工信息 实现流程和第十题一样

    1
    2
    3
    4
    5
    6
    - 得到时间最大值
    select max(hiredate) from emp;
    - 获取最后入职员工的部门编号
    select deptno from emp where hiredate=(select max(hiredate) from emp);
    - 通过部门编号获取员工信息
    select * from emp where deptno=(select deptno from emp where hiredate=(select max(hiredate) from emp)) and hiredate!=(select max(hiredate) from emp);
  12. 查询平均工资高于20号平均工资的部门信息

    1
    2
    3
    4
    5
    6
    -20号部门的平均工资
    select avg(sal) from emp where deptno=20;
    - 查询高于20号部门平均工资的部门编号
    select deptno from emp group by deptno having avg(sal)>(select avg(sal) from emp where deptno=20);
    - 通过部门编号查询部门信息
    select * from dept where deptno in(select deptno from emp group by deptno having avg(sal)>(select avg(sal) from emp where deptno=20));
  13. 查询员工信息和员工对应的部门名称

    1
    2
    3
    select e.*,d.dname
    from emp e join dept d
    on e.deptno=d.deptno;
  14. 查询员工信息,部门名称,所在城市

    1
    2
    3
    select e.*,d.dname,d.loc
    from emp e join dept d
    on e.deptno=d.deptno;
  15. 查询Dallas市所有的员工信息

    1
    2
    3
    4
    select e.*
    from emp e join dept d
    on e.deptno=d.deptno
    where d.loc='dallas';
  16. 计算每个城市的员工数量

    1
    2
    3
    select d.loc,count(e.ename)
    from emp e right join dept d
    on e.deptno=d.deptno group by d.loc;
  17. 查询员工信息和他的主管姓名

    1
    2
    3
    4
    - 自关联查询时把一张表当成两张表 
    select e.ename,m.ename
    from emp e join emp m
    on e.mgr=m.empno;
  18. 员工信息,员工主管名字,部门名

    1
    2
    3
    4
    5
    select e.*,m.ename,d.dname
    from emp e join emp m
    on e.mgr=m.empno
    join dept d
    on e.deptno=d.deptno;
  19. 员工名和他所在部门名

    1
    2
    3
    select e.ename,d.dname
    from emp e join dept d
    on e.deptno=d.deptno;
  20. 查询emp表中所有员工的姓名以及该员工上级领导的编号,姓名,职位,工资

    1
    2
    3
    select e.ename,m.empno,m.ename,m.job,m.sal
    from emp e left join emp m
    on e.mgr=m.empno;
  21. 查询emp表中名字中没有字母’K’的所有员工的编号,姓名,职位以及所在部门的编号,名称,地址

    1
    2
    3
    4
    select e.empno,e.ename,e.job,d.*
    from emp e join dept d
    on e.deptno=d.deptno
    where e.ename not like '%k%';
  22. 查询dept表中所有的部门的所有的信息,以及与之关联的emp表中员工的编号,姓名,职位,工资

    1
    2
    3
    select d.*,e.empno,e.ename,e.job,e.sal
    from emp e right join dept d
    on e.deptno=d.deptno;

MySQL-define

发表于 2019-06-20

数据库

约束

  • 用于限制约定表中的数据完整性, 有效性.
  • 数据库提供了”基础的”完整性,有效性检查.

主键约束 primary key

  • 什么是主键: 表示数据唯一性的字段称为主键
  • 什么是约束: 是创建表时给表字段添加的限制条件
  • 主键约束: 让该字段的数据唯一且非空(不能重复,不能null)
    1
    2
    3
    4
    格式: create table t1(id int primary key,name varchar(10));
    insert into t1 values(1,'AAA'); //成功!
    insert into t1 values(1,'BBB');//报错 不能重复
    insert into t1 values(null,'CCC'); //报错 不能为null

主键约束+自增

  • 自增数值只增不减,从历史最大值基础上+1
    1
    2
    3
    4
    5
    6
    7
    8
    格式: create table t2(id int primary key auto_increment,name varchar(10));
    insert into t2 values(null,'aaa'); //1
    insert into t2 values(null,'bbb'); //2
    insert into t2 values(3,'ccc'); //3
    insert into t2 values(10,'ddd'); //10
    insert into t2 values(null,'eee'); //11
    delete from t2 where id>=10;
    insert into t2 values(null,'fff'); //12

非空约束

  • 验证表中的列值, 不能添加空值.
  • 在设计表的时候为列添加非空约束, 则在插入更改数据时候, 一旦数据为null则报错, 进制添加和修改.
  • 在字段类型后面添加 “ not null ”
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    建表
    create table t3(
    id int primary key,
    name varchar(50) not null,
    nick varchar(50)
    );

    测试
    -- 正常插入
    insert into t3 (id, name, nick)
    values (1, '刘国斌', null);
    insert into t3 (id, name, nick)
    values (2, '范传奇', '范老湿');
    -- 错误插入
    insert into t3 (id, name, nick)
    values (3, null, '范');

唯一约束

  • 限定一个列中的值, 不能重复, 保持唯一. 除了主键以外的其他列保持唯一
  • 在字段类型后面添加 unique
    1
    2
    3
    4
    5
    6
    7
    8
    建表
    -- 设定邮箱地址列是唯一约束, 不能重复
    create table t4(
    id int primary key,
    name varchar(50) not null,
    email varchar(100) unique
    );
    验证: 插入重复的邮箱地址时候出现错误!

默认约束

  • 为列添加默认值
  • 在字段类型后面添加 default ‘男’
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    建表
    -- 将性别的默认值设置为 男
    create table t5(
    id int primary key,
    name varchar(50) not null,
    sex varchar(10) default '男'
    );

    验证
    insert into t5 (id, name) values (1, '范传奇');
    insert into t5 (id, name, sex) values (2,'刘国斌','女');

外键约束

  • 检查表中列取值于另外一个表的主键列
  • 语法: FOREIGN KEY(外键列) REFERENCES 主键表(主键列)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    建表
    -- 主键表
    create table user(
    id int primary key,
    name varchar(50) not null
    );
    -- 外键表
    create table trad(
    id int primary key,
    uid int,
    money double,
    FOREIGN KEY(uid) REFERENCES user(id)
    );
    外键列: uid 列的值必须是 user id 的值!
  • 外键特点:

  1. 添加外键约束的字段值可以为null,但是不能是关联表中不存在的数据
  2. 如果建立了关系被关联的数据不能先删除,被关联的表不能先删除
  3. 有外键关联以后,删除数据时候,就必须先删除外键关联, 在删除主键表中的数据.

冗余

  • 由于表设计不够合理导致的大量重复数据称为数据冗余

事务

  • 什么是事务:事务是数据库中执行同一业务多条SQL语句的工作单元,可以保证多条SQL全部执行成功或全部执行失败.
  • 事务相关指令:
    1. 开启事务 begin;
    2. 提交事务 commit;
    3. 回滚 rollback;
  • 验证转账流程:
    • create table user(id int primary key auto_increment,name varchar(10),money int,status varchar(5));
    • insert into user values(null,’超人’,50,’冻结’),(null,’蝙蝠侠’,5000,’正常’),(null,’灭霸’,20,’正常’);
  • 转账的SQL:

    • update user set money=money-2000 where id=2 and status=’正常’;
    • update user set money=money+2000 where id=1 and status=’正常’;
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      有事务保护的情况下 回滚流程:
      1. 开启事务
      begin;
      2. 蝙蝠侠-2000
      update user set money=money-2000 where id=2 and status='正常';
      3. 此时在当前终端查询数据时 数据已经改变(因为查询到的是内存中的改动), 开启另外一个终端查询数据发现数据是没有改变的(因为新的终端查询到的是磁盘的数据)
      4. 超人+2000
      update user set money=money+2000 where id=1 and status='正常';
      5. 此时从执行结果中发现一条成功一条失败,应该执行回滚操作
      rollback;
      - 有事务保护的情况下 提交流程:
      1. 开启事务
      begin;
      2. 蝙蝠侠-2000
      update user set money=money-2000 where id=2 and status='正常';
      3. 此时仍然是在内存中改动 磁盘数据没有发生改变
      4. 灭霸+2000
      update user set money=money+2000 where id=3 and status='正常';
      5. 此时两次改动都是在内存中改完,发现两次全部成功,所以执行提交
      commit;
      - 保存回滚点:
      begin;
      update user set money=1 where id=2;
      savepoint s1;
      update user set money=2 where id=2;
      savepoint s2;
      update user set money=3 where id=2;
      rollback to s2;
  • 事务的ACID特性

    • 保证事务正确执行的四大基本要素
  1. Atomicity原子性: 最小不可拆分 保证全部执行成功或全部执行失败
  2. Consistency一致性: 从一个一致状态到另一个一致状态
  3. Isolation隔离性: 多个事务之间互相隔离互不影响
  4. Durability持久性: 当事务提交后数据保存到磁盘中持久生效

SQL分类

DDL Data Definition Language数据定义语言

  • truncate table 表名;
    删除表并创建新表 让自增数值清零
  • 包括: create drop alter truncate
  • 不支持事务

    DML Data Manipulation Language数据操作语言

  • 包括: insert update delete select
  • 支持事务

    DQL Data Query Language 数据查询语言

  • 只包括: select

    TCL Transaction Control Language 事务控制语言

  • 包括: begin,commit,rollback,savepoint xxx, rollback to xxx;

    DCL Data Control Language 数据控制语言

  • 负责分配用户权限相关的SQL

数据类型

  1. 整数: int(m) 和 bigint(m) m代表的是显示长度,需要结合zerofill使用
    • create table t_int(id int,age int(10) zerofill);
    • insert into t_int values(1,18);
    • select * from t_int;
  2. 浮点数: double(m,d) m代表的是总长度 d代表小数长度,超高精度的浮点数decimal(m,d)
  3. 字符串:
  • char(m) 固定长度 最大长度255 好处执行效率略高
  • varchar(m) 可变长度 好处节省空间 最大长度65535(但是超过255建议使用text)
  • text(m) 可变长度 最大长度65535
  1. 日期:
  • date: 保存年月日
  • time: 保存时分秒
  • datetime: 保存年月日时分秒,默认值为null,最大9999-12-31
  • timestamp(时间戳):保存年月日时分秒,默认值为当前系统时间,最大值2038-1-19
    - create table t_date(t1 date,t2 time,t3 datetime,t4 timestamp); 
    - insert into t_date values('2019-6-20',null,null,null);
    - insert into t_date values(null,'16:46:30','2019-06-20 16:30:30',null);
    

导入 * .sql文件

  • windows系统 把文件放在C或D盘的根目录
    • source d:/tables.sql;
  • linux系统 把文件放在桌面
    • source /home/soft01/桌面/tables.sql
    • 查询数据 如果是乱码 执行 set names gbk

关系

  • 一对一, 性能优化
  • 一对多, 解决业务关系, 使用最多
    • 自关联 一对多 分类树
  • 多对多: 中间的关系表
    • 用户和角色

View (视图)

  • 利用一个查询语句构建一个虚拟表. 如果需要查询就可以通过查询视图获得结果.
  • 利用视图可以重用复杂的查询功能, 简化二次查询工作
  • 视图不是表, 视图中不存储数据, 数据是通过内部封装的SQL语句动态查询得到的. 视图的本质是 复用复杂查询
  • 示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    1. 创建视图
    create view student_course as (
    select s.name as student, c.name as course
    from t_student s
    join t_choose cc on s.id = cc.sid
    join t_course c on cc.cid=c.id );
    2. 利用视图进行查询:
    select student, course from student_course
    where student = '莫小贝';

    select student, course from student_course
    where student = '白展堂';
  • 管理view

    • 创建 create view 视图名 as 查询
    • 查询全部视图SHOW FULL TABLES WHERE TABLE_TYPE LIKE ‘VIEW’;
    • 删除视图 drop view 视图名
    • 视图可以嵌套使用

索引

  • 数据库提供的一种高效查询算法! 可以提高海量数据查询效率!
  • 索引可以大大加快大数量的查询效率!
  • 数据量常见索引算法: B+树(B plus Tree)
    • B+树原理: 1. 数据库数据是连续存储到 磁盘 上的数据块. 每次读写一个数据块, 每个数据块读写 需要 几个ms. 如果是海量数据查询时候, 就需要很多次读写每个数据块, 累计时间很长! 2. B+树 建立两层索引数据块, 索引中包含数据的范围. 只需要读取两层索引块两次, 就能确定目标数据的位置. 查询到结果. 大大减少磁盘IO次数, 提高查询性能! 3. 在最终数据块上还有一次IO, 一共3次磁盘块IO就可以读取到数据, 其性能非常好!!
  • 语法:
    1
    2
    3
    4
    5
    6
    7
    create index 索引名 on 表名(字段名(?长度));

    创建索引
    create index idxusername on user(name);

    使用索引(自动使用索引!)
    select id, name from user where name='Tom';

MySQL-(命令)

发表于 2019-06-19

数据库

  1. 查看数据库
  • 格式:show databases;
  1. 创建数据库
  • 格式:create database 数据库名;
  1. 查看数据库详情
  • 格式:show create database 数据库名;
  1. 创建数据库指定字符集
  • 格式:create database 数据库名 character set utf8/gbk;
  1. 删除数据库
  • 格式:drop database 数据库名;
  1. 使用数据库
  • 格式:use 数据库名;

表相关

  1. 创建表
  • 格式:create table 表名(字段1名 字段1类型,字段2名 字段2类型)
  1. 查看所有表
  • 格式:show tables;
  1. 查看表详情
  • 格式:show create table 表名;
  1. 创建表指定引擎和字符集
  • 格式:create table 表名(字段1名 字段1类型,字段2名 字段2类型)
    engine = myisam/innodb charset = utf8/gbk;
  1. 查看表字段
  • 格式:desc 表名;
  1. 删除表
  • 格式:drop table 表名;
  1. 修改表名
  • 格式:rename table 原名 to 新名;
  1. 修改引擎和字符集
  • 格式:alter table 表名 engine = myisam/innodb charset = utf8/gbk;
  1. 添加表字段
  • 格式:alter table 表名 add 字段名 字段类型; //最后
  • 格式:alter table 表名 add 字段名 字段类型 first; //最前面
  • 格式:alter table 表名 add 字段名 字段类型 after XXX; //在XXX的后面
  1. 删除表字段
  • 格式:alter table 表名 drop 字段名;
  1. 修改表字段名和类型
  • 格式:alter table 表名 change 原字段名 新名 新类型;
  1. 修改字段类型和位置
  • 格式:alter table 表名 modify 字段名 字段类型 first/after XXX;

数据相关

  1. 插入数据(增)
  • 全表插入格式:insert into 表名 values(值1,值2,值3)
  • 指定字段插入格式:insert into 表名(字段1名,字段2名) values(值1,值2)
  • 中文问题:
    • insert into emp values (3,’刘备’,30);
    • set names gbk;
  • 批量插入:insert into 表名 values(值1,值2,值3),(值1,值2,值3);
    • insert into 表名 (命名) values(值),(值),(值);
  1. 查询数据
  • 格式:select 字段信息 from 表名 where 条件;
    • select * from 表名; 查询所有数据的所有字段信息
  1. 修改数据
  • 格式:update 表名 set 字段名 = XXX where 条件;
    1
    update emp set age=500 where name='悟空';
  1. 删除数据
  • 格式:delete from 表名 where 条件;
    1
    delete from emp where age is null; #null不可以直接‘=’要用 "is"

主键约束

  • 格式:create table 表名(字段名 字段类型 primary key, 字段名 字段类型);

主键约束+自增

  • 自增数值只增不减,从历史最大值上+1
  • 格式:create table 表名(字段名 字段类型 primary key auto_increment, 字段名 字段类型);

注释

  • 格式:create table 表名(字段名 字段类型 primary key auto_increment comment ‘ 注释 ‘, 字段名 字段类型 comment ‘ 注释 ‘);

“`”的作用

  • 用于修饰表名和字段名,可以省略
    1
    create table `t4`(`id` int,`name` varchar(10));

事务

  • 事务相关指令
    1. 开启指令:begin
    2. 提交事务:commit
    3. 回滚:rollback
    4. 保存回滚点:savepoint XXX
    5. 回到回滚点:rollback to XXX
      1
      2
      3
      4
      5
      6
      使用
      begin;
      update user set money=2 where id=2;
      savepoint s1;
      update user set money=1 where id=2;
      rollback to s1;

and 和 or

  • 如果查询数据时需要同时满足多个条件则使用and &&
  • 如果查询数据时只需要满足条件中的某一个则使用or ||

is null 和 is not null

1
2
从员工表中查询 没有上级领导的员工姓名,工资
select ename,sal from emp where mgr is null;

别名

1
2
3
select ename as '姓名' from emp;
select ename '姓名' from emp;
select ename 姓名 from emp;

比较运算符

1
>  <  <=  >=  !=和<>

去重 distinct

1
2
查询员工表中有哪些职位
select distinct job from emp;

模糊查询 like

  • % 代表0或多个字符
  • “ _ “ 代表单个未知字符
    • 包含:%X%

查询两组数据之间

  • between x and y

查询多个字段值

  • in(值 逗号隔开)

排序 order by

  • 格式:order by 字段名 asc/desc asc:升序(默认) desc:降序
  • order by 写在条件的后面
  • 多字段排序:order by 字段1 asc/desc,字段2 asc/desc

分页查询

  • 格式:limit 跳过的条数,请求的条数
  • 公式:limit (页数-1) * 数量,数量

数值计算

  • “ + - * / % ”
    1
    select ename,sal,sal+5 加薪后 from emp;

日期相关SQL

  • 获取系统时间 now( )

    1
    2
    create table t_date(name varchar(10),birthday datetime);
    insert into t_date values('AAA',now());
  • 获取当前的年月日 和当前的时分秒 cur=current 当前

    1
    2
    select "helloworld";
    select curdate(),curtime();
  • 从年月日时分秒中 提取年月日 和提取时分秒

    1
    2
    select date(now())
    select time(now())
  • 从年月日时分秒中提取时间分量

    1
    2
    3
    4
    5
    6
    select extract(year from now()); #年
    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());#秒
  • 日期格式化 date_format(时间,格式)

    • 格式规则:%Y 四位年 %y 两位年 (19)
    • %m 2位月 (06) %c 一位月
    • %d 日 %H 24小时 %h 12小时
    • %i 分钟 %s 秒
      1
      select date_format(now(),'%Y年%m月%d号 %H点%i分%s秒');
  • 反向格式化 str_to_date(时间,格式)

    1
    select str_to_date('20.06.2019 15:36:20','%d.%m.%Y %H:%i:%s');

ifnull(x,y)

  • age=ifnull(x,y) 如果x值为null则age=y 否则age=x

聚合函数

  • 对查询的多条数据进行统计查询:平均值 最大值 最小值 求和 计数
  1. 平均值 avg(字段名)
  2. 最大值 max(字段名)
  3. 最小值 min(字段名)
  4. 求和 sum(字段名)
  5. 计数 count(字段名)
    1
    select count(字段名),sum(字段名) from 表名 where 条件;

字符串相关

  1. 字符串拼接 concat(s1,s2)

    1
    select concat('aa','bb');
  2. 获取字符串的长度 char_length(str)

    1
    select char_length('aa');
  3. 获取字符串出现的位置 instr(str,substr)

    1
    select instr('abcdef','d');
  4. 转大小写

    1
    select upper('abc'),lower('ABC');
  5. 截取字符串

    • 左边截取:select left(‘abcdefg’,2);
    • 右边截取:select right(‘abcdefg’,2);
    • 自由截取:select substring(‘abcdefg’,2,3); 3代表长度
  6. 去两端空白 tirm()
  7. 重复 repeat(字符串,重复的次数)
  8. 替换 replace(字符串,需要替换的字符,替换的字符)
  9. 反转 reverse(字符串)

数学相关

  • 向下取整 floor(num)
  • 四舍五入 round(num)
  • 四舍五入 round(num,m) m代表保留小数位数
  • 非四舍五入 truncate(num,m) m代表保留小数位数
  • 随机数 rand() 获得0-1的随机数

分组查询

  • 查询每个部门的平均工资

    1
    select deptno,avg(sal) from emp group by deptno;
  • 多字段分组

    • group by 字段名1,字段名2
      1
      select deptno,job,avg(sal) from emp group by deptno,job;

having

  • where 后面只能写普通字段的条件
  • having 后面写聚合函数的条件,having和分组查询结合使用
  • 各关键字的顺序:select……from 表名 where……group by … having … order by … limit……

子查询(嵌套查询)

  • 查询员工表中工资最高的员工信息

    1
    select * from emp where sal=(select max(sal) from emp);
  • 子查询可以写的位置

    1. 写在where和having后面,当做查询条件的值
    2. 写在创建表的时候,把查询结果保存到新的表中

      1
      create table emp_10 as (select * from emp where deptno=10);
    3. 写在from后面 一定要有别名

      1
      select ename from (select * from emp where deptno=10) t;

关联查询

  • 同时查询多张表的查询方式为关联查询
  • 关联查询必须写关联关系,如果不写则会得到两张表的乘积,这个乘积称为笛卡尔积,这是错误的查询结果,切记工作中不要出现
    • 查询每一个员工的姓名对应的部门名
      1
      2
      3
      select e.ename,d.dname
      from emp e,dept d
      where e.deptno=d.deptno;

关联查询的查询方式之等值连接和内连接

  1. 等值连接:

    1
    select * from A,B where A.x=B.x and A.y>2000;
  2. 内连接:

    1
    2
    3
    4
    5
    select * from A [?inner] join B on A.x=B.x where A.y>2000;
    查询每一个员工的姓名与对应的部门名
    select e.ename,d.dname
    from emp e join dept d
    on e.deptno=d.deptno;

关联查询的查询方式之 外连接

  • 等值连接和内连接查询的是两张表的交集数据
  • 外连接查询的是一张表的全部数据和另外一张表的交集数据

    1
    2
    3
    4
    5
    格式:select * from A left/right join B on A.x=B.x where A.y>2000;
    查询所有的部门名和对应的员工姓名
    select d.dname,e.ename
    from emp e right join dept d
    on e.deptno=d.deptno;
  • 总结: 如果查询的数据是两张表的交集数据使用等值连接或内连接(推荐),如果查询的是一张表的全部数据和另外一张表的交集数据则使用外连接。

JS-jQuery

发表于 2019-06-17

jQuery

  • jQuery框架:是一个通过js语言写的框架,对原生js语言进行封装,可以上程序员写的更少但实现的更多
  • 优点:
  1. 可以向css的选择器一样获取页面中的元素

    1
    2
    js: var d = document.getElementById("id");    
    jq: $("#id")
  2. 可以批量给元素添加样式

    1
    2
    3
    4
    5
    js:var arr = document.getElementsByTagName("div");
    for(var i=0;i<arr.length;i++){
    arr[i].style.color="red";
    }
    jq: $("div").css("color","red");
  3. 可以解决部分浏览器的兼容性问题

引入jQuery

  • 和引入一个普通的js文件一样

JS对象和JQ对象之间的互相转换

  1. js转jq
    • var jq = $(js);
  2. jq转js
    • var js = jq[0];

选择器

  1. 基础选择器
    • 和css的用法一样
  • 标签名选择器 $(“div”)
  • id选择器 $(“#id”)
  • class选择器 $(“.class”)
  • 分组选择器 $(“div,#id,.class”)
  • 任意元素选择器 $(“ * “)
  1. 层级选择器
    • $(“div span”) 匹配div里面所有的span
    • $(“div>span”) 匹配div里面所有的span子元素
    • $(“div+span”) 匹配div的弟弟元素span
    • $(“div~span”) 匹配div的弟弟们span
  • 层级方法:
    1. $(“#abc”).siblings() 获取id为abc元素的所有兄弟元素
      $(“#abc”).siblings(“div”) 获取id为abc元素的所有div兄弟元素
    2. .prev() 匹配元素的哥哥元素
    3. .prevAll() 匹配元素的哥哥们元素
    4. .next() 匹配元素的弟弟元素
    5. .nextAll() 匹配元素的弟弟们元素
  1. 过滤选择器
    • $(“div:first”) 匹配所有div中的第一个
    • $(“div:last”) 匹配所有div中的最后一个
    • $(“div:even”) 匹配所有div中下标为偶数的元素
    • $(“div:odd”) 匹配所有div中下标为奇数的元素
    • $(“div:lt(n)”) 匹配所有div中下标小于n的元素
    • $(“div:gt(n)”) 匹配所有div中下标大于n的元素
    • $(“div:eq(n)”) 匹配所有div中下标等于n的元素
    • $(“div:not(.abc)”) 匹配所有div中class值不等于abc的元素
  2. 内容选择器
    • $(“div:has(p)”) 匹配所有包含p子元素的div
    • $(“div:empty”) 匹配所有空的div
    • $(“div:parent”) 匹配非空的div
    • $(“div:contains(‘xxx’)”) 匹配包含xxx文本的div
  3. 可见选择器
    • $(“div:hidden”) 匹配所有隐藏的div
    • $(“div:visible”) 匹配所有显示的div
    • 和隐藏显示相关的方法
    1. $(“#abc”).show(); 显示
    2. $(“#abc”).hide(); 隐藏
    3. $(“#abc”).toggle(); 隐藏显示切换
  4. 属性选择器
    • $(“div[id]”) 匹配有id属性的所有div
    • $(“div[id=’xxx’]”) 匹配id值为xxx的所有div
    • $(“div[id!=’xxx’]”) 匹配id值不为xxx的所有div
  5. 子元素选择器
    • $(“div:first-child”) 是第一个子元素并且是div
    • $(“div:last-child”) 是最后一个子元素并且是div
    • $(“div:nth-child(n)”) 是第n个子元素并且是div
  6. 表单选择器
    • $(“:input”) 匹配表单中的每一个控件
    • $(“:password”) 匹配表单中的所有密码框
    • $(“:radio”) 匹配所有单选
    • $(“:checkbox”) 匹配所有的多选
    • $(“:checked”) 匹配所有选中的单选/多选和下拉选
    • $(“input:checked”) 匹配所有选中的单选和多选
    • $(“:selected”) 匹配所有选中的下拉选

创建和添加元素

  1. 创建元素

    1
    2
    js:var d = document.createElement("div");
    jq: var d = $("<div id='xxx'>xxxxx</div>");
  2. 添加元素

    • js: 父元素.appendChild(新元素)
    • jq: 父元素.append(新元素); //添加到最后面
      父元素.prepend(新元素); //添加到最前面
  3. 插入元素
    • js: 父元素.insertBefore(新元素,弟弟);
    • jq: 弟弟.before(新元素);
      哥哥.after(新元素);
  4. 删除元素
    • js: 父元素.removeChild(被删除的元素);
    • jq: 被删除的元素.remove();

获取和修改元素的文本内容

  • 元素对象.text() //获取
  • 元素对象.text(“xxx”) //修改

获取和修改元素的html内容

  • 元素对象.html() //获取
  • 元素对象.html(“ < h1 >xxx< /h1 > “) //修改

获取和修改元素的样式

  • 元素对象.css(“color”); //获取样式的值
  • 元素对象.css(“color”,”red”); //赋值
  • 元素对象.css({“xxx”:”xx”,”xxx”:”xx”}) //批量赋值

获取和修改元素的属性

  • 元素对象.attr(“属性名”); //获取
  • 元素对象.attr(“属性名”,”值”); //赋值

获取元素的子元素们

  • 元素对象.children()

获取元素的父元素

  • 元素对象.parent();

jQuery事件相关

  1. 常见事件
    • 鼠标事件: 点击事件 click 鼠标移入 mouseover 鼠标移出mouseout 鼠标按下mousedown 鼠标抬起mouseup 鼠标移动mousemove
    • 键盘事件: 键盘按下 keydown 键盘抬起 keyup
    • 状态改变事件: 页面加载完成 $(function(){xxxx}) 值改变change 表单提交submit 获取焦点focus 失去焦点blur 窗口尺寸改变resize
  2. 事件模拟
    • 元素.trigger(“事件名称”);
  3. 鼠标移入移出事件合并
    • 元素.hover(function(){鼠标移入时执行},function(){鼠标移出执行});

JS-JavaScript-3

发表于 2019-06-14

JS - 3

事件相关

  • onclick
  • onmouseover
  • onmouseout
  • onload
  • onfocus
  • onblur
  • onsubmit
  • onchange
  • onresize
  • 事件:事件就是一些特定的时间点 ,事件分为鼠标事件 键盘事件 状态改变事件

事件分类

  • 鼠标事件:
    • 点击onclick
    • 鼠标移入onmouseover
    • 鼠标移出onmouseout
    • 鼠标按下onmousedown
    • 鼠标抬起onmouseup
    • 鼠标移动onmousemove
  • 键盘事件:
    • 键盘按下事件onkeydown
    • 键盘抬起事件onkeyup
  • 状态改变事件:
    • 页面加载完成onload
    • 表单提交onsubmit
    • 获取焦点onfocus
    • 失去焦点onblur
    • 窗口尺寸改变onresize
    • 值改变onchange

event事件对象

  • 该对象保存着事件相关的信息
  1. 鼠标事件中保存着鼠标的坐标

    1
    event.clientX/clientY
  2. 键盘事件中保存着按键的编码

    1
    event.keyCode  String.fromCharCode(65)
  3. 在任何事件中都可以获取事件源对象

    1
    var obj = event.target || event.srcElement;

事件的绑定

  1. 在标签内部添加事件属性
    • this代表window对象, 没啥用
  2. 通过js代码给标签对象添加事件(动态绑定)
    • this代表事件源

事件的传递(事件冒泡儿)

  • 如果在某一个范围有多个事件需要响应,响应顺序从底层元素往上级元素传递(类似于气泡从下往上,所以称为事件冒泡儿)

JS-JavaScript-case

发表于 2019-06-13

JS - case

轮播图步骤:

  1. 搭建页面,通过css给图片和div设置相同的宽高
  2. 修改图片的定位为绝对定位,并且在上级div里添加相对定位
  3. 在页面加载完成的时候得到所有的图片数组,遍历数组,让数组里面图片的left值为”i*200“
  4. 创建1秒执行100次的定时器 在定时器里面获取所有图片数组,遍历数组,
    得到当前遍历图片left值 让其-=2 把新的值再次给到图片
  5. 在移动图片时 如果left值<=-200时 让left值=400
  6. 让上级div超出范围不显示
  7. 让定时器通过一个moveTimer记录 ,在判断left值<=-200时让定时器停止
  8. 把移动一张 图片定时器的所有代码封装到一个方法中,再开启另外一个定时器,每隔2秒调用次方法
  9. 给div添加鼠标悬停事件悬停时调用stop方法 方法中停止2秒执行的定时器
  10. div添加鼠标移出事件 调用start方法 方法中再次开启2秒执行的定时器。
  11. 当页面失去焦点时调用 stop方法 当页面获取焦点时调用 start方法
  12. 在start方法中调用stop方法 为了避免重复开启定时器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
<style type="text/css">
div,img{
width: 200px;
height: 150px;
position: relative;
}
img{
position: absolute;
}
div{
overflow: hidden;
}
</style>
<script type="text/javascript">
onload = function(){
var arr = document.getElementsByTagName("img");
for(var i =0; i<arr.length;i++){
arr[i].style.left = i*200+"px";
}
}
var timer = setInterval(change,2000);
function change(){
var moveTimer = setInterval(function(){
var arr = document.getElementsByTagName("img");
for(var i =0; i<arr.length; i++){
var oldLeft = parseInt(arr[i].style.left);
oldLeft -= 2;
if(oldLeft<=-200){
oldLeft = 400;
clearInterval(moveTimer);
}
arr[i].style.left = oldLeft + "px";
}
},10);
}
function stop(){
clearInterval(timer);
}
function start(){
stop();
timer = setInterval(change,2000);
}
onblur = function(){
stop();
}
onfocus = function(){
start();
}
</script>
</head>
<body>
<div onmouseover="stop()" onmouseout="start()">
<img alt="" src="../imgs/1.jpg">
<img alt="" src="../imgs/a.jpg">
<img alt="" src="../imgs/k.jpg">
</div>
</body>
</html>

JS-JavaScript-1

发表于 2019-06-12

JS - 1

  1. JavaScript 给页面添加动态效果和动态内容
  2. 三种引入方式
    • 内联:在标签的事件属性中添加js代码
    • 内部:在页面的任意位置添加script标签
    • 外部:在单独的js文件中写js代码 通过script标签的src属性引入
  3. 数据类型
  • js中只有对象类型
  • 常见的对象类型有:
    1. 数值 number
    2. 字符串 string
    3. 布尔值 boolean
    4. 未定义 undefined
    5. 自定义 object
  1. 变量声明和赋值
  • js属于弱类型语言
    1
    2
    var x = 10;
    x = "abc";
  1. 常见数据类型间的隐式转换
    • 字符串: 转数值能转直接转 不能则转成NaN ,转布尔值 “”转false 其它true
    • 数值:转字符串直接转 转布尔值 0和NaN转false 其它true
    • 布尔值:转字符串直接转 转数值 true->1 false->0
    • undefined: 转数值NaN 转布尔值false
    • null:转数值0 转布尔值false
  2. 运算符
    • 和Java大体相同
    • ==:先统一类型再比较值和===:先比较类型 如果相等再比较值
    • 除法运算会自动转换整数和小数
    • typeof x 获取变量的类型 typeof 66+6 = “number6”;
  3. 语句
    • 和java大体相同
    • if和while括号里面的内容 如果不是布尔值会自动隐式转成布尔值
    • for循环把int i改成var i 不支持新for循环
  4. 方法声明
    • function 方法名(参数列表){方法体}
    • var 方法名 = function(参数列表){方法体}
    • var 方法名 = new Function(“参数1”,”参数2”,”方法体”);
  5. 和页面相关的方法
  • 通过id获取页面标签
    var d = document.getElementById(“id”)
  • 获取和修改标签的文本内容
    d.innerText = “xxx”;
    d.innerText;
  • 获取和修改文本框的文本内容
    input.value=”xxx”;
    input.value
  • 获取和修改标签的html内容
    d.innerHTML +=”asdfa“;
    d.innerHTML;
  1. 字符串相关
  • 创建字符串
    var s1 = “xxx”/‘xxx’;
    var s2 = new String();
  • 转数值
    parseFloat()
    parseInt()
    Number()
  • 获取字符串出现的位置
    indexOf()
    lastIndexOf()
  • 转大小写
    toUpperCase()
    toLowerCase()
  • 替换
    replace(old,new) 只能替换第一个
  • 截取字符串
    substring(start,?end);
  • 拆分字符串
    split() 返回值是数组
  1. 数学相关
  • 随机数 Math.random()
  • 四舍五入 num.toFixed(n); n代表保留几位小数
  1. 数组相关
  • 创建数组
    var arr1 = [“xxx”,23,false];
    var arr2 = new Array();
  • 添加元素
    arr.push(xxx);
  • 数组长度
    arr.length
  • 数组遍历和java一样
  • 数组反转 arr.reverse()
  • 数组排序 arr.sort() 默认是通过Unicode编码依次排序
    自定义排序方法
    function mysort(a,b){
        return a-b;//升序   b-a降序
    }
    
  1. 日期相关
  • 获取当前客户端时间
    var d = new Date();
    var d = new Date(“2019/6/11 17:37:00”);
  • 获取和设置时间戳
    d.getTime();
    d.setTime(1000);
  • 获取时间分量
    d.getFullYear/Month/Date/Day/Hours/Minutes/Seconds();
  • 获取年月日和时分秒
    d.toLocaleDateString();
    d.toLocaleTimeString();
  1. 正则
  • 创建正则对象
    var reg1 = /规则/模式;
    var reg2 = new RegExp(“规则”,?”模式”); \需要转义
  • 相关方法
    1. 查找
      reg.exec(str)
    2. 校验
      reg.test(str)
    3. 字符串查找
      str.match(reg) 返回数组装着所有找到的内容
    4. 替换
      str.replace(reg,new)
  1. 修改元素的class
    元素对象.className=”xxx”;

隐藏页面标签的两种方式

  1. display:none 元素隐藏并脱离文档流, 改回原来的值则显示
  2. visibility:hidden(隐藏)/visible(显示) 隐藏元素不脱离文档流

自定义对象(了解)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
第一种方式:
function Person(name,age){
//给对象添加属性
this.name=name;
this.age=age;
//给对象添加方法
this.run = function(){
alert(this.name+":"+this.age);
}
} */
//实例化对象
//var p = new Person("关羽",42);
//p.run();

function Person(name,age){
//给对象添加属性
this.name=name;
this.age=age;
//给对象添加方法
this.run = function(){
alert(this.name+":"+this.age);
}
} */
//实例化对象
//var p = new Person("关羽",42);
//p.run();
第二种:
var p2 = {
/* 以键值对的形式添加属性和方法 */
"name":"刘备",
"age":43,
"run":function(){
alert(this.name+":"+this.age);
}
}
p2.run();

DHTML

  • 简介: Dynamic(动态)HTML=html+css+js
  • 对象分类:
  1. JavaScript内置对象:包括 string number boolean array
  2. BOM:Browser(浏览器) Object Modle,包含和浏览器相关的各种对象
  3. DOM:Document(文档) Object Model,包含和页面相关的各种对象

BOM

  • window对象, 该对象里面属性和方法称为全局属性和全局方法,访问时可以省略window.
  • window对象中常见的方法:
    1. parseInt/Flaot()
    2. alert() //弹出提示框
    3. confirm() //弹出确认框
    4. prompt() //弹出文本框
    5. isNaN() 判断是否是数
  • window中常见的属性

    1. location 位置
      获得和修改浏览器的访问地址:

      1
      2
      3
      location.href //获取
      location.href="http://tmooc.cn" //修改
      location.reload(); 重新加载(刷新)
    2. history 历史 当前窗口的历史页面
      history.length 页面数量
      history.back() 返回上一页面
      history.forward() 前往下一页面
      history.go(n) n正值则前进 负值后退 0刷新

    3. screen 屏幕
      screen.width/height 获得屏幕的分辨率
      screen.availWidth/availHeight 获取屏幕可用分辨率
    4. navigator 导航/帮助
      navigator.userAgent 获取浏览器的版本信息
  • window中相关的事件
    1. onclick 窗口点击事件
    2. onload 页面加载完成事件 **
    3. onfocus 页面获取焦点事件
    4. onblur 页面失去焦点事件

eval()方法

  • 可以将字符串以js代码的形式执行
    “2+3*5-5”

通过js代码给标签添加css样式

通过标签名获取元素们

1
var arr = document.getElementsByTagName("标签名");

定时器

  • 开启 var timer = setInterval(方法,时间间隔);
  • 停止 clearInterval(timer);

只执行一次的定时器

  • setTimeout(方法,时间间隔);

DOM Document Object Model文档对象模型

  • 和页面相关的内容

查找页面元素的方法

  1. 通过id查找
    • document.getElementById()
  2. 通过标签名查找
    • document.getElementsByTagName()
  3. 通过标签的name属性查找
    • document.getElementsByName()
  4. 通过标签的class属性查找
    • document.getElementsByClassName();
  5. 获取页面的body元素
    • document.body

创建新元素

  • var d = document.createElement(“div”);
    • d.innerText=”abc”;

添加到页面

  • 父元素.appendChild(新元素);
    • document.body.appendChild(d);

插入元素

  • 父元素.insertBefore(新元素,弟弟元素);

删除元素

  • 父元素.removeChild(被删除的元素);

CSS

发表于 2019-06-11

CSS

  • Casecading层叠 Style样式 Sheet表, 用于美化页面

CSS的三大特性

  1. 继承性: 元素可以继承上级元素的部分样式(包括文本相关和字体相关) ,个别标签自带效果不受继承影响,如:h1-h6自带字体大小不受影响,超链接a标签自带字体颜色也不受继承影响.
  2. 层叠性: 不同的选择器有可能作用到相同某一个元素,如果作用的样式不同则全部生效(层叠到一起全部生效),如果作用的样式相同则由优先级来决定
  3. 优先级: 作用范围越小优先级越高 id>class>标签名>继承 , 直接选中优先级高于间接选中(继承属于间接选中)

CSS的引入方式

  1. 内联样式:在标签的内部添加style属性,在属性内部添加css样式代码,弊端:不能复用
  2. 内部样式:在head标签内部添加style标签,通过选择器给元素添加样式,好处可以复用 弊端:只能在当前页面复用
  3. 外部样式:在单独的css文件中通过选择器给元素添加样式,在html页面中通过link标签引入样式文件, 好处:可以多页面复用

三种引入方式的优先级

  1. 内联优先级最高
  2. 内部和外部优先级相同,后执行覆盖先执行

选择器

  1. 标签名选择器
    • 格式: 标签名{样式代码}
    • 选取页面中所有的指定标签
  2. id选择器
    • 格式: #id{样式代码}
    • 当需要选择页面中的某一个元素时使用id选择器
  3. class选择器
    • 格式: .class{样式代码}
    • 当需要选取页面中某一类元素(多个)时使用class选择器
  4. 属性选择器
    • 格式: 标签名[属性名=’属性值’]{样式代码}
    • 通过标签的属性去选择元素
  5. 分组选择器
    • 格式: div,#id,.class{样式代码}
    • 将多个选择器合并成一个选择器
  6. 子孙后代选择器
    • 格式: div span{样式代码}
    • 选取div里面所有的span(包括子元素和所有后代元素)
  7. 子元素选择器
    • 格式: div>span{样式代码}
    • 选取div里面所有的子元素span
  8. 伪类选择器
    • 用于选取元素的状态
    • 未访问状态link/访问过状态visited/点击状态active/悬停状态hover
  9. 任意元素选择器
    • 格式: *{样式代码}
    • 选中页面中所的元素

颜色赋值

  • 三原色:rgb red green blue 红 绿 蓝 每个颜色的取值是0-255
  1. 通过6位16进制赋值 #ff0000
  2. 通过3位16进制赋值 #f00
  3. 通过3位10进制赋值 rgb(0-255,0-255,0-255)
  4. 通过4位10进制赋值 rgba(0-255,0-255,0-255,0-1) a=alpha 透明度 值越小越透明

背景图片

1
2
3
4
5
6
7
8
/* 设置背景图片 */
background-image: url("../imgs/a.jpg");
background-size: 100px 100px;
/* 禁止重复 */
background-repeat: no-repeat;
/* 控制背景图片的位置
left right top bottom center*/
background-position: 10% 10%;

盒子模型

  • 盒子模型由 宽高+外边距+内边距+边框组成

盒子模型之宽高

  • 两种赋值方式:
    1. 像素
    2. 上级元素的百分比
  • 行内元素不能修改宽高 宽高由内容决定

盒子模型之外边距

  • 什么是外边距:元素距上级元素或相邻兄弟元素的距离称为外边距
  • 赋值方式:
    • margin-left/top/bottom/right:20px;
    • margin:10px; 四个方向10px
    • margin:10px 20px; 上下10 左右20
    • margin:0 auto; 水平居中
    • margin:10px 20px 30px 40px; 上右下左 顺时针
  • 行内元素上下外边距无效
  • 左右相邻相加 上下取最大
  • 当元素的上边缘和上级元素的上边缘重叠时会出现粘连问题,在上级元素中添加overflow:hidden 解决

盒子模型之边框

  • 单个方向添加边框:
    • border-left/right/top/bottom: 粗细 样式 颜色;
  • 四个方向添加边框
    • border:粗细 样式 颜色;
  • 行内元素边框不影响元素所占高度
  • 圆角:
    • border-radius: 值越大越圆 超过宽高一半时变成圆形(前提宽高一样)

盒子模型之内边距

  • 什么是内边距: 元素边框距内容的距离
  • 如果需要移动元素的文本内容则必须使用内边距,如果需要移动元素的子元素内容可以使用两种方式
      1. 给子元素添加外边距
      1. 给元素添加内边距(会影响元素的宽高)
  • 行内元素内边距不影响元素所占高度

文本相关样式

  1. 水平对齐方式
    • text-align:left/right/center
  2. 文本修饰
    • text-decoration:overline/underline/line-through/none
  3. 文本阴影
    • text-shadow:颜色 x偏移值 y偏移值 浓度(值越小越清晰)
  4. 行高
    • line-height: 像素
  5. 文本颜色
    • color:red;

字体相关

  1. 字体大小 font-size
  2. 字体加粗 font-weight:bold/normal(去掉加粗效果)
  3. 斜体 font-style:italic
  4. 字体设置 font-family: xxx,xxx,xxx;

溢出设置overflow

  • hidden 隐藏
  • visible 显示
  • scroll 滚动显示

显示方式display

  • block: 块级元素的默认值,独占一行,可以修改宽高
  • inline: 行内元素的默认值,共占一行,但是不能修改宽高
  • inline-block:行内块, 共占一行并且可以修改宽高

行内元素的垂直对齐方式 vertical-align

  • top 上对齐
  • bottom下对其
  • middle 中间对齐
  • baseline 基线对齐

position定位 (定位方式 4+1 )

  1. 静态定位static(默认)
    • 也称为文档流定位,块级元素从上到下,行内元素从左向右
  2. 相对定位relative
    • 元素不脱离文档流,通过top/bottom/left/right让元素从初始位置做偏移
  • 当需要移动某个元素,但不希望其它元素受影响时使用.
  1. 绝对定位absolute
    • 元素脱离文档流,通过top/bottom/left/right让元素相对于窗口做位置偏移(默认)或相对于某个上级元素做位置偏移(在上级元素中添加相对定位)
  • 当需要往页面中添加一个元素,但不希望影响其它元素的位置
  1. 固定定位fixed
    • 元素脱离文档流,通过top/bottom/left/right让元素相对于窗口做位置偏移

浮动定位

  • 元素脱离文档流,元素从当前所在行向左或向右浮动,当撞到上级元素边框或其它浮动元素时停止
  • 通过外边距控制元素的具体位置
  • 一行装不下会自动换行, 有可能被卡住
  • 如果元素的所有子元素全部浮动,则自动识别的高度为0,通过给元素添加overflow:hidden可以解决
  • 如果元素浮动,则会脱离文档流 后面的元素会顶上去,如果不希望顶上去则给后面的元素添加clear:both
  • 当需要把纵向排列的元素改成横向排列时使用浮动定位

HTML

发表于 2019-06-10

HTML

  1. 内容标题标签 h1-h6 独占一行 有上下外边距 字体加粗 align=left/right/center
  2. 段落标签 p 独占一行 有上下外边距
  3. 水平分割线 hr
  4. 换行 br
  5. 列表标签
    • 无序列表 ul : type li
    • 有序列表 ol : type start reversed li
    • 定义列表 dl dt dd
    • 列表嵌套 有序和无序可以任意无限嵌套
  6. 分区元素
    • div:独占一行 和 span:共占一行
    • html5 新增 header article footer
  7. 元素分类
    • 块级元素: 独占一行 包括:div h1-h6 hr p
    • 行内元素: 共占一行 包括:span strong和b em和i del和s u
  8. 实体引用
    • 空格  
    • 小于号 <
    • 大于号 >
  9. 图片标签
    • img: src路径 相对 访问站内资源和绝对 访问站外资源 alt title width、height:1.像素 2.百分比
  10. 图片地图
    • map:name
    • 子元素 area:shape形状 coords坐标 href:资源路径
  11. 超链接a
    • 如果不写href属性则就是纯文本
    • 文本超链接和图片超链接
    • target=”_blank” 从新的窗口显示页面
    • 页面内部跳转 如果目的地有标签直接给标签添加id 如果没标签添加猫(空的a标签)
  12. 表格table
    • 子标签:tr td th caption thead tbody tfoot
    • 属性: table:border cellspacing cellpadding td:rowspan colspan
  13. 表单form
    • 文本框 type=text name value readonly placeholder maxlength
    • 密码框 type=password name value readonly placeholder maxlength
    • 单选 type=radio name value id checked lable标签
    • 多选 type=checkbox name value id checked lable标签
    • 日期 type=date name
    • 文件 type=file name
    • 隐藏域 type=hidden name value
    • 下拉选 select:name
    • 子标签 option:value selected
    • 文本域 textarea:name rows cols placeholder
    • 提交按钮 type=submit value
    • 重置按钮 type=reset value
    • 自定义按钮 type=button value

Java-question

发表于 2019-06-03

题库

1. equals与==的区别?

  • “==“ :是值比较
    equals是Objcet定义的方法。默认实现的就是”==“比较的。
    java中所有类都有equals,若不重写就是用“==”比较的,需要重写equals方法才能实现比较内容。
    equals是比较两个对象的内容,但是需要重写equals方法。
  • “==”用于比较两个变量值是否相等, 当比较引用变量时候,就比较引用中保存的地址值是否相等, 地址相等得到true, 否则false.
    Java在Object定义了equals方法, 用于比较两个对象是否相等, 但是其默认实现就是利用 == 比较了两个对象的引用是否一样。默认规则不好, 建议使用者合理重写equals方法。

2. int 和Integer:

  • int:是java默认的整数类型、是基本类型、占4个字节。
  • Integer:是int类型所对应的包装类,它的出现因为基本类型不能参加面向对象的开发问题,
    所以基本类型以一个对象的形式表现出来,这样就具有的面向对象的相关特点:封装继承、多态,这样就可与参加面向对象开发。
    提供了一个静态静态方法parseInt()可以把帮助把字符串节解析成基本类型,还提供了二个常量MAXVALUE 、MINVALUE分别表示了基本类型的取值范围最大值和最小值。

3. 线程的运行方式/线程是干什么的:(改变代码的执行方式)

  • 线程:是帮我们改变了代码的执行方式,原来代码是串型操作(从上到下,一行一行执行)多线程帮我们把代码可以并发运行,多个代码感官上可以同时执行。
  • 并发:多个线程之间的运行,实际上是线程调度器在分配CPU时间片,让线程之间走走停停 、来回来去执行、基本上的感觉是齐头并进的感官上是同时运行,但是在微观上切换运行的,这种工作方式是并发。
  • 线程的几中创建方式:

    1. 直接继承Thread重run方法
    2. 单独定义线程任务实现Runnable接口
  • 这2种创建线程方式的优缺点:

    • 直接继承线程:
      优点:使用匿名内部类创建比较简便。
      缺点是:

      1. 由于继承了线程,java是单继承的,若继承了线程就没有办法继承其它的类重写方法,在实际开发中非常不便,必须在二者中选其一,就产生了继承冲突问题。
      2. 直接继承线程重写run方法,那就相当与在实现线程的同时就直接把任务定义在其中,就会出现线程与任务之间有必然的耦合关系。这个线程只会做这一件事情,其他的事情不会做了,这样就会大大降低线程的储用性,为此有第二种创建线程的方式。
    • 单独去定义线程任务:
      优点:

      1. 首先实现Runnable接口,实现接口不妨碍我们去实现其他的接口不存在继承冲突问题。
      2. 把线程与任务分开了,线程是线程任务是任务,没有必然的耦合关系,将来线程是可以重用的,(利用这种方式我们才有了线程池的应用,线程池直接给任务进去的)

4. 线程并发安全问题/多线程的并发安全问题:

  • 首先多线程并发安全问题产生的原因在于多个线程在并发操作同一临界资源由于线程切换时机不确定,导致代码的执行顺序未按照程序设计方式去执行,出现对临界资源访问时出现了混乱,导致后面出现了不可预知后果,严重的时候肯能出现系统瘫痪。
  • 如何解决并发安全问题:把并发操作同一临界资源的事情变成同步执行,先后顺序的排队干,使用synchronized关键字,就是我们所谓的同步锁。同步锁有两种使用方式:
  1. 第一种是直接在方法上加synchronized,这个时候此方法称为同步方法,同个线程是不能同时执行这个方法的,就不会出现并发安全问题。
  2. 另一种是同步块,最大好处是让我们更加准确的去控制需要同步运行的代码片段,如果我们有效的缩小同步范围,是可以在我们并发安全的前提下,提高我们的并发效率。使用同步块的原则是,多个线程在调用同步块的时候,看到的同步监视器对象必须 是同一个,否则没有同步效果。

实际开发中哪个比较好?

  • 没有绝对的好,视情况而定,如果发现整个方法里面的代码都需要排队执行的时候,最方便的就是在方法上加synchronized,如果方法中只有一小部分需要排队执行的时候,那我们就锁定这一段代码,使用同步块。

5. 互斥锁是什么:

  • 互斥锁仍然是利用synchronized实现,当synchronized锁了两段或者多段不同的代码,而这些synchronized的同步块只对应了同步监听器对象是相同的时候,这几段代码之间就是互斥的。意味着多个线程是不能在同时在这些互斥块中执行代码的。Synchronized锁定了多个代码片段,这些synchronized指定的同步监视器对象是同一个,这些代码之间就是互斥的。

6. 死锁是什么:

  • 各自拿着各自的锁,又等着对方先释放锁,就产生了死锁。在实际开发中,我们应当尽可能的去选择同步监视器对象,避免出现死锁问题。

7. 什么是集合?

  • 集合在java中我们有集合框架,集合框架提供了一个接口java.Util.collection,collection下的所有子类型都是集合。集合框架还有map。
  • Collection和Collections的区别:
    • Collection是所有集合的顶级接口,里面规定了集合所定义的相关的方法。比如添加、删减元素等。
    • Collections是集合的工具类,里面提供了很多的静态的方法可以帮助我们便捷的去操作集合,比如排序sort。Collections还有一些方法,synchronized list,synchronizedset,synchronizedmap可以帮助我们将现有的list、set、map集合转换成线程安全的。
  • Collection下常用的集合有哪些?
    List、set。
    区别:list集合是可重复集,set不可重复。List集合一定有序,set大部分是无序的。

  • List集合常用的实现类:

    • ArrayList和linkedList区别:
      使用上方法功能都一样,实现的数据结构是不同的。ArrayList是数组实现的。LinkedList是链表实现的。因为实现的数据结构不同,导致他们的特性不相同,数组的特点是查的快,但是增删差。
      LinkedList是链表,增删效率好,而且是收尾增删效率好。查询速度偏慢。以后工作中,增删用的多的就使用LinkedList,查询多的就使用ArrayList。
  • Map是什么:

    • 查找表,他由key,Value对组成的结构,常用的实现类是hashMap。还知道TreeMap,使用二叉树实现的map。HashMap特点,是世界上查询速度最快的数据结构。
      hashMap原理,用散列算法实现的。
  • hashTable与hashMap的区别:

    • hashTable在jdk4的时候被重构了一次,他也继承了map,在使用上与hashMap没区别。区别在于,hashTabe是并发安全的map,hashMap不是。在多线程的情况下,使用hashTable。HashMap的put,remove,get都没有加synchronized,所以在多线程下不应当用hashMap。hashTable的key和value 不允许存null值,hashMap可以。

8. Map的遍历方式:

  • 三种:单独遍历key,遍历每一组键值对的entry,遍历value,
    方法分别为:keyset entryset,values()
    集合的遍历方式:迭代器iterator()
  • 新循环:jdk5出的一个新特性
    新循环遍历数组、集合:新循环是编译器认可的,并不是java虚拟机,编译器在编译代码的时候,如果发现我们使用新循环遍历数组,那么编译器会把代码改成使用传统for循环来遍历数组。那么如果编译器发现你在使用新循环遍历集合,她会改用迭代器遍历。遍历集合有一个注意事项。就是在遍历的过程中是不可以通过集合自身的方法增删元素的。
    如果想删除元素也可以,迭代器自身也提供了一个remove方法,允许我们在遍历过程中删掉元素。

9. 字符串的特性/点:

  • 字符串是不变对象,字符串对象一但创建,值是不可以改变的,要想改变就一定会创建新的对象。
  • 字符串常量池:在现在的jdk版本中存在堆当中,java虚拟机会缓存我们每一个使用字面量形式创建的字符串对象,
    当将来我们再次使用字面量形式创建同样字符串内容的时候,会重用常量池中的对象以减轻内存开销。

10. String str =new String(”hello”);总共创建几个对象:

  • 创建过2个对象:首先有一个字面量虚拟机会创建一个字符串对象,并且把它缓存在常量池当中,再newString的时候只是引用了它而已,有自己new的对象和之前用字面量形式创建的对象。
  • 编译器的特点:编译器在编译代码的时候若是看到计算表达式参与的所有的值都是字面量的时候,那编译器在编译期间就会把结果算好,减少java虚拟机每次运行的时候再重新计算的问题。变相的提高性能。
  • StringBuilder:出现是为了解决字符串频繁修改带来的性能问题,因为字符串是不变对象每次修改都要创建新对象,如果频繁修改内存中产生大量的垃圾对象出来,字符串的频繁拼接性能不高,因此java设计了一个类StringBuilder,它的内部维护着一个可变的字符数组,所有的修改操作都是在同一个字符数组中做操作的,扩容缩容都是用同一个,因此内存开销比较小,因此修改效率比较高,而且是专门为了编辑字符串产生的API,提供了很多便于我们修改字符串的方法,如append、insert、remove、reverse。
  • StringBuilder和StringBuffer是什么关系:
    • StringBuffer跟字符串一样是在jdk1.0的时候就推出的API,StringBuilder是在JDK5的时候推出的API,最大的区别:
      • StringBuilder不是线程安全的,StringBuffer是线程安全的,由于在实际开发当中我们很少在多线程操作同一个字符串,因此我们使用StringBuilder可以更好的提高运算性能,但是在多线程情况下操作同一个字符串相当于并发操作同一个字符串时候,还是应当考虑使用StringBuffer。

WebServer项目:

1. webserver是什么:

  • 是当时模拟Tomcat做的一个轻量级的web容器,底下基于TCP与HTTP协议,完成了浏览器与服务器之间的交互工作。

2. TCP与HTTP的关系:

  • HTTP是应用层协议,TCP是底下的传输层协议,HTTP协议要求必须建立在可靠传输协议基础之上进行,通常HTTP底下使用的传输协议就是TCP协议。
  • HTTP协议是:由w3c(万维网)定义的一个协议,全称是超文本传输协议,它是现在常用的浏览器与服务器之间建立的应用层协议。
  • HTTP协议的部分:请求与响应,HTTP采取的模式要求客户端与服务器采取一问一答的模式,永远不允许服务端主动与客户端建立链接,并且发起响应,必须是由客户端建立TCP链接发送HTTP请求服务端处理以后予以响应。
  • HTTP里面请求的格式和响应的格式:
    • HTTP的请求是客户端发给服务端的东西,一个请求包含三部分分别是请求行、消息头和消息正文,请求行又由三部分构成:分别是请求的方式、请求的资源路径以及所使用的协议版本。还有消息头:客户端传递给服务端一些附加的内容,它可以指明客户端所使用浏览器的内核是什么、以及维持链接所使用的一些东西。格式是由名字: 值以CRLF结尾一行一行的构建,最后一个消息头发送完毕会单独发送一个CRLF,表示消息头部分发完。消息正文:是纯二进制数据,是客户端提交给服务器端用户实际上传的内容,可以是表单上传的数据,也可以是用户提交的一些附件的内容。

3. 请求常用的请求方式:get请求和post请求

  • get请求:地址栏请求,以form表单为例,get请求就是把用户输入的信息拼接到url中并以?隔开,后面的内容就是拼接的内容以地址栏的形式传递给服务端。
  • post请求:把提交上来的数据全部被包含在请求的消息正文中,提交上来的。当表单含有用户隐私信息或者有上传附件操作时,必须使用post请求。
  • 响应也是有三部分组成分别是:状态行、响应头、响应正文。
  • 状态行也是由三部分构成:分别是协议版本、状态代码和状态描述。响应头跟请求的消息头格式一样、正文也是一样的。
  • 状态代码:由3位数字构成分为5类分别是100类、200类、300类、400类、500类、
    • 100类是保留部分。
    • 200类表示服务端正确处理了客户端请求。
    • 300类一般指的是重定向类
    • 400类指的是客户端请求有问题,请求错误,客户端错误。
    • 500类服务端错误,常见的状态代码:200一切正常客户端请求正确处理并且予以响应,404就是客户端请求路径无效服务端无法正确处理的,更详细的可以翻阅HTTP协议文档。

4. webserver项目负责哪一块:

  • 这个项目做的是轻量级的webserver,架构没有tomcat那么复杂,从头到尾都是自己写的,从建立TCP链接,到利用线程处理请求,在请求当中去如何解析HTTP协议,如何处理完请求,如何发送HTTP响应,整个流程都做过,还模拟了servlet去处理业务。
  • 完整阐述项目 例如:完成项目中遇到的问题
    • 遇到了空请求,然后我查阅了HTTP协议文档,发现HTTP协议允许客户端发送空请求过来,所以以后解析请求发现空请求,这次请求忽略处理。

5. 常见的头:

  • Content-Type 、Content-Length 分在请求的消息头中还是在响应的消息头中,响应头中让服务器告知浏览器此次发送的响应是包含响应正文的,通过Content-Length告知浏览器此响应正文中总共多少个字节,再通过Content-Type告知浏览器这些字节表示的是什么类型的数据。
  • 常见的Content-Type 的值:text/html 告诉浏览器发送的正文是html页面,img/png告诉这是一张图片。
  • text/css样式文件 脚本 有1000多种,可以到tomcat安装目录下的conf包中web.xml中有所定义,并且我曾经拿xml的解析把整个的1000多种全部解析出来用到自己的项目当中,并且可以根据用户实际请求的资源可以自动分析并且能够给用户响应正确的头,这个当时也有做到在response中已经实现了。

6. RandomAccessFile是做什么的:

  • 简单说是读写文件的API、基于指针的随机读写形式。
  • RandomAccessFile和文件流的区别:最大的区别在于读写方式不同、RandomAccessFile是专门设计出来用来读取文件的API是基于指针的随机读写,可以对文件的任意位置或读或写。
  • 文件流是基于java标准io的读写方式是处于顺序读写模式只能往后顺序的读或写,是不能回退的。灵活性上文件流不如RandomAccessFile。

7. 文件流的优势:

  • 文件流基于java标准io操作,我们可以利用流连接来连接上各种功能强劲的高级流,把一个复杂工作简单化。

8. 流连接:

  • 就是串联若干的高级流最终连上低级流对某一个设备,进行复杂的读写操作,利用流水线似的工作,每一个高级流处理一个环节,最终把事情干完。因为io最大的特点就是流连接 把复杂问题简单化。
  • 流连接做过什么:
    • 利用过缓冲流连接文件流对文件进行块读写操作来提高文件的读写效率。连接过对象流对java对象进行过序列化与反序列化操作。在websever读取客户端的请求用socket得到的流也是基于io进行读写数据交互,读写文件连上字符流

9. 节点流和处理流:

  • 节点流也称为低级流,特点是数据源明确,通过低级流是做真实的数据读写操作的,可以把数据写到目标去也可以从目标读数据回来。
  • 处理流又叫高级流:他们不能独立存在必须连接在其他流上,目的就是当数据经过我的时候,我可以对你进行某些加工处理工作,我的这个流连接当中就是利用串联很多高级流,来最终串联低级流,来完成复杂读写的。
1…345…7

Alone5

70 日志
1 标签
© 2020 Alone5
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4