mysql學習筆記(2)

導入sql文件

用Navicat for Mysql導入.sql文件 - 路修遠而求索 - 博客園
如果右鍵刷新失敗,則用F5刷新,就會顯示成功。

常用語句

SQL是一種用於操作數據庫的語言。SQL是用於所有數據庫的基本語言。不同數據庫之間存在較小的語法更改,但基本的SQL語法基本保持不變。SQL是Structured Q uery Language 的簡短縮寫。根據ANSI(美國國家標準協會),SQL是操作關係數據庫管理系統的標準語言。
SQL用於訪問,更新和操作數據庫中的數據。它的設計允許管理RDBMS中的數據,例如MYSQL。SQL語言還用於控制數據訪問以及數據庫模式的創建和修改。

MySQL是一個RDBMS tostore,使用SQL檢索,修改和管理數據庫。需要學習SQL語言纔能有效地使用它。它可以通過下載和安裝輕鬆獲得。SQL是一種查詢語言。MySQL是數據庫軟件。

查詢語句 SELECT FROM

SELECT 語句用於從表中選取數據。
結果被存儲在一個結果表中(稱爲結果集)。
SQL SELECT 語法

SELECT 列名稱 FROM 表名稱

以及:

SELECT * FROM 表名稱

註釋:SQL 語句對大小寫不敏感。SELECT 等效於 select。
查詢語句中你可以使用一個或者多個表,表之間使用逗號(,)分割,並使用WHERE語句來設定查詢條件。
SELECT 命令可以讀取一條或者多條記錄。
你可以使用星號(*)來代替其他字段,SELECT語句會返回表的所有字段數據。
你可以使用 WHERE 語句來包含任何條件。
你可以使用 LIMIT 屬性來設定返回的記錄數。
你可以通過OFFSET指定SELECT語句開始查詢的數據偏移量。默認情況下偏移量爲0。

去重語句
sql查詢語句去除重複列(行) - danuo2011的博客 - CSDN博客
1.存在兩條完全相同的紀錄
這是最簡單的一種情況,用關鍵字distinct就可以去掉

example: 
select distinct * from table(表名) where (條件)

2.存在部分字段相同的紀錄(有主鍵id即唯一鍵)
如果是這種情況的話用distinct是過濾不了的,這就要用到主鍵id的唯一性特點及group by分組

example:
select * from table where id in (select max(id) from table group by [去除重複的字段名列表,....])

3.沒有唯一鍵ID
這種情況我覺得最複雜,目前我只會一種方法,有那位知道其他方法的可以留言,交流一下:

example:
select identity(int1,1) as id,* into newtable(臨時表) from table
select * from newtable where id in (select max(id) from newtable group by [去除重複的字段名列表,....])
drop table newtable

前N個語句
各個數據庫中,查詢前n條記錄的方法 - 閒看漫隨 - 博客園

1.select top X *  from table_name    

 --查詢前X條記錄,可以改成需要的數字,比如前10條。

 2.select top X *  from table_name order by colum_name desc  

--按colum_name屬性降序排序查詢前X條記錄,“order by” 後緊跟要排序的屬性列名,其中desc表示降序,asc表示升序(默認也是升序方式)。

 3.select top n * from (select top m * from table_name order by column_name ) a order by column_name desc   

 --查詢第N到M條記錄。常用的分頁也是這種方式。

CASE…END判斷語句
CASE WHEN THEN END多條件判斷 - Writing_the_future的博客 - CSDN博客
CASE WHEN THEN END結構有兩種書寫方式
結構:
第一種格式簡單的CASE 函數

CASE 
            WHEN 條件1 THEN 結果1
            WHEN 條件2 THEN 結果2
            WHEN 條件3 THEN 結果3
            .........
            WHEN 條件N THEN 結果N
        END
    方式:

第二種格式爲CASE搜索函數

CASE SEX 
                WHEN '1' THEN '男'
                WHEN '0'  THEN '女'
                ELSE '其他' END

