数据库(二)自动增长列,添加表数据,修改数据,删除数据,where条件,%通配符,is,查询数据(查询全表,指定列查询,排序查询),聚合查询(平均、最大、最小、行数、求和)

通过选中表进行导入、到处操作进行数据表备份

自动增长列:数据表的主键应具备唯一性,每次写入不同主键值会比较麻烦,使用自动增长列替换主键值是常用的方式

CREATE TABLE `user`(
userId PRIMARY KEY AUTO_INCREMENT
)

自动增长列默认从1开始,修改起始值使用以下方式
ALTER TABLE 表名 AUTO_INCREMENT=起始值

 

创建一张表:

create table users
(
    userid int auto_increment,
    userName varchar(20) not null, -- 非空约束
    birthday datetime,
    email varchar(50) default 'xxx@geekhome.com', -- 默认约束
    detail text,
    constraint pk_userid primary key(userid)
);

 

增加数据的方法:数据表中写入的数据以行为单位

增加数据的语法(一):根据指定列写入值
  insert   into  表名(列名)   values(值)

    只有varchar 、文本 加单引号,其余的值都直接写

    写入的列名和后面要写入的信息要对应

    非空约束的信息必须要写入

    如果主键是自动增长列,此时主键是可以不写的,但是如果不是自动增长的,则必须要写因为非空

  注意要点:

    1.写入的值的数量必须和列的数量匹配
    2.写入的值和列的数据类型必须匹配
    3.非空约束的列必须写在指定列中
    4.主键必须写在指定列中
    5.写入的值必须满足该列的check约束

insert into users(username,brithday,detail) values('tom',now(),'tom的个人信息') ;

--如果指定的日期则按照字符串写入,系统会自动转换成时间格式
insert into users(username,brithday,detail) values('jack','1992-4-5','jack的个人信息');

--写入是列名和数据顺序要对应
insert into users(username) values('white');

 

增加数据的语法(二):根据指定列写入值

  INSERT   INTO  表名  VALUES(值)

  注意:因为没有列明,所以一定要将所有的数据写全,(添加主键和默认值将会失效),因为系统会按顺序写入,不会识别写入

  1.表中所有列都必须写入
  2.表中如果存在默认值则使用 default 替入
  3.如果某列不需要写入数据则使用 null 替入

insert into users values(100,'jerry','1994-11-12','jerry@sina.com','jerry的个人信息');

  防止主键失效的方法:在对应位置上写入null

-- 防止主键失效的方法:在对应位置上写入null
insert into users values (null'zake','1993-5-6','zack@sina.com','zack的个人信息')

  防止默认值失效的方法:在有设置默认值的地方写入default,就会显示默认值

insert into users(null,'marry','1992-12-10',default,'marry 的个人信息')

 

建表时添加数据:(只是将数据写入,非空会写入,主键和其他约束都没有)

  create  table  表名2  as  select  *  from  表名1      -- 将表1内容新增到创建的表2中

-- 将users的数据添加到新创建的backup_user表中
create  table  backup_user as select * from users

 

修改数据语法:

  主键能用update修改但是尽量不改
  主键被其他表引用是,如果其中内容被引用了则不能修改,如果没有被引用的是可以修改的

  update  表名  se t 列  =  值  [where 条件]   -- where条件可写可不写,不写where条件则表示删除这一列的搜友数据

alter table users add age int-- 新增一列
alter table users add sex varchar(10);-- 新增一列
修改数据:
-- 不写where是代表整个表的这一列全部数据都更改为统一数据
update users set age =20;

 同时修改多个列的内容:

-- 同时对多个列的数据进行修改
update users set age=22,sex='';

where条件的使用:
  where语句后应为一个表达式,且表达式返回是或否的结果
  where后的表达式可以为一个或多个使用逻辑运算符and和or关联

  关系运算符:> , < , >= , <= , = , != , between and  , in ,  like , is,is not

指定修改某一行的某一列数据
update users set sex =''  where userid=103--将用户的编号为1-3(三种表述方式)的用户年龄更改为25
update user set age=25 where betweem 1 and 3;

update user set age=26 where userid>=1 and userid<=3;

-- int可以添加不连续的数据
update user set age=27 where userid int(1,2,3);

 

%通配符:通过一个数据中包含的部分数据信息查找整条数据

-- 将姓名以t开头的用户,将他的邮箱清空
-- %通配符,表示匹配任意长度的任意字符
update users set email =null where username like 't%';

-- 将姓名中包含ac的用户,将他们的升入设为1995-10-1
update users set birthday ='1995-10-1' where username like '%ac%'-- 将所有QQ邮箱的用户将他的年龄增加5岁
update users set age=age+5 where email like '%qq.com%';

 

is :判断是否非空

--将所有没有填写过资料的用户将其用户信息变更为'待注销用户'

用等号代表填入的内容是否是null
update users set detail ='待注销用户' where detail=null;

用is代表是否有填入数据
update users set detail ='待注销用户' where detail is null;

-- 将所有填写过邮箱并且性别为男的用户,变更其年龄为20
update users set age =20  where email is not  null and sex='';

 

删除数据:

  delete  from  表名 [where  条件]

  例子:删除backup_user表中的所有数据

    delete和truncate两者的区别:

      * truncate table与delete的区别在于delete是逐行执行,每次执行将执行事务,并将数据操作记录日志

      * truncate table是整个数据块删除为写入日志无法恢复数据,且自动增长列重置

    方法一: delete将表中的数据逐行删除,不添加条件就是删除整个表中的所以数据,

        delete每次执行将执行事务,并将数据操作记录日志,可以恢复

