mysql必知必會系列是本人在讀《mysql必知必會》中的筆記,方便自己以后查看。
MySQL、 Oracle以及Microsoft SQL Server等數據庫是基於客戶機—服務器的數據庫。客戶機—服務器應用分為兩個不同的部分。服務器部分是負責所有數據訪問和處理的一個軟件。這個軟件運行在稱為數據庫服務器的計算機上。
在處理SQL語句時,其中所有空格都被忽略,sql語句不分大小寫。
一、基本知識
- 數據庫(database) : 保存有組織的數據的容器(通常是一個文件或一組文件)。
- 表(table): 某種特定類型數據的結構化清單。
- 模式(schema):關於數據庫和表的布局及特性的信息。模式可以用來描述數據庫中特定的表以及整個數據庫(和其中表的關系)。如可以存儲什么樣的數據,數據如何分解,各部分信息如何命名等。
- 列(column):表中的一個字段。所有表都是由一個或多個列組成的。
- 行(row):表中的一個記錄。表中的數據是按行存儲的,所保存的每個記錄存儲在自己的行內。
- 數據類型(datatype):所容許的數據的類型。
- 每個表列都有相應的數據類型,它限制(或容許)該列中存儲的數據。數據類型還幫助正確地排序數據,並在優化磁盤使用方面起重要的作用。
- 主鍵(primary key):一列(或一組列),其值能夠唯一區分表中每個行,任意兩行都不具有相同的主鍵值。
主鍵規定:
每個行都必須具有一個主鍵值(主鍵列不允許NULL值)。
不更新主鍵列中的值;
不重用主鍵列的值;
不在主鍵列中使用可能會更改的值。
二、關於使用數據庫
- show databases;顯示所有數據庫
eg:show database;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| jachin |
+--------------------+
- use databasename; 打開數據庫,才能讀取其中內容
eg:use jachin; 使用jachin數據庫
- show tables; 獲得一個數據庫內的表的列表
eg:show tables;
+---------------+
| Tables_in_ssm |
+---------------+
| appointment |
| book |
+---------------+
- show columns from tablename; 要求給出一個表名 ,它對每個字段返回一行,行中包含字段名、數據類型、是否允許NULL、鍵信息、默認值以及其他信息(如auto_increment)
eg: show columns from book;
- help show ; 可以查看更多show的命令
三、 關於檢索
- select columnname from tablename; 檢索某表下的某列內容
- select columnname1,columnname2,columnname3 from tablename; 檢索某表下的某幾列內容
- select * from tablename; 檢索整個表
- select distinct columnname from tablename; 使用DISTINCT關鍵字,顧名思義,此關鍵字指示MySQL只返回不同的值
- select columnname from tablename limit 5; 此語句使用SELECT語句檢索單個列從第一個行開始不多於5行。
- select columnname from tablename limit 5,5; 指示MySQL返回從行5開始的5行。第一個數為開始位置,第二個數為要檢索的行數。
- LIMIT 4 OFFSET 3:limit的另一種表達,意為從行3開始取4行,就像LIMIT 3, 4一樣(注意: LIMIT 1, 1將檢索出第二行而不是第一行)。
1.完全限定
使用完全限定的名字來引用列(同時使用表名和列字)
- select tablename.columnname from tablename;
eg: select book.name from book; 一般來說功能和 select name from book; 是一樣的。
同理,表名也可以使用完全限定
- select tablename.columnname from databasename.tablename;
eg: select book.name from jachin.book;
2.排序
- select columnname from tablename order by columnname; ORDER BY子句取一個或多個列的名字,據此對輸出進行排序(ORDER BY(如從A到Z)順序排序,且用非檢索的列排序數據也是完全合法的)
- select columnname from tablename order by A,B; 按多個列進行排序(如果A是姓列,B是名列,首先按姓排序,然后在每個姓中再按名排序)
- order by ... DESC; 降序(從Z到A)排序,只應用到直接位於其前面的列名,如果想在多個列上進行降序排序, 必須對每個列指定DESC關鍵字,若不聲明DESC,則按默認的順序排序
eg:mysql> select * from book order by name ,number desc ;
+---------+--------+--------+
| book_id | name | number |
+---------+--------+--------+
| 1002 | c | 10 |
| 1003 | c++ | 10 |
| 1004 | c++ | 10 |
| 1005 | c++ | 8 |
| 1000 | Java | 8 |
| 1001 | python | 10 |
+---------+--------+--------+mysql> select * from book order by name desc ,number desc;
+---------+--------+--------+
| book_id | name | number |
+---------+--------+--------+
| 1001 | python | 10 |
| 1000 | Java | 8 |
| 1003 | c++ | 10 |
| 1004 | c++ | 10 |
| 1005 | c++ | 8 |
| 1002 | c | 10 |
+---------+--------+--------+
- select columnname from tablename order by columnname limit n; 如果使用LIMIT,它必須位於ORDER BY之后。
3.WHERE
只檢索所需數據需要指定搜索條件(search criteria),搜索條件也稱為過濾條件( filtercondition)。在SELECT語句中,數據根據WHERE子句中指定的搜索條件進行過濾。
WHERE子句在表名(FROM子句)之后給出:
select columnname from tablename where columnname=...;
在同時使用ORDER BY和WHERE子句時,應該讓ORDER BY位於WHERE之后:
select columnname1 from tablename where columnname1=... order by columnname2 desc;
eg:mysql> select * from book where name="c++" order by number desc ;
+---------+------+--------+
| book_id | name | number |
+---------+------+--------+
| 1003 | c++ | 10 |
| 1004 | c++ | 10 |
| 1005 | c++ | 8 |
+---------+------+--------+
為了檢查某個范圍的值,可使用BETWEEN操作符
select columnname1 from tablename where columnname1 between n and m;
eg: mysql> select * from book where number between 7 and 9 ;
+---------+------+--------+
| book_id | name | number |
+---------+------+--------+
| 1000 | Java | 8 |
| 1005 | c++ | 8 |
+---------+------+--------+
SELECT語句有一個特殊的WHERE子句,可用來檢查具有NULL值的列。這個WHERE子句就是IS NULL子句
select columnname1 from tablename where columnname2 is null;
4.操作符
用來聯結或改變WHERE子句中的子句的關鍵字。也稱為邏輯操作符( logicaloperator)如AND,OR等。
SQL(像多數語言一樣)在處理OR操作符前,優先處理AND操作符。用括號可消除因為圓括號具有較AND或OR操作符高的計算次序,由於AND和OR較簡單,不再詳寫。
IN操作符
- IN操作符用來指定條件范圍,范圍中的每個條件都可以進行匹配。 IN取合法值的由逗號分隔的清單,全都括在圓括號中。
- IN用來指定要匹配值的清單的關鍵字,功能與OR相當。
- 在使用長的合法選項清單時, IN操作符的語法更清楚且更直觀。
- 在使用IN時,計算的次序更容易管理(因為使用的操作符更少)。
- IN操作符一般比OR操作符清單執行更快。
- IN的最大優點是可以包含其他SELECT語句,使得能夠更動態地建立WHERE子句。
select columnname1 from tablename where columnname1 in (1,n);
selectcolumnname1 from tablename where columnname1=1,columnname1=2...,columnname1=n;以上兩句sql語句是等價的。
NOT操作符
WHERE子句中的NOT操作符有且只有一個功能,那就是否定它之后所跟的任何條件。
LIKE操作符
% 百分號表示任何字符出現任意次數
select columnname1 from tablename where columnname1 like "c%"; 可匹配任意以c開頭的字符串
注:WHERE name LIKE '%'不能匹配用值NULL的行_ 下划線的用途與%一樣,但下划線只匹配單個字符而不是多個字符。
select columnname1 from tablename where columnname1 like "c_"; 可匹配任意以c開頭且后面接着只有一個字符的字符串