1.創建數據表
通用語法:CREATE TABLE table_name (column_name column_type);
CREATE TABLE IF NOT EXISTS `csj_tbl`(
`csj_id` INT UNSIGNED AUTO_INCREMENT,
`csj_title` VARCHAR(100) NOT NULL,
`csj_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `csj_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 如果你不想字段為 NULL 可以設置字段的屬性為 NOT NULL, 在操作數據庫時如果輸入該字段的數據為NULL ,就會報錯。
- AUTO_INCREMENT定義列為自增的屬性,一般用於主鍵,數值會自動加1。
- PRIMARY KEY關鍵字用於定義列為主鍵。 您可以使用多列來定義主鍵,列間以逗號分隔。
- ENGINE 設置存儲引擎,CHARSET 設置編碼。不設置utf-8,輸入中文會出現展示問題。
- 表名和字段名外面的符號是反單引 ` ,不是單引號。
2.刪除數據表
刪除數據表有3種情況。
類型 | 內容 | 空間 |
---|---|---|
drop | 刪除表結構和全部數據 | 立刻釋放磁盤空間,包括Innodb和MylSAM |
truncate | 保留表結構,刪除全部數據 | 立刻釋放磁盤空間,包括Innodb和MylSAM |
delete | 保留表結構,刪除指定的數據 | MyISAM會立刻釋放磁盤空間,InnoDB不會釋放空間。執行delete后,使用optimize table table_name會釋放全部磁盤空間 |
drop table table_name;
drop table csj_tbl; #刪除表
truncate table csj_tbl; #刪除全部數據
delete from student; #刪除全部數據
delete from student where name="tom"; #刪除張三的數據
3.插入數據
語法:INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
#指定行添加
insert into csj_tbl (csj_title,csj_author,submission_date)
values("學習 java","菜鳥教程",NOW());
#不指定行添加
insert into csj_tbl
values(2,"學習 python","菜鳥教程",'2016-03-06');
#添加多行數據
insert into csj_tbl (csj_title,csj_author,submission_date) values
("學習 php","廖雪峰",NOW()),
("學習 c++","菜鳥教程",NOW());
select * from csj_tbl;
select * from csj_tbl;
不指明列,會將數據依次插入到每列。此時要將每個數值全部寫入,即使自增的數據,也不能省略。
4.mysql查詢數據
語法:
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
- 查詢語句中你可以使用一個或者多個表,表之間使用逗號(,)分割,並使用WHERE語句來設定查詢條件。
- SELECT 命令可以讀取一條或者多條記錄。
- 你可以使用星號(*)來代替其他字段,SELECT語句會返回表的所有字段數據
- 你可以使用 WHERE 語句來包含任何條件。
- 你可以使用 LIMIT 屬性來設定返回的記錄數。
- 你可以通過OFFSET指定SELECT語句開始查詢的數據偏移量。默認情況下偏移量為0
select * from csj_tbl where csj_author="菜鳥教程" LIMIT 2;
5.where字句,設定查詢條件
where 條件1 and|or 條件2
- 查詢語句中你可以使用一個或者多個表,表之間使用逗號, 分割,並使用WHERE語句來設定查詢條件。
- 你可以在 WHERE 子句中指定任何條件。
- 你可以使用 AND 或者 OR 指定一個或多個條件。
- WHERE 子句也可以運用於 SQL 的 DELETE 或者 UPDATE 命令。
- WHERE 子句類似於程序語言中的 if 條件,根據 MySQL 表中的字段值來讀取指定的數據。
條件中可以使用操作符
select * from csj_tbl where (csj_author="菜鳥教程" ) and (csj_id = 2 );
6.修改數據update
語法:
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
- 你可以同時更新一個或多個字段。
- 你可以在 WHERE 子句中指定任何條件。
- 你可以在一個單獨表中同時更新數據。
update csj_tbl set csj_author="菜鳥教程2" where csj_id=2;
#修改日期類型數據
UPDATE ACCOUNT_USER set CREATE_TIME=TO_DATE('2018-11-28 09:38:26','yyyy-mm-dd hh24:mi:ss') where id = 'C803' ;
commit;
7.delete
語法:DELETE FROM table_name [WHERE Clause]
- 如果沒有指定 WHERE 子句,MySQL 表中的所有記錄將被刪除。
- 你可以在 WHERE 子句中指定任何條件
- 您可以在單個表中一次性刪除記錄。
delete from csj_tbl WHERE csj_id=1;
8.like字句
WHERE 子句中可以使用等號 = 來設定獲取數據的條件,如 "runoob_author = 'RUNOOB.COM'"。
但是有時候我們需要獲取 runoob_author 字段含有 "COM" 字符的所有記錄,這時我們就需要在 WHERE 子句中使用 SQL LIKE 子句。
SQL LIKE 子句中使用百分號 %字符來表示任意字符,類似於UNIX或正則表達式中的星號 *。
如果沒有使用百分號 %, LIKE 子句與等號 = 的效果是一樣的。
語法:
SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
- 你可以在 WHERE 子句中指定任何條件。
- 你可以在 WHERE 子句中使用LIKE子句。
- 你可以使用LIKE子句代替等號 =。
- LIKE 通常與 % 一同使用,類似於一個元字符的搜索。
- 你可以使用 AND 或者 OR 指定一個或多個條件。
- 你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句來指定條件。
9.union操作符
MySQL UNION 操作符用於連接兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重復的數據。
語法:
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
#example
#注意:使用union,會自動使用第一個表的列名為列名,排序也只能對列1進行排序。
SELECT 列名稱1 FROM 表名稱1 UNION SELECT 列名稱2 FROM 表名稱2 ORDER BY 列名稱1;
SELECT 列名稱1 FROM 表名稱1 UNION ALL SELECT 列名稱2 FROM 表名稱2 ORDER BY 列名稱1;
- expression1, expression2, ... expression_n: 要檢索的列。
- tables: 要檢索的數據表。
- WHERE conditions: 可選, 檢索條件。
- DISTINCT: 可選,刪除結果集中重復的數據。默認情況下 UNION 操作符已經刪除了重復數據,所以 DISTINCT 修飾符對結果沒啥影響。
- ALL: 可選,返回所有結果集,包含重復數據。
select csj_author from csj_tbl UNION
select name from student;
10.排序
語法:
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
- 你可以使用任何字段來作為排序的條件,從而返回排序后的查詢結果。
- 你可以設定多個字段來排序。
- 你可以使用 ASC 或 DESC 關鍵字來設置查詢結果是按升序或降序排列。 默認情況下,它是按升序排列。
- 你可以添加 WHERE...LIKE 子句來設置條件。
select * from csj_tbl order by csj_id desc;
#如果字符集采用的是 utf8(萬國碼),需要先對字段進行轉碼然后排序:
select * from csj_tbl order by CONVERT(csj_author using gbk) desc;
#如果字符集采用的是 gbk(漢字編碼字符集),直接在查詢語句后邊添加 ORDER BY:
select * from csj_tbl order by csj_author desc;
11.mysql分組
GROUP BY 語句根據一個或多個列對結果集進行分組。
在分組的列上我們可以使用 COUNT, SUM, AVG,等函數。
GROUP BY 語法
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
准備數據
#創建表
DROP TABLE IF EXISTS `employee_tbl`;
CREATE TABLE `employee_tbl` (
`id` int(11) NOT NULL,
`name` char(10) NOT NULL DEFAULT '',
`date` datetime NOT NULL,
`singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登錄次數',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#插入數據
INSERT INTO `employee_tbl` VALUES ('1', '小明', '2016-04-22 15:25:33', '1'), ('2', '小王', '2016-04-20 15:25:47', '3'), ('3', '小麗', '2016-04-19 15:26:02', '2'), ('4', '小王', '2016-04-07 15:26:14', '4'), ('5', '小明', '2016-04-11 15:26:40', '4'), ('6', '小明', '2016-04-04 15:26:54', '2');
commit;
set foregin_key_checks=1;
set names utf8;
#使用group by語句將數據表按名字進行分組,並統計每個人有多少條記錄
select name,count(*) from employee_tbl group by name;
#對name進行分組,只會打印每個name下的第一條信息
select * from employee_tbl group by name;
#按name分組,並統計不同name下的的行數
select count(*) from employee_tbl group by name;
12.with rollup 可以在group by的基礎上再進行統計
select * from employee_tbl;
select name,count(*) from employee_tbl group by name with ROLLUP;
select name,SUM(singin),count(*),AVG(singin) from employee_tbl GROUP BY name WITH ROLLUP;

13.coalesce設置取代null的名稱
語法:
select coalesce(a,b,c);
示例:
select COALESCE(name,"合計"),count(*) as 登陸次數 from employee_tbl group by name with ROLLUP;
select COALESCE(name,"合計") as name,SUM(singin),count(*),AVG(singin) from employee_tbl GROUP BY name WITH ROLLUP;

FAQ
1.修改數據后,是否需要commit
#執行sql命令
show VARIABLES like '%autocommit%';
#如果是OFF即不自動commit,需要手動commit操作(命令行可以直接“commit;“命令),否則是自動commit。
2. foreign_key_checks;在mysql中設置外鍵約束
mysql中如果表和表之間建立了外鍵約束,則無法刪除表以及修改表結構。
解決辦法是在mysql中取消外鍵約束:set foregin_key_checks=0;
然后將原來表的數據導出到sql語句,重新創建此表后,再把數據使用sql導入。
然后再設置外鍵約束。 set foregin_key_checks=1;
3.使用distinct和group by去重的區別
distinct:
- distinct必須在所有列的前面
- distinct會針對列依次去重
group by: - 只能針對單列進行分組,不能在group by后面跟多個列
- 可以在去重的結果上進行運算
#distinct去重
select * from csj_tbl;
select DISTINCT csj_author from csj_tbl;
select DISTINCT csj_author,submission_date from csj_tbl;
select DISTINCT csj_author,submission_date,csj_id from csj_tbl;
#group by 分組
select * from employee_tbl;
select * from employee_tbl group by name;
select name,SUM(singin),count(*),AVG(singin) from employee_tbl GROUP BY name;
結果: