mysql——2-18數據庫

mysql數據庫中 :
database : 文件夾
table : 數據表(數據文件)

進入mysql
mysql -u 用戶名 -p 輸入密碼

顯示系統(tǒng)的database(文件夾)
查看存在的數據庫
show databases;

創(chuàng)建database
create database 名稱;

選擇database
use database名稱;
在當前database可以隨時選擇其他的database 只需要直接use 名稱即可

顯示數據文件
show tables;
顯示數據文件必須要在選擇database之后才可以進行

刪除database
drop database 名稱;

查看表的詳細數據
desc 表名;

創(chuàng)建table
create table 表名(列名 類型,列名1 類型1,...列名N 類型N);

刪除表
drop table 名稱;

插入數據
1.insert (into )表名 values(列值,列值1,...列值N);
該種插入方式必須與表中的列順序一致

2.insert (into) 表名(列名,列名1,...列名N) values(列值,列值1,...列值N);
制定某些列之后插入相對應的值,可以不按照表中列順序插入,
并可以只插入一部分數據

查詢數據
select 列名,列名1,...列名N from 表名;
最簡單的查詢方式 :select * from 表名;

  • 一種通配符,用來代表所有列 一般情況下,工作中不使用
    因為需要多一次遍歷查詢表內列名

刪除數據
條件刪除 delete from 表名 where 列名 = 列值;

刪除全部數據 delete from 表名;

更改數據
條件更改 update 表名 set 列名 = 列值 where 列名1 = 列值1;

更改全部數據 update 表名 set 列名 = 列值;

別名機制
在數據庫中 一個列名之后直接添加一個未定義的單詞,相當于對該列進行別名操作
例:select ename name from emp; name既是ename的別名 中間略寫了關鍵字as
數據表也可以起別名,sql語句的執(zhí)行順序為
from起向右執(zhí)行,執(zhí)行完畢后再從select開始向右執(zhí)行

條件查詢
查詢工資大于5000的員工的編號、姓名和工資
select empno,ename,salary from emp where salary > 5000;

查詢工資大于5000且小于10000的員工的編號、姓名和工資
select empno,ename,salary from emp where salary > 5000 and salary < 10000;

查詢工資小于5000或大于10000的員工的編號、姓名和工資
select empno,ename,salary from emp where salary < 5000 or salary > 10000;

查詢工資在5000到10000之間的員工的編號、姓名和工資
select empno,ename,salary from emp
where salary between 5000 and 10000;

比較運算符 > < = <>(!=) >= <=
在mysql中支持!=運算符 但是,部分數據庫不支持!=運算符,
一般情況下,<>運算符是數據庫的通用"不等于"運算符

邏輯運算符 and(&&) or(||)
在mysql中支持&&和||運算符,但是通用的邏輯運算使用and和or

在做區(qū)間判斷時where 列名 between (列值begin) and (列值end)
between and是一個全閉區(qū)間,左右值均包含

條件刪除、條件更新、條件查詢都可以使用數據庫中的通用比較運算符

查詢員工的月工資
select empno,ename,salary+ifnull(bonus,0) sal_month from emp;
列之間相加,就是列之間的值一一相加

查詢員工的姓名,編號,月工資,一年的基本工資,一年總獎金,一年的總工資
select empno,ename,
salary+ifnull(bonus,0) sal_month,
salary12 sal_base_year,
bonus
12 bonus_year,
(salary+ifnull(bonus,0)) *12 sal_year from emp;
列還可以直接與一個常量做運算,并且運算結果依然可以做二次運算

查詢員工編號為1001,1003,1005的員工編號,姓名
select empno,ename from emp where empno in(1001,1003,1005);
in 查詢一個集合 但效率比較低 一般情況下不使用 一般情況下用exists替換

查詢出名字叫Lacus的員工的編號、姓名、工資
select empno,ename,salary from emp where ename = 'Lacus';
在mysql中查詢字符串信息時不區(qū)分大小寫,但在其他數據庫中區(qū)分
需要使用upper和lower做相應的轉換

