天天看點

MySQL資料庫的部分基礎操作

一、表和表字段的操作

1、修改、删除表名

drop table  student  //删除表
alter table student rename as st //修改表名
           

2、修改和增加、删除表字段

//在表的最後添加字段,必須添加資料類型
alter table student add name varchar(11)

//删除表字段,不要添加資料類型,字段名即可 
alter table student drop name 
 
//批量删除表字段
alter table student drop name,drop gender,drop hobby 

//修改表名(及資料類型),必須要添加資料類型,前面的是被修改的,後面是最後結果的字段
alter table student change gender sex varchar(11)  

//修改表字段資料類型
alter table student modify name varchar(20)  
           

3、增加、删除索引

alter table student add  index name(name)  //建立普通索引
alter table student drop  index name  //删除索引
           

二、資料查詢操作

1、查詢結果去重和不去重

去重:使用distinct或者group by

select distinct name from score
select name from score group by name
           

不去重:使用 Union all

SELECT coures , name ,gender from score where name = '李四' or gender = 'female'

SELECT coures , name ,gender from score where name = '李四' 
union all
SELECT coures , name ,gender from score where gender = 'female'
           

很多時候這兩種查詢的結果是一緻的,但如果需要資料不去重的時候可以使用union all

2、查詢結果排序

select * from score ORDER BY coures  //預設是升序
select * from score ORDER BY coures desc //desc 降序
select * from score ORDER BY coures,grade  //根據多條件排序,放在前的先排序
           

3、條件查詢

3.1 等值判斷

select * from score where grade = 100
           

3.2 不等值判斷

> 、 < 、>= 、<= 、 !=(<>)
select * from score where grade > 97
select * from score where grade >= 97
select * from score where grade < 97
select * from score where grade <= 97
select * from score where grade != 97
select * from score where grade <> 97
           

3.3 邏輯判斷

and or not
select * from score where grade = 97 and name = '李四'
select * from score where grade = 97 or name = '李四'
not    //主要用于判斷空值或者判斷存在的時候
           

3.4 區間判斷

//一般使用範圍的時候可以使用拼接的不等值判斷
select * from score where grade < 98 and grade > 95  //可以得到(95~98)之間的數
select * from score where grade between  95 and 98  //等價上面的語句,小值必須在前
           

3.5 空值判斷

is null 、 is not null
select * from score where name is null  //傳回name是空值的結果
select * from score where name is not null  //傳回name不是空值的結果
           

3.6 枚舉查詢

當查詢的條件是等值判斷,且值為有限個數時,可以使用枚舉查詢

select * from score where grade in (95,96,98)
           

注:枚舉 查詢雖然SQL語句簡便,但是查詢的效率較低,可通過多條件拼接。 3.7 模糊查詢

當想要使用某個字段作為查找條件,但是對這個字段又記的不是很清楚的時候,可以使用模糊查詢

// %代表任意個字元,_代表一個字元,一位
select * from score where name like '張%' //表示以’張‘開頭,後面任意個字元
select * from score where name like '張_' //表示以’張‘開頭,後面1個字元
select * from score where name like '%四' //表示以’四‘結尾,前面任意個字元
select * from score where name like '_四' //表示以’四‘結尾,前面1個字元
           

3.8 分支結構查詢

SELECT name ,coures,
case 
when grade >= 98 then '優'
when grade < 98 then '良'
end '成績水準'
from score  
           

結果:

MySQL資料庫的部分基礎操作

 分支結構查詢,主要用于操作同一個字段的不同取值範圍

4、時間查詢

select SYSDATE() //擷取目前系統時間(日、月、年、時、分、秒)
select CURDATE() //擷取目前日期
select CURTIME() //擷取目前時間 
select WEEK(DATE) //擷取指定日期為一年中的第幾周
select MONTH(DATE) //擷取指定日期的月份
select YEAR(DATE) //擷取指定日期的年份 
select HOUR(TIME) //擷取指定時間的小時值 
select MINUTE(TIME) //擷取時間的分鐘值 
select DATEDIFF(DATE1,DATE2) //擷取DATE1 和 DATE2 之間相隔的天數 
select ADDDATE(DATE,N) //計算DATE 加上 N 天後的日期 
           

