1. MYSQL安裝
安裝教程:沒有data目錄和my-default.ini和my.ini文件以及服務(wù)無法啟動(dòng)的解決辦法以及修改初始密碼的方法
2. Mysql 基礎(chǔ)語法以及常用的命令語句
需要注意:SQL 對(duì)大小寫不敏感:SELECT 與 select 是相同的
(1)提取、更新與刪除
SELECT - 從數(shù)據(jù)庫中提取數(shù)據(jù)??????? ###:相當(dāng)于tag,選取所需“數(shù)據(jù)” ///? +where? 限制條件
UPDATE - 更新數(shù)據(jù)庫中的數(shù)據(jù)??? ###更新數(shù)據(jù)需要進(jìn)行限定where,不然就是全局更改
DELETE - 從數(shù)據(jù)庫中刪除數(shù)據(jù) ###? 限制性類同于update;不刪除表的情況下,刪除表中所有的行:
DELETE FROMtable_name; 或 DELETE *FROMtable_name;
延伸:? SQL關(guān)于刪除的三個(gè)語句:DROP、TRUNCATE、DELETE的區(qū)別。
a. DROP:
DROP test;?????? 刪除表test,并釋放空間,將test刪除的一干二凈。
b. TRUNCATE:
TRUNCATE test;????? 刪除表test里的內(nèi)容,并釋放空間,但不刪除表的定義,表的結(jié)構(gòu)還在。
c. DELETE:
? 1、刪除指定數(shù)據(jù)
刪除表test中年齡等于30的且國(guó)家為US的數(shù)據(jù)
DELETE FROM test WHERE age=30 AND country='US';
? 2、刪除整個(gè)表
僅刪除表test內(nèi)的所有內(nèi)容,保留表的定義,不釋放空間。
DELETE FROM test 或者 DELETE FROM test;DELETE * FROM test 或者 DELETE * FROM test;
(2). 常用的插入查詢
INSERT INTO - 向數(shù)據(jù)庫中插入新數(shù)據(jù)?
? ? ? ???INSERT INTO Websites?(name, url, alexa, country)
? ? ? ? ? VALUES?('百度','https://www.baidu.com/','4','CN');
CREATE DATABASE - 創(chuàng)建新數(shù)據(jù)庫
ALTER?DATABASE - 修改數(shù)據(jù)庫
CREATE TABLE - 創(chuàng)建新表
ALTER TABLE - 變更(改變)數(shù)據(jù)庫表
DROP?TABLE - 刪除表
CREATE INDEX - 創(chuàng)建索引(搜索鍵)
DROP INDEX - 刪除索引
***ORDER BY?- 關(guān)鍵字用于對(duì)結(jié)果集按照一個(gè)列或者多個(gè)列進(jìn)行排序。
如果需要按照?降序?對(duì)記錄進(jìn)行排序,您可以使用?DESC 關(guān)鍵字
????????????eg?: order by A,B 這個(gè)時(shí)候都是默認(rèn)按升序排列
??????????? ?????? order by A desc,B 這個(gè)時(shí)候 A 降序,B 升序排列
???????? ????????? order by A ,B desc 這個(gè)時(shí)候 A 升序,B 降序排列
(3). 相關(guān)練習(xí)
(其中部分相近的會(huì)寫在一塊,順序可能會(huì)有些亂,需要后續(xù)的整理和繼續(xù)學(xué)習(xí)實(shí)踐)
1.查詢學(xué)過編號(hào)為"01"并且也學(xué)過編號(hào)為"02"的課程的同學(xué)的信息
select a.* from
? ? student a,score b,score c
? ? where a.s_id = b.s_id? and a.s_id = c.s_id and b.c_id='01' and c.c_id='02';
*** 兩種完全不同的思路? ?
2. 查詢學(xué)過編號(hào)為"01"但是沒有學(xué)過編號(hào)為"02"的課程的同學(xué)的信息
select a.* from
? ? student a
? ? where a.s_id in (select s_id from score where c_id='01' ) and a.s_id not in(select s_id from score where c_id='02')?
3. 自己想想這個(gè)功能是什么
SELECT s.* FROM
? ? student s WHERE s.s_id IN(
? ? ? ? SELECT s_id FROM score WHERE s_id NOT IN(
? ? ? ? ? ? SELECT a.s_id FROM score a
? ? ? ? ? ? ? ? JOIN score b ON a.s_id = b.s_id AND b.c_id='02'
? ? ? ? ? ? ? ? JOIN score c ON a.s_id = c.s_id AND c.c_id='03'
? ? ? ? ? ? WHERE a.c_id='01'))
4. 查詢和"01"號(hào)的同學(xué)學(xué)習(xí)的課程完全相同的其他同學(xué)的信息;
? 最后步使用統(tǒng)計(jì)量count? ? ? ? ? ?
SELECT a.* FROM student a WHERE a.s_id? IN (
? ? SELECT DISTINCT s_id FROM score WHERE s_id!="01" AND c_id IN (
? ? SELECT c_id FROM score WHERE s_id="01") GROUP BY s_id
? ? HAVING COUNT(1)=(SELECT COUNT(1) FROM score WHERE s_id="01"))
5. 核心在于having 和where的位置
查詢兩門及其以上不及格課程的同學(xué)的學(xué)號(hào),姓名及其平均成績(jī)
SELECT a.`s_id`, a.`s_name`, ROUND(AVG(b.s_score)) AS avg_score FROM
? ? student a
? ? LEFT JOIN score b ON a.`s_id`=b.s_id
? ? WHERE a.`s_id` IN (
? ? SELECT s_id FROM score WHERE s_score<60 GROUP BY s_id HAVING COUNT(1)>=2)
? ? GROUP BY a.`s_id`, a.`s_name`
6. 此處的知識(shí)點(diǎn)在于選取時(shí) 可將(語句)作為屬性
按平均成績(jī)從高到低顯示所有學(xué)生的所有課程的成績(jī)以及平均成績(jī)
SELECT a.s_id,(SELECT s_score FROM score WHERE s_id=a.s_id AND c_id='01') AS 語文,
? ? ? ? ? ? ? ? (SELECT s_score FROM score WHERE s_id=a.s_id AND c_id='02') AS 數(shù)學(xué),
? ? ? ? ? ? ? ? (SELECT s_score FROM score WHERE s_id=a.s_id AND c_id='03') AS 英語,
? ? ? ? ? ? ? ? ROUND(AVG(s_score),2) AS 平均分
? ? ? ? ? ? FROM score a?
? ? ? ? ? ? GROUP BY a.s_id ORDER BY 平均分 DESC;
7.(19)排序,需要后續(xù)進(jìn)行研究
-- 24、查詢學(xué)生平均成績(jī)及其名次
? ? ? ? SELECT a.s_id,
? ? ? ? ? ? ? ? @i:=@i+1 AS '不保留空缺排名',
? ? ? ? ? ? ? ? @k:=(CASE WHEN @avg_score=a.avg_s THEN @k ELSE @i END) AS '保留空缺排名',
? ? ? ? ? ? ? ? @avg_score:=avg_s AS '平均分'
? ? ? ? FROM (SELECT s_id,ROUND(AVG(s_score),2) AS avg_s FROM score GROUP BY s_id)a,(SELECT @avg_score:=0,@i:=0,@k:=0)b;
-- 25、查詢各科成績(jī)前三名的記錄
? ? ? ? ? ? -- 1.選出b表比a表成績(jī)大的所有組
? ? ? ? ? ? -- 2.選出比當(dāng) 前id成績(jī)大的 小于三個(gè)的
? ? ? ? SELECT a.s_id,a.c_id,a.s_score FROM score a
? ? ? ? ? ? LEFT JOIN score b ON a.c_id = b.c_id AND a.s_score<b.s_score
? ? ? ? ? ? GROUP BY a.s_id,a.c_id,a.s_score HAVING COUNT(b.s_id)<3
? ? ? ? ? ? ORDER BY a.c_id,a.s_score DESC
8. 一個(gè)是union 的連續(xù)使用;還發(fā)現(xiàn)另一個(gè)問題(嘗試找出):
SELECT a.*, b.rank,b.s_score, b.c_id FROM (
? ? SELECT a.s_id,a.s_score,a.c_id,@k:=@k+1 AS rank FROM score a,(SELECT @k:=0)s WHERE a.c_id='03'
? ? )b
? ? LEFT JOIN student a ON b.`s_id`=a.`s_id`
? ? WHERE rank BETWEEN 2 AND 3
查詢所有課程的成績(jī)第2名到第3名的學(xué)生信息及該課程成績(jī)
? ? ? ? ? ? SELECT d.*,c.排名,c.s_score,c.c_id FROM (
? ? ? ? ? ? ? ? SELECT a.s_id,a.s_score,a.c_id,@i:=@i+1 AS 排名 FROM score a,(SELECT @i:=0)s WHERE a.c_id='01'? ?
? ? ? ? ? ? )c
? ? ? ? ? ? LEFT JOIN student d ON c.s_id=d.s_id
? ? ? ? ? ? WHERE 排名 BETWEEN 2 AND 3
? ? ? ? ? ? UNION
? ? ? ? ? ? SELECT d.*,c.排名,c.s_score,c.c_id FROM (
? ? ? ? ? ? ? ? SELECT a.s_id,a.s_score,a.c_id,@j:=@j+1 AS 排名 FROM score a,(SELECT @j:=0)s WHERE a.c_id='02'? ?
? ? ? ? ? ? )c
? ? ? ? ? ? LEFT JOIN student d ON c.s_id=d.s_id
? ? ? ? ? ? WHERE 排名 BETWEEN 2 AND 3
? ? ? ? ? ? UNION
? ? ? ? ? ? SELECT d.*,c.排名,c.s_score,c.c_id FROM (
? ? ? ? ? ? ? ? SELECT a.s_id,a.s_score,a.c_id,@k:=@k+1 AS 排名 FROM score a,(SELECT @k:=0)s WHERE a.c_id='03'? ?
? ? ? ? ? ? )c
? ? ? ? ? ? LEFT JOIN student d ON c.s_id=d.s_id
? ? ? ? ? ? WHERE 排名 BETWEEN 2 AND 3;
9. 多條件時(shí)的執(zhí)行順序
查詢每門課程的平均成績(jī),結(jié)果按平均成績(jī)降序排列,平均成績(jī)相同時(shí),按課程編號(hào)升序排列
? ? SELECT c_id,ROUND(AVG(s_score),2) AS avg_score FROM score GROUP BY c_id ORDER BY avg_score DESC,c_id ASC? ? ? ? ?
10.排序提取
查詢每門功成績(jī)最好的前兩名
? ? ? ? -- 牛逼的寫法
? ? SELECT a.s_id,a.c_id,a.s_score FROM score a
? ? ? ? WHERE (SELECT COUNT(1) FROM score b WHERE b.c_id=a.c_id AND b.s_score>=a.s_score)<=2 ORDER BY a.c_id?
11.日期
查詢各學(xué)生的年齡
? ? -- 按照出生日期來算,當(dāng)前月日 < 出生年月的月日則,年齡減一
? ? SELECT s_birth,(DATE_FORMAT(NOW(),'%Y')-DATE_FORMAT(s_birth,'%Y') -
? ? ? ? ? ? ? ? (CASE WHEN DATE_FORMAT(NOW(),'%m%d')>DATE_FORMAT(s_birth,'%m%d') THEN 0 ELSE 1 END)) AS age
? ? ? ? FROM student;
-- 47、查詢本周過生日的學(xué)生
? ? SELECT * FROM student WHERE WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))=WEEK(s_birth)
? ? SELECT * FROM student WHERE YEARWEEK(s_birth)=YEARWEEK(DATE_FORMAT(NOW(),'%Y%m%d'))
? ? SELECT WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))
-- 48、查詢下周過生日的學(xué)生
? ? SELECT * FROM student WHERE WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))+1 =WEEK(s_birth)
-- 49、查詢本月過生日的學(xué)生
? ? SELECT * FROM student WHERE MONTH(DATE_FORMAT(NOW(),'%Y%m%d')) =MONTH(s_birth)
-- 50、查詢下月過生日的學(xué)生
? ? SELECT * FROM student WHERE MONTH(DATE_FORMAT(NOW(),'%Y%m%d'))+1 =MONTH(s_birth)?