delete from backup_user;

    方法二:truncate不是逐行删除,是将整个数据块全部删除,且不能写where条件

        是整表数据删除为写入日志,无法恢复数据,且自动增长列也会重置

truncate table backup_user;

 

删除其中一行数据:写where条件

-- 删除编号是3的整行数据
delete fron backup_user where uesrid=3;

 

查询数据:

  1.查询全表       select * from 表名

  2.指定列名查询       select  列  as  显示列名  from  表名

  查询语法注意事项:

    1.* 表示表中所有的列,也可以单独查看指定的列,用列名将*替换掉;

    2. 查询所有的列比较影响性能,会将所有数据库中的每一行进行每一列的删选,所以要尽量根据业务需要的数据列进行查询

一、查询全表

-- 查询姓、名、工资和工作id
select first_name,last_name,salary,job_id from emp;
-- 查员工编号为100的 姓、名、工资和工作id
select first_name,last_name,salary,job_id from emp where employee_id=100;
-- 查询部门编号为50的所有员工的姓名和薪水
select first_name,last_name,salary from emp where department_id=50;

对日期进行判断条件:

-- 查询薪资超过8000并且入职时间早于2015年的员工姓名、邮箱、入职时间、所在部门的编号
select first_name,last_name,hire_date,salary,department_id from emp where salary>8000 and hire_date<'2015-1-1';

 

二、指定列名查询:

  select  列  as  显示列名  from  表名

  例子:查询员工的姓,增加500后的薪水

    方法一:这样查询只能查看增加后的结果,但是不能持久保存,且列名是  ‘salary+500’

select  first_name ,salary+500  from  emp;

    方法二:对数据列起别名(as 新列名),这样就对数据进行了保存,可以通过别名对数据进行查询

select  first_name ,salary+500  as  salary  from  emp;

  对表取别名,便于在已经查询的数据中进行二次查询

select  e.employee_id  ,e.salary  ,e.manager_id   from  emp  as  e;

  将两列数据合并到一起concat查询:

select  concat(first_name,last_name)  as   empname  from  emp;

 

排序查询:

  select  列名  from  表名  where  条件  order  by  列

    升序排序    asc(默认值)

    降序排列    desc

--根据工资由高到低查看部门编号为50的员工姓名和薪资
select  concat(first_name,last_name)  as  empname, salary from emp  where   department_id=50  order   by   salary   desc;

  新建一张表数据,进行排序测试:

create table test
(
    A varchar(10),
    B varchar(10) 
)
insert into test values(50,22);
insert into test values(50,42);
insert into test values(50,32);
insert into test values(60,45);
insert into test values(50,78);
insert into test values(60,19);
insert into test values(50,20);
insert into test values(50,34);
insert into test values(60,43);
insert into test values(80,89);
insert into test values(50,26);
insert into test values(70,36);
insert into test values(70,93);
insert into test values(50,73);
insert into test values(70,63);
insert into test values(80,54);
insert into test values(50,82);

  进行数据排序测试:

-- 对test表中的ab字段进行排序,对a和b都进行降序排序

-- 将a列进行降序排列
select *from test order by a desc;

-- 先对a进行升序排列,如果a有重复的数据,在重复的过程中对b进行升序排列
-- 当对多列进行排序时,将排序前一个列的值,如果前一个列的值有出现重复的情况,才会对第二个列继续排序
select *from test order by a,b; -- 此时a升序,b降序,因为desc值作用于b列 select *from test order by a,b desc; -- 对a和b列进行降序,如果a重复再对b列进行降序 select *from test order by a desc,b desc;

 

高级查询

  聚合函数:

    sum:求和

    avg :平均值

    max:最大值

    min:最小值

    count:行数

-- 查询部门编号为40的员工薪资的总和
-- sum的结果只有一个值,如果出现非聚合列,则只会出现第一个,不允许这么写
select  sum(salary)  from  emp  where  department_id = 50 ;

-- 查询所有员工的平均工资
select avg(salary) from emp;

-- 查询所以员工的工资汇总和平均工资
select sum(salary) as sum_salary,avg(salary)  as avg_salary from emp;

-- 查询最早入职员工的入职时间
select  min(heir_date) from emp;

-- 查询部门编号为50的最高的薪资
select  max(salary) from emp where department_id=50;

-- 查询员工表中有多少员工信息 -- 只要这个行中只有一个列中有数据,写*也会统计进去 select count (*) from emp; -- 107 select count (first_name) from emp; -- 107 -- 其中一个数据的数值为null select count (manager_id) from emp; -- 106

 

课上练习:(在数据修改前将表格进行备份)

  修改编号为100的员工的薪资,增加500块
  修改姓名中包含s(不区分大小写)的员工,将其部门调整到编号为50的部门中
  调整老板的薪资增加5000
  将所有薪资低于6000的员工薪资上浮500

-- 创建备份数据
create table location as select * from locations;
create table emp as select * from employees;
create table dep as select * from departments;

-- 修改编号为100的员工的薪资,增加500块
update emp set salary=salary+500 where employee_id=100;

-- 修改姓名中包含s(不区分大小写)的员工,将其部门调整到编号为50的部门中
update emp set department_id=50 where concat(forst_name,last_name) like '%s%' or concat(forst_name,last_name) like '%S%';

-- 调整老板的薪资增加5000
update emp set salary=salary+5000 where manager_id is null;

-- 将所有薪资低于6000的员工薪资上浮500
update emp set salary=salary+500 where salary<6000;

-- 查看数据表信息
select * from location;
select * from emp;
select * from dep;
posted @ 2020-08-09 10:32  小小野生程序员sunny  阅读(402)  评论(0编辑  收藏  举报