MySQL-疑問匯總

MySQL
疑問匯總

這里吧同學(xué)們遇到的問題都匯總起來,方便大家一起查閱。

update at 2017-10-13

Workbench安裝問題

昨天就說過Workbench的安裝問題,具體的可以往下看,這里記錄一個(gè)類似問題
因?yàn)榘惭bWorkbench需要一些依賴先安裝,比如那個(gè).NET Framework,官網(wǎng)上提供的連接地址應(yīng)該沒有修改,如果直接跳轉(zhuǎn)去下載,應(yīng)該是.NET FRAMEWORK4.5的,但實(shí)際安裝的時(shí)候,是需要4.5.2的

而且在安裝4.5的時(shí)候,可能還會(huì)遇到這樣的情況,說本地已經(jīng)安裝過了,所以去下載4.5.2就可以了,


后面經(jīng)過同學(xué)的驗(yàn)證,就是這樣解決的,沒有問題。

連接測(cè)試數(shù)據(jù)庫

今天遇到一個(gè)使用客戶端連接測(cè)試數(shù)據(jù)庫一直不行的問題。背景是這樣的:
測(cè)試數(shù)據(jù)庫在阿里云上,很多人都可以訪問,說明數(shù)據(jù)庫配置啥的沒有問題,但是有一位同學(xué)的電腦就是訪問不了,報(bào)下面這個(gè)錯(cuò)誤


網(wǎng)上也找過,都說是服務(wù)器端配置問題,但是已知服務(wù)器端沒有問題,這就奇了怪了,該電腦也是可以ping通服務(wù)器的。后面了解到,這位同學(xué)是在外企,公司的網(wǎng)絡(luò)是美國(guó)的網(wǎng)絡(luò),但是網(wǎng)上查說國(guó)外訪問國(guó)內(nèi)的阿里云是可以的。沒有想到其他什么原因,估計(jì)就是所在的公司網(wǎng)絡(luò)有問題,導(dǎo)致連不到阿里云。
最后,同學(xué)回家后,用家里的網(wǎng)絡(luò)就可以訪問了。
這種問題,常見解決方法就是,排查2個(gè)方面

  • 服務(wù)器端配置問題
  • 本地網(wǎng)絡(luò)問題

SQLZoo練習(xí)題

原題地址http://zh.sqlzoo.net/wiki/More_JOIN_operations
第13題

這道題呢,不是很難,有2點(diǎn)比較難

  • 英文的,哈哈,借助了有道翻譯
  • 一個(gè)字段沒理解含義,導(dǎo)致出錯(cuò)

題目是啥意思呢?就是說要返回一個(gè)演員列表,按照字母順序,主演過30個(gè)以上的角色
我們只要搞明白那幾張表就行了

這個(gè)演員名單表,存的是電影ID和演員ID,注意這個(gè)ord表示的是,電影中演員的排名,ord=1才表示主演
參考介紹http://zh.sqlzoo.net/wiki/More_details_about_the_database.

這些都搞明白,SQL就容易了

select name from actor where id in (select actorid from casting where ord=1 group by actorid having count(distinct movieid)>=30)
order by name desc

-- 或者這樣
select a.name from actor a 
join casting b on a.id=b.actorid 
where b.ord=1 
group by a.name
having count(distinct b.movieid)>=30

上面的order by可以不要,好辣,今天問題整理到這里。


update at 2017-10-12

1. Workbench、Navicat是干嘛的,和SQL有啥關(guān)系?

Workbench和Navicat都是數(shù)據(jù)庫管理工具,讓我們可以方便快捷的管理和使用數(shù)據(jù)庫。類似的工具有很多,免費(fèi)的、收費(fèi)的好多好多,就好像共享單車,ofo、mobike、小藍(lán)單車、小鳴單車......用哪個(gè)都可以,看我們的選擇了。

SQL呢?是一種查詢語言,雖然和寫代碼編程有關(guān),但是不用怕,記住九九乘法表,后面就是活學(xué)活用了。我們?yōu)榱撕蛿?shù)據(jù)庫成為好朋友,得多和他聊天吧,但我們和他不是一個(gè)星球的,那咋辦?巧了,他聽得懂SQL,那我們學(xué)下SQL,就可以愉快的玩耍了。這里呢,我們還得注意一下,目前市場(chǎng)上在使用的數(shù)據(jù)庫有很多,

