1. MYSQL安裝
安裝教程:沒有data目錄和my-default.ini和my.ini文件以及服務(wù)無法啟動的解決辦法以及修改初始密碼的方法
2. Mysql 基礎(chǔ)語法以及常用的命令語句
需要注意:SQL 對大小寫不敏感:SELECT 與 select 是相同的
(1)提取推励、更新與刪除
SELECT - 從數(shù)據(jù)庫中提取數(shù)據(jù)??????? ###:相當于tag,選取所需“數(shù)據(jù)” ///? +where? 限制條件
UPDATE - 更新數(shù)據(jù)庫中的數(shù)據(jù)??? ###更新數(shù)據(jù)需要進行限定where阿宅,不然就是全局更改
DELETE - 從數(shù)據(jù)庫中刪除數(shù)據(jù) ###? 限制性類同于update;不刪除表的情況下澄成,刪除表中所有的行:
DELETE FROMtable_name; 或 DELETE *FROMtable_name;
延伸:? SQL關(guān)于刪除的三個語句: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的且國家為US的數(shù)據(jù)
DELETE FROM test WHERE age=30 AND country='US';
? 2躺苦、刪除整個表
僅刪除表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)鍵字用于對結(jié)果集按照一個列或者多個列進行排序。
如果需要按照?降序?對記錄進行排序脐区,您可以使用?DESC 關(guān)鍵字
????????????eg?: order by A,B 這個時候都是默認按升序排列
??????????? ?????? order by A desc,B 這個時候 A 降序愈诚,B 升序排列
???????? ????????? order by A ,B desc 這個時候 A 升序,B 降序排列
(3). 相關(guān)練習
(其中部分相近的會寫在一塊,順序可能會有些亂扰路,需要后續(xù)的整理和繼續(xù)學習實踐)
1.查詢學過編號為"01"并且也學過編號為"02"的課程的同學的信息
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. 查詢學過編號為"01"但是沒有學過編號為"02"的課程的同學的信息
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. 自己想想這個功能是什么
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"號的同學學習的課程完全相同的其他同學的信息;
? 最后步使用統(tǒng)計量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的位置
查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績
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. 此處的知識點在于選取時 可將(語句)作為屬性
按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
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ù)學,
? ? ? ? ? ? ? ? (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ù)進行研究
-- 24汗唱、查詢學生平均成績及其名次
? ? ? ? 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、查詢各科成績前三名的記錄
? ? ? ? ? ? -- 1.選出b表比a表成績大的所有組
? ? ? ? ? ? -- 2.選出比當 前id成績大的 小于三個的
? ? ? ? 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. 一個是union 的連續(xù)使用丈攒;還發(fā)現(xiàn)另一個問題(嘗試找出):
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
查詢所有課程的成績第2名到第3名的學生信息及該課程成績
? ? ? ? ? ? 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. 多條件時的執(zhí)行順序
查詢每門課程的平均成績哩罪,結(jié)果按平均成績降序排列,平均成績相同時巡验,按課程編號升序排列
? ? 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.排序提取
查詢每門功成績最好的前兩名
? ? ? ? -- 牛逼的寫法
? ? 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.日期
查詢各學生的年齡
? ? -- 按照出生日期來算际插,當前月日 < 出生年月的月日則,年齡減一
? ? 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显设、查詢本周過生日的學生
? ? 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框弛、查詢下周過生日的學生
? ? SELECT * FROM student WHERE WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))+1 =WEEK(s_birth)
-- 49、查詢本月過生日的學生
? ? SELECT * FROM student WHERE MONTH(DATE_FORMAT(NOW(),'%Y%m%d')) =MONTH(s_birth)
-- 50捕捂、查詢下月過生日的學生
? ? SELECT * FROM student WHERE MONTH(DATE_FORMAT(NOW(),'%Y%m%d'))+1 =MONTH(s_birth)?