深入浅出mysql-sql基础
本圖根據(jù)深入淺出mysql 整理
2.sql 基礎(chǔ)
2.1 SQL 簡(jiǎn)介
2.2.1 SQL 分類(lèi)
DDL(Data Definition Languages)語(yǔ)句:
數(shù)據(jù)定義語(yǔ)言,這些語(yǔ)句定義了不同的數(shù)據(jù)段、數(shù)據(jù)庫(kù)、表、列、索引等數(shù)據(jù)庫(kù)對(duì)象的定義。常用的語(yǔ)句關(guān)鍵字主要包括 create、drop、alter等
?DML(Data Manipulation Language)語(yǔ)句 :
數(shù)據(jù)操縱語(yǔ)句,用于添加、刪除、更新和查詢數(shù)據(jù)庫(kù)記錄,并檢查數(shù)據(jù)完整性,常用的語(yǔ)句關(guān)鍵字主要包括insert、delete、udpate 和select 等。
DCL(Data Control Language)語(yǔ)句:
數(shù)據(jù)控制語(yǔ)句,用于控制不同數(shù)據(jù)段直接的許可和訪問(wèn)級(jí)別的語(yǔ)句。這些語(yǔ)句定義了數(shù)據(jù)庫(kù)、表、字段、用戶的訪問(wèn)權(quán)限和安全級(jí)別。主要的語(yǔ)句關(guān)鍵字包括 grant、revoke 等。
2.2.2 DDL 語(yǔ)句
是什么
DDL 是數(shù)據(jù)定義語(yǔ)言的縮寫(xiě),簡(jiǎn)單來(lái)說(shuō),就是對(duì)數(shù)據(jù)庫(kù)內(nèi)部的對(duì)象進(jìn)行創(chuàng)建、刪除、修改的操作語(yǔ)言。
1.創(chuàng)建數(shù)據(jù)庫(kù)
語(yǔ)法
CREATE DATABASE dbname
例子
例如,創(chuàng)建數(shù)據(jù)庫(kù) test1,命令執(zhí)行如下:
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)
查看數(shù)據(jù)庫(kù)
語(yǔ)法
show databases;
范例
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cluster |
| mysql |
| test |
| test1 |
+--------------------+
5 rows in set (0.00 sec)
2 刪除數(shù)據(jù)庫(kù)
語(yǔ)法
drop database dbname;
范例
例如,要?jiǎng)h除 test1 數(shù)據(jù)庫(kù)可以使用以下語(yǔ)句:
mysql> drop database test1;
Query OK, 0 rows affected (0.00 sec)
3 創(chuàng)建表
語(yǔ)法
CREATE TABLE tablename (column_name_1 column_type_1 constraints,
column_name_2? column_type_2? constraints ,?
……
column_name_n? column_type_n constraints)
因?yàn)?MySQL 的表名是以目錄的形式存在于磁盤(pán)上,所以表名的字符可以用任何目錄名允許的字符。column_name 是列的名字,column_type 是列的數(shù)據(jù)類(lèi)型,contraints 是這個(gè)列的約束條件,在后面的章節(jié)中會(huì)詳細(xì)介紹。
范例
例如,創(chuàng)建一個(gè)名稱(chēng)為 emp 的表。表中包括 3 個(gè)字段,ename(姓名),hiredate(雇用日期)、sal(薪水),字段類(lèi)型分別為varchar(10)、date、int(2)(關(guān)于字段類(lèi)型將會(huì)在下一章中介紹):
mysql> create table emp(ename varchar(10),
hiredate date,
sal decimal(10,2),
deptno int(2));
Query OK, 0 rows affected (0.02 sec)
表創(chuàng)建完畢后,如果需要查看一下表的定義,可以使用如下命令:
DESC tablename
例如,查看 emp 表,將輸出以下信息:
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(10) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
雖然 desc 命令可以查看表定義,但是其輸出的信息還是不夠全面,為了查看更全面的表定義信息,有時(shí)就需要通過(guò)查看創(chuàng)建表的 SQL 語(yǔ)句來(lái)得到,可以使用如下命令實(shí)現(xiàn):
mysql> show create table emp \G;
*************************** 1. row ***************************
Table: emp
Create Table: CREATE TABLE `emp` (
`ename` varchar(20) DEFAULT NULL,
`hiredate` date DEFAULT NULL,
`sal` decimal(10,2) DEFAULT NULL,
`deptno` int(2) DEFAULT NULL,
KEY `idx_emp_ename` (`ename`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.02 sec)
ERROR:
No query specified
4 刪除表
語(yǔ)法
DROP TABLE tablename
范例
例如,要?jiǎng)h除數(shù)據(jù)庫(kù) emp 可以使用以下命令:
mysql> drop table emp;
Query OK, 0 rows affected (0.00 sec)
5.修改表
(1) 修改表類(lèi)型
語(yǔ)法
ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
范例
例如,修改表 emp 的 ename 字段定義,將 varchar(10)改為 varchar(20):
mysql> alter table emp modify ename varchar(20);
Query OK, 0 rows affected (0.03 sec)
2) 增加表字段
語(yǔ)法
ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name]
范例
mysql> alter table emp add column age int(3);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
(3)刪除表字段
語(yǔ)法
ALTER TABLE tablename DROP [COLUMN] col_name
范例
例如,將字段 age 刪除掉:
mysql> alter table emp drop column age;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
(4)字段改名
語(yǔ)法
ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition
[FIRST|AFTER col_name]
范例
例如,將 age 改名為 age1,同時(shí)修改字段類(lèi)型為 int(4):
mysql> alter table emp change age age1 int(4) ;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
(5)修改字段排列順序。
語(yǔ)法
前面介紹的的字段增加和修改語(yǔ)法(ADD/CNAHGE/MODIFY)中,都有一個(gè)可選項(xiàng) first|after column_name,這個(gè)選項(xiàng)可以用來(lái)修改字段在表中的位置
范例
修改字段 age,將它放在最前面:
mysql> alter table emp modify age int(3) first;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings:?
(6)表改名
語(yǔ)法
ALTER TABLE tablename RENAME [TO] new_tablename
范例
例如,將表 emp 改名為 emp1,命令如下:
mysql> alter table emp rename emp1;
Query OK, 0 rows affected (0.00 sec)
2.2.3 DML 語(yǔ)句
1 .插入記錄
語(yǔ)法
INSERT INTO tablename (field1,field2,……fieldn) VALUES(value1,value2,……valuesn);
可以一次性插入多條記錄:
INSERT INTO tablename (field1, field2,……fieldn)
VALUES
(record1_value1, record1_value2,……record1_valuesn),
(record2_value1, record2_value2,……record2_valuesn),
……
(recordn_value1, recordn_value2,……recordn_valuesn)
;
范例
例如,向表 emp 中插入以下記錄:ename 為 zzx1,hiredate 為 2000-01-01,sal 為 2000,deptno為 1,命令執(zhí)行如下:
mysql> insert into emp (ename,hiredate,sal,deptno) values('zzx1','2000-01-01','2000',1);
Query OK, 1 row affected (0.00 sec)
一次性插入多條記錄,對(duì)表 dept 一次插入兩條記錄:
mysql> insert into dept values(5,'dept5'),(6,'dept6');
Query OK, 2 rows affected (0.04 sec)
Records: 2 Duplicates: 0 Warnings: 0
2 .更新記錄
語(yǔ)法
UPDATE tablename SET field1=value1,field2=value2,……fieldn=valuen [WHERE CONDITION]
更新多個(gè)表中數(shù)據(jù):UPDATE t1,t2…tn set t1.field1=expr1,tn.fieldn=exprn [WHERE CONDITION]
范例
例如,將表 emp 中 ename 為“l(fā)isa”的薪水(sal)從 3000 更改為 4000:
mysql> update emp set sal=4000 where ename='lisa';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
同時(shí)更新表 emp 中的字段 sal 和表 dept 中的字段 deptname:
mysql>? update? emp? a,dept b? set? a.sal=a.sal*b.deptno,b.deptname=a.ename? where
a.deptno=b.deptno;
Query OK, 3 rows affected (0.04 sec)
Rows matched: 5 Changed: 3 Warnings: 0
3 .刪除記錄
語(yǔ)法
DELETE FROM tablename [WHERE CONDITION]
一次刪除多個(gè)表的數(shù)據(jù)
DELETE t1,t2…tn FROM t1,t2…tn [WHERE CONDITION]
范例
例如,在 emp 中將 ename 為‘dony’的記錄全部刪除,命令如下:
mysql> delete from emp where ename='dony';
Query OK, 1 row affected (0.00 sec)
將表 emp 和 dept 中 deptno 為 3 的記錄同時(shí)都刪除:
mysql> delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=3;
Query OK, 2 rows affected (0.04 sec)
4 .查詢記錄
基本語(yǔ)法
SELECT * FROM tablename [WHERE CONDITION]
(1)查詢不重復(fù)的記錄。
語(yǔ)法
可以用 distinct 關(guān)鍵字來(lái)實(shí)現(xiàn)
范例
mysql> select ename,hiredate,sal,deptno from emp;
+--------+------------+---------+--------+
| ename | hiredate | sal | deptno |
+--------+------------+---------+--------+
| zzx | 2000-01-01 | 2000.00 | 1 |
| lisa | 2003-02-01 | 4000.00 | 2 |
| bjguan | 2004-04-02 | 5000.00 | 1 |
+--------+------------+---------+--------+
3 rows in set (0.00 sec)
mysql> select distinct deptno from emp;
+--------+
| deptno |
+--------+
| 1 |
| 2 |
+--------+
2 rows in set (0.00 sec)
(2)條件查詢。
(3)排序和限制。
語(yǔ)法
SELECT * FROM tablename [WHERE CONDITION] [ORDER BY field1 [DESC|ASC],field2 [DESC|ASC],……fieldn [DESC|ASC]]
其中,DESC 和 ASC 是排序順序關(guān)鍵字,DESC 表示按照字段進(jìn)行降序排列,ASC 則表示升序排列,如果不寫(xiě)此關(guān)鍵字默認(rèn)是升序排列
SELECT ……[LIMIT offset_start,row_count]
其中 offset_start 表示記錄的起始偏移量,row_count 表示顯示的行數(shù)。
(4)聚合。
語(yǔ)法
SELECT [field1,field2,……fieldn] fun_name
FROM tablename
[WHERE where_contition]
[GROUP BY field1,field2,……fieldn
[WITH ROLLUP]]
[HAVING where_contition]
? fun_name 表示要做的聚合操作,也就是聚合函數(shù),常用的有 sum(求和)、count(*)(記
錄數(shù))、max(最大值)、min(最小值)。
? GROUP BY 關(guān)鍵字表示要進(jìn)行分類(lèi)聚合的字段,比如要按照部門(mén)分類(lèi)統(tǒng)計(jì)員工數(shù)量,部門(mén)
就應(yīng)該寫(xiě)在 group by 后面。
? WITH ROLLUP 是可選語(yǔ)法,表明是否對(duì)分類(lèi)聚合后的結(jié)果進(jìn)行再匯總。
? HAVING 關(guān)鍵字表示對(duì)分類(lèi)后的結(jié)果再進(jìn)行條件的過(guò)濾。
范例
要 emp 表中統(tǒng)計(jì)公司的總?cè)藬?shù):
mysql> select count(1) from emp;
+----------+
| count(1) |
+----------+
| 4 |
+----------+
1 row in set (0.00 sec)
要統(tǒng)計(jì)各個(gè)部門(mén)的人數(shù):
mysql> select deptno,count(1) from emp group by deptno;
+--------+----------+
| deptno | count(1) |
+--------+----------+
| 1 | 2 |
| 2 | 1 |
| 4 | 1 |
+--------+----------+
3 rows in set (0.00 sec)
更細(xì)一些,既要統(tǒng)計(jì)各部門(mén)人數(shù),又要統(tǒng)計(jì)總?cè)藬?shù):
mysql> select deptno,count(1) from emp group by deptno with rollup;
+--------+----------+
| deptno | count(1) |
+--------+----------+
| 1 | 2 |
| 2 | 1 |
| 4 | 1 |
| NULL | 4 |
+--------+----------+
4 rows in set (0.00 sec)
(5)表連接。
內(nèi)連接
范例
例如,查詢出所有雇員的名字和所在部門(mén)名稱(chēng),因?yàn)楣蛦T名稱(chēng)和部門(mén)分別存放在表 emp 和dept 中,因此,需要使用表連接來(lái)進(jìn)行查詢:
mysql> select ename,deptname from emp,dept where emp.deptno=dept.deptno;
+--------+----------+
| ename | deptname |
+--------+----------+
| zzx | tech |
| lisa | sale |
| bjguan | tech |
| bzshen | hr |
+--------+----------+
4 rows in set (0.00 sec)
外連接
?左連接:包含所有的左邊表中的記錄甚至是右邊表中沒(méi)有和它匹配的記錄
范例
查詢 emp 中所有用戶名和所在部門(mén)名稱(chēng):
mysql> select ename,deptname from emp left join dept on emp.deptno=dept.deptno;
+--------+----------+
| ename | deptname |
+--------+----------+
| zzx | tech |
| lisa | sale |
| bjguan | tech |
| bzshen | hr |
| dony | |
+--------+----------+
5 rows in set (0.00 sec)
比較這個(gè)查詢和上例中的查詢,都是查詢用戶名和部門(mén)名,兩者的區(qū)別在于本例中列出了所有的用戶名,即使有的用戶名(dony)并不存在合法的部門(mén)名稱(chēng)(部門(mén)號(hào)為 4,在 dept 中沒(méi)有這個(gè)部門(mén));而上例中僅僅列出了存在合法部門(mén)的用戶名和部門(mén)名稱(chēng)。
右連接:包含所有的右邊表中的記錄甚至是左邊表中沒(méi)有和它匹配的記錄
(6)子查詢。
語(yǔ)法
某些情況下,當(dāng)我們查詢的時(shí)候,需要的條件是另外一個(gè) select 語(yǔ)句的結(jié)果,這個(gè)時(shí)候,就要用到子查詢。用于子查詢的關(guān)鍵字主要包括 in、not in、=、!=、exists、not exists 等
范例
mysql> select * from emp where deptno = (select deptno from dept);
mysql> select * from emp where deptno in(select deptno from dept);
(7)記錄聯(lián)合。
語(yǔ)法
SELECT * FROM t1
UNION|UNION ALL
SELECT * FROM t2
……
UNION|UNION ALL
SELECT * FROM tn;
范例
mysql> select deptno from emp
-> union all
-> select deptno from dept;
+--------+
| deptno |
+--------+
| 1 |
| 2 |
| 1 |
| 4 |
| 1 |
| 2 |
| 5 |
+--------+
如果希望將結(jié)果去掉重復(fù)記錄后顯示:
mysql> select deptno from emp
-> union
-> select deptno from dept;
+--------+
| deptno |
+--------+
| 1 |
| 2 |
| 4 |
| 5 |
+--------+
4 rows in set (0.00 sec)
2.2.4 DCL 語(yǔ)句
是什么
DCL 語(yǔ)句主要是 DBA 用來(lái)管理系統(tǒng)中的對(duì)象權(quán)限時(shí)所使用,一般的開(kāi)發(fā)人員很少使用
范例
創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)用戶 z1,具有對(duì) sakila 數(shù)據(jù)庫(kù)中所有表的 SELECT/INSERT 權(quán)限:
mysql> grant select,insert on sakila.* to 'z1'@'localhost' identified by '123';
Query OK, 0 rows affected (0.00 sec)
由于權(quán)限變更,需要將 z1 的權(quán)限變更,收回 INSERT,只能對(duì)數(shù)據(jù)進(jìn)行 SELECT 操作:
[mysql@db3 ~]$ mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 21757 to server version: 5.1.9-beta-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> revoke insert on sakila.* from 'z1'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye
2.3 幫助的使用
2.3.1 按照層次看幫助
按照層次看幫助
“? contents” 命令 用來(lái)顯示所有可供查詢的分類(lèi),對(duì)于列出的分類(lèi) ,可以 使用 “? 類(lèi)別名稱(chēng)”進(jìn)一步查看幫助。
2.3.2 快速查閱幫助
可以使用關(guān)鍵字進(jìn)行快速查詢
例如,想知道 show 命令都能看些什么東西,可以用如下命令:
mysql> ? show
Name: 'SHOW'
Description:
SHOW has many forms that provide information about databases, tables,
columns, or status information about the server. This section describes
those following:
SHOW AUTHORS
SHOW CHARACTER SET [LIKE 'pattern']
SHOW COLLATION [LIKE 'pattern']
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern']
SHOW CONTRIBUTORS
SHOW CREATE DATABASE db_name
SHOW CREATE EVENT event_name
SHOW CREATE FUNCTION funcname
總結(jié)
以上是生活随笔為你收集整理的深入浅出mysql-sql基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: antd表格显示分页怎么取消_真相!Wo
- 下一篇: mysql 左连接 怎么走索引_mysq