mysql-3 數據表的創建、增刪改查


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;
## 14.having一般跟在group by之后,執行記錄組選擇的一部分工作的 例如列出登陸次數大於2次。如果使用where 登陸次數 > 3,會因為表中沒有“登陸次數”這列而報錯,因為where只能對表中原有的列進行篩選。如果對group by生成的列篩選,需要用使having ```#sql select COALESCE(name,"合計"),count(*) as 登陸次數 from employee_tbl group by name having 登陸次數 > 2; ``` ![圖片保持原比例](https://img2018.cnblogs.com/blog/1418970/201811/1418970-20181108232248946-2118820789.png)

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;

結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM