資料庫(二)自動增長列,新增表資料,修改資料,刪除資料,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;