5、字元串查詢

SELECT CONCAT('My','S','QL')  //将多個字元串連接配接
SELECT INSERT('這是一個資料庫',3,2,'MySql') //結果為這是 MySql 資料庫 
SELECT LOWER('MYSQL') //将指定字元串轉換為小寫
SELECT UPPER('mysql') //将指定字元串轉換為大寫
SELECT SUBSTRING('JavaMySQL',5,5) //将JavaMySQL從第5個字元開始截取 5 個内容 
           

6、聚合函數

sum() 求和        avg() 求平均數       max() 求最大數       min() 求最小數        count() 求總行數
SELECT sum(grade) from socre //擷取總成績
SELECT avg(grade) from socre //擷取平均成績
SELECT max(grade) from socre //擷取最高成績
SELECT min(grade) from socre //擷取最低成績
SELECT count(grade) from socre //擷取成績的總行數
           

7、分組查詢

SELECT coures,max(grade)  from score GROUP BY coures
           

8、過濾查詢

SELECT coures ,grade from score  HAVING  grade > 97
           

我們可以發現有些時候,having和where比較類似,實際上差別還是很大的

having和where比較:

  1. 資料的來源不同。where是資料從磁盤讀入記憶體的時候進行判斷, 而having是磁盤讀入記憶體後再判斷。如果一個字段沒有被查詢過,也就是不存在記憶體中,這個時候having就不能使用這個字段做判斷,隻能使用where。
  2. SQL語句中的位置不同,若SQL語句中存在from、where、group by、having等關鍵字時,where必須要在from關鍵詞之後,group by關鍵詞之前,而having必須在group by之後。
  3. 聚合函數的使用。若查詢的條件是聚合函數,則不能使用where而使用having。

9、限定查詢

SELECT grade from score LIMIT 2  //實際是0~2的行數
SELECT grade from score LIMIT 2,5 // 傳回2~5行數的資料
           

三、SQL語句實操

1、查詢每個學生的各科成績及總分和平均分

MySQL資料庫的部分基礎操作
select st.name as '姓名' ,v1.grade as '國文' ,
v2.grade as '數學',v3.grade as '英語' ,
sum(v1.grade +v2.grade +v3.grade) as '總分',
avg((v1.grade +v2.grade +v3.grade)/3) as '平均分' 
from student st
        left join 
        //查詢出學科為國文的學生和成績,當作v1表
        (SELECT name ,grade  from score where coures = '國文') as v1 on st.name = v1.name
        left join 
        //查詢出學科為數學的學生和成績,當作v2表
        (SELECT name ,grade  from score where coures = '數學') as v2 on v1.name = v2.name 
        left join 
        //查詢出學科為英語的學生和成績,當作v3表
        (SELECT name ,grade  from score where coures = '英語') as v3 on v2.name = v3.name 
        如果沒有分組,在平均分和總分的結果隻會有一條
        GROUP BY st.name 
           

 結果:

MySQL資料庫的部分基礎操作

解析:

查詢每個學生的每科成績,首先各科成績不是字段,是以需要把單科的分數設定為字段,是以

國文.grade = 國文,數學.grade = 數學,英語.grade = 英語 是我們查找的字段。

.号前是表的名字,是以我們需要語數外三張表。

(SELECT name ,grade  from score where coures = '國文') as v1
(SELECT name ,grade  from score where coures = '數學') as v2
(SELECT name ,grade  from score where coures = '英語') as v3
           

使用左連接配接的方式将四張表聯合查詢就能得到結果

2、查詢每個學科最高分的成績及學生

表格是上面的表

SELECT score.coures as '科目',score.grade as '最高分',score.name as '姓名' 
from (SELECT coures,max(grade) m from score GROUP BY coures) a ,score 
where a.coures = score.coures and a.m = score.grade
           
MySQL資料庫的部分基礎操作