1. 程式人生 > 實用技巧 >資料庫(二)自動增長列,新增表資料,修改資料,刪除資料,where條件,%萬用字元,is,查詢資料(查詢全表,指定列查詢,排序查詢),聚合查詢(平均、最大、最小、行數、求和)

資料庫(二)自動增長列,新增表資料,修改資料,刪除資料,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 '[email protected]', -- 預設約束 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','[email protected]','jerry的個人資訊');

  防止主鍵失效的方法:在對應位置上寫入null

-- 防止主鍵失效的方法:在對應位置上寫入null
insert into users values (null'zake','1993-5-6','[email protected]','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;