篩選語句 WHERE
MySQL WHERE 子句 | 菜鳥教程
從 MySQL 表中使用 SQL SELECT 語句來讀取數據。
如需有條件地從表中選取數據,可將 WHERE 子句添加到 SELECT 語句中。
語法

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....

查詢語句中你可以使用一個或者多個表,表之間使用逗號, 分割,並使用WHERE語句來設定查詢條件。 你可以在 WHERE 子句中指定任何條件。
你可以使用 AND 或者 OR 指定一個或多個條件。 WHERE 子句也可以運用於 SQL 的 DELETE 或者 UPDATE 命令。
WHERE 子句類似於程序語言中的 if 條件,根據 MySQL 表中的字段值來讀取指定的數據。

運算符/通配符/操作符
操作符 描述 實例
= 等號,檢測兩個值是否相等,如果相等返回true (A = B) 返回false。
<>, != 不等於,檢測兩個值是否相等,如果不相等返回true (A != B) 返回 true。
> 大於號,檢測左邊的值是否大於右邊的值, 如果左邊的值大於右邊的值返回true (A > B) 返回false。
< 小於號,檢測左邊的值是否小於右邊的值, 如果左邊的值小於右邊的值返回true (A < B) 返回 true。
>= 大於等於號,檢測左邊的值是否大於或等於右邊的值, 如果左邊的值大於或等於右邊的值返回true (A >= B) 返回false。
<= 小於等於號,檢測左邊的值是否小於於或等於右邊的值, 如果左邊的值小於或等於右邊的值返回true (A <= B) 返回 true。

分組語句 GROUP BY
GROUP BY 語句根據一個或多個列對結果集進行分組。
在分組的列上我們可以使用 COUNT, SUM, AVG,等函數。

   SELECT column_name, function(column_name)
        FROM table_name
        WHERE column_name operator value
        GROUP BY column_name;

聚集函數:

[GROUP BY {col_name | position}] [ASC | DESC],…]

HAVING子句
HAVING用法詳解 - 肥宅兜 - 博客園

HAVING 子句對 GROUP BY 子句設置條件的方式與 WHERE 和 SELECT 的交互方式類似。WHERE
搜索條件在進行分組操作之前應用;而 HAVING 搜索條件在進行分組操作之後應用。HAVING 語法與 WHERE 語法類似,但
HAVING 可以包含聚合函數。HAVING 子句可以引用選擇列表中顯示的任意項。
USE AdventureWorks;

GO
SELECT ProductID, AVG(OrderQty) AS AverageQuantity, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail 
GROUP BY ProductID
HAVING SUM(LineTotal) > $1000000.00
AND AVG(OrderQty) < 3 ;
GO

排序語句 ORDER BY

以下是 SQL SELECT 語句使用 ORDER BY 子句將查詢數據排序後再返回數據:

SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]

你可以使用任何字段來作爲排序的條件,從而返回排序後的查詢結果。 你可以設定多個字段來排序。 你可以使用 ASC 或 DESC
關鍵字來設置查詢結果是按升序或降序排列。 默認情況下,它是按升序排列。 你可以添加 WHERE…LIKE 子句來設置條件。
ASC:升序(默認),DESC:降序,

函數
MySQL 函數 | 菜鳥教程
MySQL函數大全及用法示例 - 雨林少爺 - 博客園
函數較多不一一列出,可參考上述鏈接:
時間函數:
dayofweek(date)
返回日期date是星期幾(1=星期天,2=星期一,……7=星期六,odbc標準)
mysql> select dayofweek(‘1998-02-03’);
  -> 3
weekday(date)
返回日期date是星期幾(0=星期一,1=星期二,……6= 星期天)。
mysql> select weekday(‘1997-10-04 22:23:00’);
  -> 5
mysql> select weekday(‘1997-11-05’);
  -> 2
數值函數
abs(n)

返回n的絕對值
mysql> select abs(2);
  -> 2
mysql> select abs(-32);
  -> 32
sign(n)
返回參數的符號(爲-1、0或1)
mysql> select sign(-32);
  -> -1
mysql> select sign(0);
  -> 0
mysql> select sign(234);
  -> 1
字符串函數
ascii(str)
返回字符串str的第一個字符的ascii值(str是空串時返回0)
mysql> select ascii(‘2’);
  -> 50
mysql> select ascii(2);
  -> 50
mysql> select ascii(‘dete’);
  -> 100
ord(str)
如果字符串str句首是單字節返回與ascii()函數返回的相同值。
如果是一個多字節字符,以格式返回((first byte ascii code)*256+(second byte ascii code))[*256+third byte asciicode…]
mysql> select ord(‘2’);
  -> 50
sql註釋
單行註釋
SQL語句中的單行註釋使用 –

create database database_x    --創建數據庫database_x

多行註釋
SQL語句中的多行註釋採用 //

create database database_x
/*
創建一個數據庫
名字叫做database_x
*/

兩個項目練習:

項目一:查找重複的電子郵箱(難度:簡單)
創建 email表,並插入如下三行數據

+----+---------+
| Id | Email   |
+----+---------+
| 1  | [email protected] |
| 2  | [email protected] |
| 3  | [email protected] |
+----+---------+

編寫一個 SQL 查詢,查找 Person 表中所有重複的電子郵箱。
說明:所有電子郵箱都是小寫字母。

參考代碼:
– 創建表

   CREATE TABLE email (
    ID INT NOT NULL PRIMARY KEY,
    Email VARCHAR(255)
    )

– 插入數據

INSERT INTO email VALUES('1','[email protected]');
INSERT INTO email VALUES('2','[email protected]');
INSERT INTO email VALUES('3','[email protected]');

Mysql實現"查找重複的電子郵箱"的兩種方法 - 數據庫其他綜合 - 紅黑聯盟
–查詢數據
1:先按郵箱Email分組,生成臨時表A,表A中有Email和對應出現的次數。然後判斷次數是否大於1

SELECT Email
FROM (SELECT Email, COUNT(*) AS Sum
      FROM Email
     GROUP BY Email) AS A
WHERE A.Sum>1

2:利用HAVING

WHERE 關鍵字無法與聚合函數一起使用。HAVING 子句可以讓我們篩選分組後的各組數據。

SELECT Email FROM Email
GROUP BY Email
HAVING COUNT(*)>1

項目二:查找大國(難度:簡單)

創建如下 World 表

+-----------------+------------+------------+--------------+---------------+
| name            | continent  | area       | population   | gdp           |
+-----------------+------------+------------+--------------+---------------+
| Afghanistan     | Asia       | 652230     | 25500100     | 20343000      |
| Albania         | Europe     | 28748      | 2831741      | 12960000      |
| Algeria         | Africa     | 2381741    | 37100000     | 188681000     |
| Andorra         | Europe     | 468        | 78115        | 3712000       |
| Angola          | Africa     | 1246700    | 20609294     | 100990000     |
+-----------------+------------+------------+--------------+---------------+

如果一個國家的面積超過300萬平方公里,或者(人口超過2500萬並且gdp超過2000萬),那麼這個國家就是大國家。
編寫一個SQL查詢,輸出表中所有大國家的名稱、人口和麪積。
參考代碼:

  • 創建表
    CREATE TABLE World (
        name VARCHAR(50) NOT NULL,
        continent VARCHAR(50) NOT NULL,
        area INT NOT NULL,
        population INT NOT NULL,
        gdp INT NOT NULL
        );

– 插入數據

INSERT INTO World
  VALUES('Afghanistan','Asia',652230,25500100,20343000);
INSERT INTO World 
  VALUES('Albania','Europe',28748,2831741,12960000);
INSERT INTO World 
  VALUES('Algeria','Africa',2381741,37100000,188681000);
INSERT INTO World
  VALUES('Andorra','Europe',468,78115,3712000);
INSERT INTO World
  VALUES('Angola','Africa',1246700,20609294,100990000);

–查詢數據
查詢目標:name,population,area
查詢範圍:World表
查詢條件:面積超過300萬平方公里 或 人口超過2500萬

select
    name,
    population,
    area
from
    World
where
    area > 3000000 or population > 25000000
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章