數據庫命令語句:
1.修改表名:
語法: ALTER TABLE<舊錶名> RENAME [TO] <新表名>
2、添加字段:
語法:ALTER TABLE 表名 ADD 字段名 數據類型 [屬性]
3.修改字段:
語法ALTER TABLE 表名 CHANCE 原字段名 數據類型 [屬性]
4.刪除字段:
語法:ALTER TABLE 表名 DROP 字段名;
5.添加主鍵約束:
語法:ALTER TABLE 表名 ADD CONSTRAINT 主鍵名 PRIMARY KEY 表名(主鍵字段)
6.字段添加數據:
語法:INSERTT INTO [(字段名列表)] VALUES (值列名)
多行數據時值用逗號隔開:
INSERTT INTO [(字段名列表)] VALUES (值列名) (值列名),(值列名),,,,,
7.將查詢結果添加到新表:
語法:INSERT INTO 新表(字段1),(字段2,,,,)
SELECT 字段1,字段2,,,,,,
FROM
第二種方法
CREATE TABLE 新表 (SELECT 字段1,字段2,,,,,,FROM原表);
兩種方法的區別是方法一是在已創建表的情況下給表加數據方法二則是在沒有新表的情況下創建新表再把數據添加到新表裏
8.修改字段數據:
語法:UPDATE 表名 字段1=值1,字段2=值2.,,,,,WHERER 條件
9:刪除表中數據
語法:DELETE FROM 表名 WHERE 條件
第二種方法:刪除表中所有數據
TRUNCATE TABLE 表名
*注意*TRYNCATE語句實現刪除表中所有數據,刪除後將重置自增列,表結構及字段,約束,索引保持不變,比DELETE語句快
常用函數
聚合函數(aggregation function)—也就是組函數
在一個行的集合(一組行)上進行操作,對每個組給一個結果。
常用的組函數:
AVG([distinct] expr)
求平均值
COUNT({*|[distinct] } expr)
統計行的數量
MAX([distinct] expr)
求最大值
MIN([distinct] expr)
求最小值
SUM([distinct] expr)
求累加和
①每個組函數接收一個參數
②默認情況下,組函數忽略列值爲null的行,不參與計算
③有時,會使用關鍵字distinct剔除字段值重複的條數
注意:
1)當使用組函數的select語句中沒有group by子句時,中間結果集中的所有行自動形成一組,然後計算組函數;
2)組函數不允許嵌套,例如:count(max(…));
3)組函數的參數可以是列或是函數表達式;
4)一個SELECT子句中可出現多個聚集函數。
字符串函數:
字符串函數是MySQL中使用最頻繁的函數,主要用於處理數據庫中字符串類型的數據。表10-2列出了MySQL中常用的字符串函數及其功能。
LENGTH(str),CHAR_LENGTH(str)
返回字符串長度或字符個數
CONCAT(str1,str2…strn),CONCAT_WS(x,str1,str2…strn)
合併字符串
INSERT(str,x,y,instr),REPLACE(str,a,b)
替換字符串
LOWER(str),UPPER(str)
字符大小寫轉換
LEFT(str,x),RIGHT(str,x),SUBSTRING(str,x,y)
獲取字符串的一部分
LPAD(str1,n,str2),RPAD(str1,n,str2)
填充字符串
LTRIM(str),RTRIM(str),TRIM(str)
刪除字符串左側、右側或兩側空格
REPEAT(str,n)
返回字符串str重複n次的結果
LOCATE(str1,str)
返回子字符串的開始位置
REVERSE(str)
反轉字符串
日期與時間函數:
在實際應用中,有時可能會遇到這樣的需求:獲取當前時間,或者下個月的今天是星期幾,等等類似的問題。這些需求就需要使用日期與時間函數來實現。表10-3列出了MySQL中常用的日期與時間函數及其功能。
CURDATE()
獲取當前日期
CURTIME()
獲取當前時間
NOW()
獲取當前的日期和時間
UNIX_TIMESTAMP(date)
獲取日期date的UNIX時間戳
YEAR(d),MONTH(d),WEEK(d),DAY(d),HOUR(d),MINUTE(d),SECOND(d)
返回指定日期的年份、月份、星期、日、時、分和秒
DATE_FORMAT(d,format)
按format指定的格式顯示日期d的值
ADDDATE(date,INTERVAL expr unit),
SUBDATE(date,INTERVAL expr unit)
獲取一個日期或時間值加上一個時間間隔的時間值
TIME_TO_SEC(d),SEC_TO_TIME(d)
獲取將“HH:MM:SS”格式的時間換算爲秒,或將秒數換算爲“HH:MM:SS”格式的值
數學函數
數學函數主要用於處理數字,包括整型和浮點數。下面介紹一下常用的幾個數學函數。
ABS()函數
ABS()可以求出某字段值的絕對值。
FLOOR()函數
FLOOR()函數用於返回小於或等於參數x的最大整數。
RAND()函數
RAND()函數用於返回0~1之間的隨機數。
TRUNCATE(x, y)函數
TRUNCATE(x, y)函數返回x保留到小數點後y位的值。
SQRT(x)函數
SQRT(x)函數用於求參數x的平方根。
子查詢:
子查詢在 WHERE 中的語法格式如下:
WHERE <表達式> <操作符> (子查詢)
其中,操作符可以是比較運算符和 IN、NOT IN、EXISTS、NOT EXISTS 等關鍵字。
1)IN | NOT IN
當表達式與子查詢返回的結果集中的某個值相等時,返回 TRUE,否則返回 FALSE;若使用關鍵字 NOT,則返回值正好相反。
2)EXISTS | NOT EXISTS
用於判斷子查詢的結果集是否爲空,若子查詢的結果集不爲空,返回 TRUE,否則返回 FALSE;若使用關鍵字 NOT,則返回的值正好相反。
例 1
使用子查詢在 tb_students_info 表和 tb_course 表中查詢學習 Java 課程的學生姓名,SQL 語句和運行結果如下。
mysql> SELECT name FROM tb_students_info
-> WHERE course_id IN (SELECT id FROM tb_course WHERE course_name = 'Java');
+-------+
| name |
+-------+
| Dany |
| Henry |
+-------+
2 rows in set (0.01 sec)
結果顯示,學習 Java 課程的只有 Dany 和 Henry。上述查詢過程也可以分爲以下 2 步執行,實現效果是相同的。
1)首先單獨執行內查詢,查詢出 tb_course 表中課程爲 Java 的 id,SQL 語句和運行結果如下。
mysql> SELECT id FROM tb_course
-> WHERE course_name = 'Java';
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00 sec)
可以看到,符合條件的 id 字段的值爲 1。
2)然後執行外層查詢,在 tb_students_info 表中查詢 course_id 等於 1 的學生姓名。SQL 語句和運行結果如下。
mysql> SELECT name FROM tb_students_info
-> WHERE course_id IN (1);
+-------+
| name |
+-------+
| Dany |
| Henry |
+-------+
2 rows in set (0.00 sec)
習慣上,外層的 SELECT 查詢稱爲父查詢,圓括號中嵌入的查詢稱爲子查詢(子查詢必須放在圓括號內)。MySQL 在處理上例的 SELECT 語句時,執行流程爲:先執行子查詢,再執行父查詢。
例 2
與例 1 類似,在 SELECT 語句中使用 NOT IN 關鍵字,查詢沒有學習 Java 課程的學生姓名,SQL 語句和運行結果如下。
mysql> SELECT name FROM tb_students_info
-> WHERE course_id NOT IN (SELECT id FROM tb_course WHERE course_name = 'Java');
+--------+
| name |
+--------+
| Green |
| Jane |
| Jim |
| John |
| Lily |
| Susan |
| Thomas |
| Tom |
| LiMing |
+--------+
9 rows in set (0.01 sec)
可以看出,運行結果與例 1 剛好相反,沒有學習 Java 課程的是除了 Dany 和 Henry 之外的學生。
例 3
使用=運算符,在 tb_course 表和 tb_students_info 表中查詢出所有學習 Python 課程的學生姓名,SQL 語句和運行結果如下。
mysql> SELECT name FROM tb_students_info
-> WHERE course_id = (SELECT id FROM tb_course WHERE course_name = 'Python');
+------+
| name |
+------+
| Jane |
+------+
1 row in set (0.00 sec)
結果顯示,學習 Python 課程的學生只有 Jane。
例 4
使用<>運算符,在 tb_course 表和 tb_students_info 表中查詢出沒有學習 Python 課程的學生姓名,SQL 語句和運行結果如下。
mysql> SELECT name FROM tb_students_info
-> WHERE course_id <> (SELECT id FROM tb_course WHERE course_name = 'Python');
+--------+
| name |
+--------+
| Dany |
| Green |
| Henry |
| Jim |
| John |
| Lily |
| Susan |
| Thomas |
| Tom |
| LiMing |
+--------+
10 rows in set (0.00 sec)
可以看出,運行結果與例 3 剛好相反,沒有學習 Python 課程的是除了 Jane 之外的學生。
例 5
查詢 tb_course 表中是否存在 id=1 的課程,如果存在,就查詢出 tb_students_info 表中的記錄,SQL 語句和運行結果如下。
mysql> SELECT * FROM tb_students_info
-> WHERE EXISTS(SELECT course_name FROM tb_course WHERE id=1);
+----+--------+------+------+--------+-----------+
| id | name | age | sex | height | course_id |
+----+--------+------+------+--------+-----------+
| 1 | Dany | 25 | 男 | 160 | 1 |
| 2 | Green | 23 | 男 | 158 | 2 |
| 3 | Henry | 23 | 女 | 185 | 1 |
| 4 | Jane | 22 | 男 | 162 | 3 |
| 5 | Jim | 24 | 女 | 175 | 2 |
| 6 | John | 21 | 女 | 172 | 4 |
| 7 | Lily | 22 | 男 | 165 | 4 |
| 8 | Susan | 23 | 男 | 170 | 5 |
| 9 | Thomas | 22 | 女 | 178 | 5 |
| 10 | Tom | 23 | 女 | 165 | 5 |
| 11 | LiMing | 22 | 男 | 180 | 7 |
+----+--------+------+------+--------+-----------+
11 rows in set (0.01 sec)
由結果可以看到,tb_course 表中存在 id=1 的記錄,因此 EXISTS 表達式返回 TRUE,外層查詢語句接收 TRUE 之後對錶 tb_students_info 進行查詢,返回所有的記錄。
EXISTS 關鍵字可以和其它查詢條件一起使用,條件表達式與 EXISTS 關鍵字之間用 AND 和 OR 連接。
例 6
查詢 tb_course 表中是否存在 id=1 的課程,如果存在,就查詢出 tb_students_info 表中 age 字段大於 24 的記錄,SQL 語句和運行結果如下。
mysql> SELECT * FROM tb_students_info
-> WHERE age>24 AND EXISTS(SELECT course_name FROM tb_course WHERE id=1);
+----+------+------+------+--------+-----------+
| id | name | age | sex | height | course_id |
+----+------+------+------+--------+-----------+
| 1 | Dany | 25 | 男 | 160 | 1 |
+----+------+------+------+--------+-----------+
1 row in set (0.01 sec)
結果顯示,從 tb_students_info 表中查詢出了一條記錄,這條記錄的 age 字段取值爲 25。內層查詢語句從 tb_course 表中查詢到記錄,返回 TRUE。外層查詢語句開始進行查詢。根據查詢條件,從 tb_students_info 表中查詢 age 大於 24 的記錄。
拓展
子查詢的功能也可以通過表連接完成,但是子查詢會使 SQL 語句更容易閱讀和編寫。