通用函數
ifnull(列名,value) 如果該列的某一個值為NULL,則修改為value
在部分數據庫中該函數叫nvl

upper(列名) 將該列的值轉換為大寫(對字符串列操作)
lower(列名) 將該列的值轉換為小寫(對字符串列操作)

求出公司里的人數
select count(empno) emp_count from emp;
使用一個不會是空的列進行查詢,一般情況下使用編號列

求出公司員工所有人的總工資
select sum(salary + ifnull(bonus,0)) sum_sal from emp;

求出公司員工的平均工資
select avg(salary+ifnull(bonus,0)) avg_sal from emp;

求出公司員工的編號、姓名、工資并按照工資從小到大的順序排序
select empno,ename,salary from emp order by salary asc;

asc : 正序 默認排序方式 可省略
desc : 逆序 當逆序排序時 在最后添加
當條件查詢語句需要排序時,要在語句最后添加排序

組函數
count(列名) 根據該列的值,返回相應的數量
sum(列名) 根據該列的值,返回該列值的總和
avg(列名) 根據該列的值,返回該列的平均數
max(列名) 根據該列的值,返回該列的最大值
min(列名) 根據該列的值,返回該列的最小值

查詢出公司每個部門的部門編號、該部門的人數、該部門的工資總和
select deptno,count(empno),sum(salary) from emp group by deptno;

平均工資大于5000元的部門編號和平均工資,沒有部門的不算
select avg(salary) avg_sal,deptno from emp
group by deptno having avg_sal > 5000;
當分組之后不可以使用where條件查詢只可以使用having

哪些職位的人數超過1個人?
select job,count(empno) from emp group by job
having count_emp > 1;

查詢調用組函數時,如果語句中帶有普通列查詢,則必須做分組處理
group by 列名
分組處理的列一般情況下,就是所查詢的普通列,并且該列的值是有重復的

查詢出沒有獎金的員工編號和姓名
select empno,ename from emp where bonus is NULL;

NULL的特性
1.任何與NULL做運算的結果 都是NULL
2.被組函數忽略
3.在mysql中NULL默認最小,在oracle中NULL默認最大
4.在數據庫中判斷是否為NULL不可以用比較運算符判斷
判斷是NULL is NULL 不是NULL is not NULL

子查詢
查詢出工資比Lacus高的員工的編號、姓名、工資
select empno,ename,salary from emp where salary >
(select salary from emp where ename = 'Lacus');

查詢出工資比Lacus低的員工的編號、姓名、工資,按照工資的從小到大的順序排序
select empno,ename,salary from emp where salary <
(select salary from emp where ename = 'Lacus') order by salary;

查詢出比部門20人數多的部門編號和部門人數
select deptno,count(empno) count_emp from emp group by deptno
having count_emp > (select count(empno) from emp where deptno = 20);

當子查詢返回多列時
all 所有的 any 任意一個
誰比所有的Lacus工資高
select empno,ename,salary from emp where salary >
all(select salary from emp where ename = 'Lacus');

誰比任意一個Lacus工資高
select empno,ename,salary from emp where salary >
any(select salary from emp where ename = 'Lacus');

關聯(lián)子查詢
哪些員工的薪水比本部門的平均薪水低?
select empno,ename,salary from emp e1 where salary <
(select avg(salary) from emp e2 where e1.deptno = e2.deptno);

求每個部門的最高工資的員工的編號和姓名
select empno,ename,salary from emp e1 where salary =
(select max(salary) from emp e2 where e1.deptno = e2.deptno);

exists
哪些人是其他人的經理?
select empno,ename from emp where empno in
(select mgr from emp where mgr is not null);

select empno,ename from emp where empno = any
(select mgr from emp where mgr is not null);

select empno,ename from emp e1 where exists
(select 1 from emp e2 where e1.empno = e2.mgr);

exists 判斷時 判斷的是一個bool類型,不判斷列值是否相同
書寫時 直接按照where exists的方式使用
子查詢中 select不需要返回一個列值,只需要返回一個bool值
所以不需要查詢某一列 一般情況下我們用select 1(一個常量)做查詢條件