dbs

SQL是一套標(biāo)準(zhǔn),其他每個(gè)數(shù)據(jù)庫都實(shí)現(xiàn)那些基本功能,然后拓展些自己的語法,所以很不幸,換一個(gè)數(shù)據(jù)庫,我們的SQL不一定完全跑的通。
只要我們掌握了標(biāo)準(zhǔn)的SQL語法然后針對(duì)不同的數(shù)據(jù)庫,關(guān)注下特殊語法就可以了(會(huì)騎ofo,換了Mobike就不會(huì)騎了嗎?)

綜上所述,我們是通過管理工具(Workbench、Navicat......)去使用和管理數(shù)據(jù)庫(MySQL.....),在管理工具中,我們使用SQL來和數(shù)據(jù)庫互動(dòng)。

2. Workbench的使用

參考:MySQL-Workbench使用

3. sqlzoo第九題

題目地址: sqlzoo
首先是關(guān)于all的疑問

關(guān)于all可以參考這里先簡(jiǎn)單了解下:MySQL-子查詢的使用

SQL這樣寫是沒問題的

SELECT 
    name,
    continent,
    population 
FROM 
    world x
    -- 返回符合條件的所有數(shù)據(jù)
WHERE 
    -- 使用all,判斷該州的所有人口數(shù)是否都 <= 25000000
    25000000  >= ALL(
        -- 我們使用子查詢,獲取每一個(gè)州的所有人口數(shù)
        SELECT 
            population 
        FROM 
            world y 
        WHERE  x.continent =y.continent
    )
  • 疑問1: 能不能把這個(gè)all放到后面像這樣


答案是不行的,這個(gè)不符合all的使用語法,具體語法參考官方文檔:https://dev.mysql.com/doc/refman/5.7/en/all-subqueries.html

all一定要放在一個(gè)比較運(yùn)算符的后面才行,所以,替換是不符合規(guī)范的,會(huì)報(bào)錯(cuò)


  • 疑問2:為什么下面的寫法不對(duì)
SELECT
    name,
    continent,
    population 
FROM 
    world 
WHERE  
    25000000 >= ALL(
        SELECT 
            MAX(population) 
        FROM 
            world  
        GROUP BY 
            continent 
    )

我們分析下題目,他是說要查詢出州下面每個(gè)城市的人口數(shù)都小于等于25000000的記錄
上面我們就是使用all來實(shí)現(xiàn)去判斷每個(gè)州下面的所有城市的人口數(shù)都<= 25000000,現(xiàn)在呢,不想去判斷每個(gè)城市的人口數(shù)了,我只要拿出該州下面最大的人口數(shù),然后判斷這個(gè)最大值是不是<= 25000000就可以了。
思路是對(duì)的,但是SQL稍微有些問題

-- 要么返回所有記錄,要么沒有返回記錄
SELECT
    name,
    continent,
    population 
FROM 
    world 
WHERE  
    -- 因?yàn)橹鞅韜orld和子查詢沒有關(guān)聯(lián)關(guān)系,所以這里的all就變成了“每個(gè)州的最大人口數(shù)是不是都 <= 25000000
    -- 也就是說,下面子查詢的返回值,如果都是 <= 25000000,那就會(huì)返回world表的所有數(shù)據(jù);如果有一個(gè)州的人口數(shù) >25000000,那就沒有記錄返回
    25000000 >= ALL(
        -- 獲取每個(gè)州,最大的人口數(shù)
        SELECT 
            MAX(population) 
        FROM 
            world  
        GROUP BY 
            continent 
    ) 

所以,我們要做的改動(dòng),就是讓主表和子查詢有關(guān)聯(lián)關(guān)系,即判斷每一個(gè)州的最大值

不使用all也可以,

-- 查詢符合條件的州即可
select name,continent,population from world where continent in (
    -- 使用having直接過濾,判斷每個(gè)州的最大人口是否<= 25000000
    select continent from world group by continent having max(population) <= 25000000
)

好了,這個(gè)問題,也寫到這,大家可以看看還有沒有別的寫法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容