誰和拉克絲同部門?列出除了拉克絲的人
select empno,ename from emp where deptno in
(select deptno from emp where ename = 'Lacus')
and ename <> 'Lacus';

select empno,ename from emp where deptno = any
(select deptno from emp where ename = 'Lacus')
and ename <> 'Lacus';

select empno,ename from emp e1 where exists
(select 1 from emp e2 where e1.deptno = e2.deptno and e2.ename = 'Lacus')
and ename <> 'Lacus';

誰是拉克絲的下屬?
select empno,ename from emp where mgr in
(select empno from emp where ename = 'Lacus');

select empno,ename from emp where mgr = any
(select empno from emp where ename = 'Lacus');

select empno,ename from emp e1 where exists
(select 1 from emp e2 where e1.mgr = e2.empno and e2.ename = 'Lacus' );

in between...and... exists
都可以在使用前面添加not 用來表示不在這些數據中

哪些人不是別人的經理?
select empno,ename from emp where empno not in
(select mgr from emp where mgr is not null);
in的方式中需要去掉null值 否則判斷不正確

select empno,ename from emp where empno <> all
(select mgr from emp where mgr is not null);

select empno,ename from emp e1 where not exists
(select 1 from emp e2 where e1.empno = e2.mgr);

哪些部門沒有員工?
select deptno from dept where deptno not in
(select deptno from emp);

select deptno from dept where deptno <> all
(select deptno from emp);

select d.deptno from dept d where not exists
(select 1 from emp e where d.deptno = e.deptno);

表間關聯(lián)查詢 表A join 表B on 條件
查詢出所有員工的編號、姓名、部門名和工作地點
select e.empno,e.ename,d.dname,d.location from emp e,dept d
where e.deptno = d.deptno; 部分數據庫不支持

select e.empno,e.ename,d.dname,d.location from
emp e (inner) join dept d on e.deptno = d.deptno;

inner 可略
默認按照inner的方式關聯(lián) 內聯(lián)聯(lián)接 取兩個表中的交集

外連接
左外連接 驅動表 left outer join 匹配表 on 條件
顯示驅動表中的所有數據,匹配表進行匹配

查詢出所有員工的編號、姓名、部門名和工作地點 把沒有部門的員工也顯示出來
select e.empno,e.ename,d.dname,d.location from
emp e left outer join dept d on e.deptno = d.deptno;

select e.empno,e.ename,d.dname,d.location from
dept d right outer join emp e on e.deptno = d.deptno;

右外連接 驅動表 right outer join 匹配表 on 條件
顯示匹配表中的所有數據,驅動表進行匹配

查詢出所有員工的編號、姓名、部門名和工作地點 把沒有員工的部門也顯示出來
select e.empno,e.ename,d.dname,d.location from
emp e right outer join dept d on e.deptno = d.deptno;

select e.empno,e.ename,d.dname,d.location from
dept d left outer join emp e on e.deptno = d.deptno;

全外連接
select e.empno,e.ename,d.dname,d.location from
emp e left outer join dept d on e.deptno = d.deptno
union
select e.empno,e.ename,d.dname,d.location from
emp e right outer join dept d on e.deptno = d.deptno;

full outer mysql不支持 在其他數據庫中均支持
select e.empno,e.ename,d.dname,d.location from
emp e full outer join dept d on e.deptno = d.deptno;

union 聯(lián)合 返回兩次查詢的結果 去掉重復的數據
將不重復的結果都打印
一般情況下 用于全外連接和做合計相關的數據查詢
注:聯(lián)合的后段查詢結果 不會顯示相應的列名,
而是按照前段的查詢結果顯示
在程序接收數據時有可能造成接收困難

自鏈接 當前表與當前表的另外一個別名進行表間關聯(lián)查詢
顯示員工的編號、姓名和他的上司姓名
select e1.empno,e1.ename,e2.ename from emp e1
join emp e2 on e1.mgr = e2.empno;

模糊條件查詢 like
需要配合通配符使用
% 寫在查詢的值的內部
例:like '%valueTemp%' 數據中存在valueTemp的值都查詢
注:可以操作基本數字類型,只是操作時依然需要添加'' 因為mysql在這種情況,
將數據轉換為varchar類型

_ 寫在查詢的值得內部
例:like 'valueTemp' 一共三個值 第二個值是valueTemp的數據
注:一般情況下是配合%使用的通配符,獨立使用的情況比較少
例:like '_valueTemp%' 查詢出第二個值是valueTemp的數據

查詢出名字里第三個字母是e的員工的編號、姓名、工資、工作部門名稱和工作地點
按照工資從大到小的順序排序
select e.empno,e.ename,e.salary,d.dname,d.location from
emp e join dept d on e.deptno = d.deptno
where e.ename like '__e%' order by e.salary desc;

去重 distinct
加在列名之前
查詢公司的職位都有哪些?
select distinct job from emp;
注:一個select對應下 一般情況只有一個distinct,
并且一般情況下不會出現去重列后查詢其他列
因為去重列是無法判斷行數的,會導致數據混亂

復制表
create table 表名 select 列名 from 表名
復制結果集

復制表內數據
insert into 表名 select 列名 from 表名

在數據庫中 對比于c/c++新增了一個新的類型date
專門用于存儲日期類型的數據類型
在mysql date的延伸類型 time timestamp datetime year
timestamp 默認存儲當前時間,當修改同一行數據時會默認修改

在mysql中 時間函數 :
now() : yyyy-mm-dd hh:mm:ss 年-月-日 時:分:秒
current_time() : hh:mm:ss 時:分:秒 可略寫為curtime();
current_date() : yyyy-mm-dd 年-月-日 可略寫為curdate();

求出所有員工的編號、姓名和工作天數
select empno,ename,to_days(curdate())-to_days(hiredate) work_day from emp;

select empno,ename,datediff(curdate(),hiredate) work_day from emp;

索引 index
類似于目錄式另外的一個數據文件 當條件查詢時可以加快

< >= <= in not in <> between...and... not between...and...

但是提高查詢效率的同時,會降低插入、修改和刪除的效率,因為索引文件
會與表本身同步更新
索引文件會根據表中數據的增大而增大,占用硬盤空間,容易造成服務器硬盤溢出

創(chuàng)建一個一般索引
create index 名稱 on 表名(列名);

刪除一個一般索引
drop index 名稱 on 表名

索引還區(qū)分為 組合索引,主鍵索引,聚簇索引

事務 begin
在mysql中默認情況下 想要進行事務處理
需要先進行一次begin操作
begin執(zhí)行后才可以進行一下操作
commit
提交 確定begin之后的操作 使其不可以rollback
rollback
撤銷 begin之后的操作可以退回到沒有操作時的狀態(tài)

事務操作只可以操作上一次事務,無法連續(xù)撤銷
set autocommit = 1/0 可以設置開啟事務或關閉事務

contraint 約束
not null 不可為空
unique 不可重
primary key 主鍵(主鍵索引)
default value 默認值
auto_increment 自增長列
foreign key 外鍵約束(組合索引)
在表的基本列寫完之后,按照以下方式:
foreign key(本表列名) references 主表名(主表列)

約束可以提高插入數據的準確性,但是因為系統(tǒng)需要匹配約束條件,所以會降低修改數據的效率

修改數據表結構
alter table 表名 action

action :
add 添加
set 設置
change 改變
modify 修改
CHANGE 對列進行重命名或更改列的類型,需給定舊的列名稱和新的列名稱、當前的類型
MODIFY 可以改變列的類型,此時不需要重命名(不需給定新的列名稱)
drop 刪除
engine 改變類型
rename 改名

什么是觸發(fā)器?
什么是事務?什么是鎖?
什么叫視圖?游標是什么?
數據庫中常見的幾種約束有哪些?
分別代表什么意思?如何使用?

1, 數據庫編程(每小題3分)
有如下表:
Student(S#,Sname,Sage,Ssex) 學生表
Course(C#,Cname,T#) 課程表
SC(S#,C#,score) 成績表
Teacher(T#,Tname) 教師表
注:S#為學生編號,C#為課程編號,T#為教師編號

  1. 查詢“001”課程比“002”課程成績高的所有學生的學號
    select s1.S# from SC s1 join SC s2 on s1.S# = s2.S# and s1.score > s2.score and s1.C# = 001 and s2.C# = 002;

  2. 查詢平均成績大于60分的同學的學號和平均成績
    select S#,avg(score) avg_score from SC group by S#
    having avg_score > 60;

  3. 查詢所有同學的學號、姓名、選課數、總成績
    select s.S#,s.Sname,count(sc.C#) count_course,
    sum(sc.score) sum_score from Student s
    join SC sc on s.S# = sc.S# group by s.s#;

  4. 查詢沒學過“葉平”老師課的同學的學號、姓名
    select S#,Sname from Student s1 where not exists
    select 1 from Student s2 join SC sc
    on s.S# = sc.S# where s1.S# = s2.S# and sc.C# =
    (select C# from Course where T# =
    (select T# from Teacher where Tname = '葉平'));

  5. 刪除學習“葉平”老師課的SC表記錄
    delete from SC where C# =
    (select C# from Course c
    join Teacher t on c.T# = t.T# and
    t.Tname = '葉平');

  6. 查詢不同老師所教不同課程平均分從高到低顯示
    select avg(score) avg_score from SC sc
    join Course c on sc.C# = c.C#
    group by c.T# order by avg_score desc;

  7. 查詢兩門以上不及格課程的同學的學號及其平均成績
    select S#,avg(score) avg_score from SC sc1
    where exists(select 1 from
    (select S#,score from score where score < 60) sc
    where sc1.S# = sc.S#
    group by sc.S# having count(sc.S#) >= 2)
    group by S#;

  8. 查詢各科成績前三名的記錄:(不考慮成績并列情況)
    select score,C# from SC sc1 where sc1.score =
    (select score from SC sc2 where sc1.C# = sc2.C#
    order by score desc limit 1) or sc1.score =
    (select score from SC sc2 where sc1.C# = sc2.C#
    order by score desc limit 1,1) or sc1.score =
    (select score from SC sc2 where sc1.C# = sc2.C#
    order by score desc limit 2,1) order by C#;

  9. 查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分
    select C#,max(score) max_score ,min(score) min_score from SC group by C#;

  10. 查詢學過“001”并且也學過編號“002”課程的同學的學號、姓名;
    select S#,Sname from Student s
    where exists(
    select 1 from SC sc1 where C# = 1
    and exists
    (select 1 from SC sc2 where C# = 2
    and sc1.S# = sc2.S#) and s.S# = sc1.S#);

主鍵:唯一確定一條記錄??梢杂梢粋€或多個字段產生。
create table student(stuId int not null auto_increment primary key
, stuName varchar(32) not null default 'NewStu'
, stuSex char(7) not null default 'male'
, stuAge int not null default 18
, stuPart varchar(32) not null default 'computer');

create table teacher(tecId int not null auto_increment
, tecName varchar(32) not null default 'NewTec'
, salary float not null default 3000
, primary key(tecId));

外鍵:若表中的某字段的值需要依賴于其他表中的某個字段,則把該字段申明為外鍵
create table course(couId int not null auto_increment
, couName varchar(32) not null default 'NewCou'
, tecId int not null
, primary key(couId)
, foreign key(tecId) references teacher(tecId));

create table score(stuId int not null
, couId int not null
, mark float not null default 60
, primary key(stuId, couId)
, foreign key(stuId) references student(stuId)
, foreign key(couId) references course(couId));

刪除

mysql> delete from student where id = 10009; //如果不加條件--delete from student,則會將表中數據全部清除

修改重置

update student set age = 20 where id = 10005;  //如果不加條件--update student set age = 20,則會將表中所有age字段的設置為20
mysql> update student set age=age-4,dept='math' where id = 10007;
mysql> update student set age=age+3 where age >= 20;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 98,430評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,134評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,653評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,136評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,372評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 48,888評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,738評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,179評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,610評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,916評論 2 372

推薦閱讀更多精彩內容