又学MySQL
又學MySQL
一、數據庫的基本操作
1.1、啟動
net start mysql -- 啟動1.2、斷開
net stop mysql -- 斷開1.3、連接
mysql -uroot -p -- 連接數據庫 Enter password:******1.4、退出
exit -- 退出1.5、創建數據庫
create database 數據庫名;-- 例如,創建一個叫db1的數據庫 show create database db1;1.6、刪除數據庫
drop datebase 數據庫名-- 例如,刪除db1數據庫 drop database db1;1.7、切換數據庫
use 數據庫名-- 例如,使用db1數據庫 use db1;1.8、查詢出MySQL中所有的數據庫
show databases;1.9、查看當前使用的數據庫
select database();二、數據表的基本操作
2.1、創建數據表
create table 表名(字段1 字段類型,字段2 字段類型,…字段n 字段類型 );-- 例如,創建一個student表create table student(id int,name varchar(20),gender varchar(10),birthday date);2.2、查看數據表
show tables; -- 查看當前數據庫中所有表 show create table student; -- 查student表的基本信息 desc student; -- 查看student表的字段信息 -- PS:此處desc是describe的縮寫,用法: desc 表名/查詢語句2.3、修改數據表
alter table student rename to stu; -- 修改student表名為stu alter table stu change name sname varchar(10); -- 修改stu表name字段名為sname alter table stu modify sname int; -- 修改sname字段數據類型為int -- PS:此處modify意為修改、調整的意思。 alter table stu add address varchar(50); -- 增加address字段 alter table stu drop address; -- 刪除stu表中address字段2.4、刪除數據表
drop table 表名;-- 例如,刪除stu數據表 drop table stu;三、數據表的約束
| PRIMARY KEY | 主鍵約束用于唯一標識對應的記錄 |
| FOREIGN KEY | 外鍵約束 |
| NOT NULL | 非空約束 |
| UNIQUE | 唯一性約束 |
| DEFAULT | 默認值約束,用于設置字段的默認值 |
以上五種約束條件針對表中字段進行限制從而保證數據表中數據的正確性和唯一性。換句話說,表的約束實際上就是表中數據的限制條件。
3.1、主鍵約束
主鍵約束即primary key用于唯一的標識表中的每一行。被標識為主鍵的數據在表中是唯一的且其值不能為空。這點類似于我們每個人都有一個身份證號,并且這個身份證號是唯一的。
-- 主鍵約束基本語法: 字段名 數據類型 primary key;-- 設置主鍵約束(primary key)的第一種方式 create table student(id int primary key,name varchar(20) );-- 設置主鍵約束(primary key)的第二種方式 create table student01(id int,name varchar(20),primary key(id) );3.2、非空約束
非空約束即 NOT NULL指的是字段的值不能為空
-- 基本的語法格式 字段名 數據類型 NOT NULL;-- 例如,給name字段加上非空約束 create table student02(id int,name varchar(20) not null );3.3、默認值約束
默認值約束即DEFAULT用于給數據表中的字段指定默認值,即當在表中插入一條新記錄時若未給該字段賦值,那么,數據庫系統會自動為這個字段插人默認值
-- 基本的語法格式 字段名 數據類型 DEFAULT 默認值;-- 例如,給字段gender添加默認值約束 create table student03(id int,name varchar(20),gender varchar(10) default 'male' );3.4、唯一性約束
唯一性約束即UNIQUE用于保證數據表中字段的唯一性,即表中字段的值不能重復出現
-- 基本的語法格式 字段名 數據類型 UNIQUE;-- 例如,給字段name添加唯一性約束 create table student04(id int,name varchar(20) unique );3.5、外鍵約束
外鍵約束即FOREIGN KEY常用于多張表之間的約束
-- 在創建數據表時語法如下: CONSTRAINT 外鍵名 FOREIGN KEY (從表外鍵字段) REFERENCES 主表 (主鍵字段) -- 將創建數據表創號后語法如下: ALTER TABLE 從表名 ADD CONSTRAINT 外鍵名 FOREIGN KEY (從表外鍵字段) REFERENCES 主表 (主鍵字段); -- PS:constraint意為限制-- 例如: -- 創建一個學生表 create table student05(id int primary key,name varchar(20) ); -- 創建一個班級表 create table class(classid int primary key,studentid int ); -- 學生表作為主表,班級表作為副表設置外鍵 alter table class add constraint fk_class_studentid foreign key(studentid) references student05(id);建立外鍵是為了保證數據的完整和統一性。但是,如果主表中的數據被刪除或修改從表中對應的數據,從表中對應的數據也應該被刪除,否則數據庫中會存在很多無意義的垃圾數據
-- 刪除外鍵 alter table 從表名 drop foreign key 外鍵名;-- 例如,刪除班級表外鍵 alter table class drop foreign key fk_class_studentid;關于外鍵約束需要注意的細節
1、從表里的外鍵通常為主表的主鍵
2、從表里外鍵的數據類型必須與主表中主鍵的數據類型一致
3、主表發生變化時應注意主表與從表的數據一致性問題
四、數據表插入數據
在MySQL通過INSERT語句向數據表中插入數據
create table student(id int,name varchar(30),age int,gender varchar(30));4.1、為表中所有字段插入數據
每個字段與其值是嚴格一一對應的。也就是說:每個值、值的順序、值的類型必須與對應的字段相匹配。但是,各字段也無須與其在表中定義的順序一致,它們只要與 VALUES中值的順序一致即可
-- 基本的語法格式 INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);-- 例如,向學生表中插入一條學生信息 insert into student (id,name,age,gender) values (1,'bob',16,'male');4.2、為表中指定字段插入數據
插入數據的方法基本和為表中所有字段插入數據,一樣,只是需要插入的字段由你自己指定
-- 基本的語法格式 INSERT INTO 表名(字段名1,字段名2,...) VALUES (值 1,值 2,...);-- 例如,向學生表中插入一條學生信息 insert into student (id,name) values (2,'lak');4.3、同時插入多條記錄
在該方式中:(字段名1,字段名2,…)是可選的,它用于指定插人的字段名;(值 1,值 2,…),(值 1,值 2,…)表示要插人的記錄,該記錄可有多條并且每條記錄之間用逗號隔開
-- 基本的語法格式 INSERT INTO 表名 [(字段名1,字段名2,...)]VALUES (值 1,值 2,…),(值 1,值 2,…),...;-- 例如,向學生表中插入多條學生信息 insert into student (id,name,age,gender) values (3,'lucy',17,'female'),(4,'jack',19,'male'),(5,'tom',18,'male');五、更新數據
在MySQL通過UPDATE語句向數據表中更新數據
create table student(id int,name varchar(30),age int,gender varchar(30));-- 基本的語法格式-- 在該語法中:字段名1、字段名2…用于指定要更新的字段名稱;值1、值 2…用于表示字段的新數據;WHERE 條件表達式 是可選的,它用于指定更新數據需要滿足的條件 UPDATE 表名 SET 字段名1=值1[,字段名2 =值2,…] [WHERE 條件表達式];-- 1、UPDATE更新部分數據 -- 將name為tom的記錄的age設置為20并將其gender設置為female update student set age=20,gender='female' where name='tom';-- 2、UPDATE更新全部數據 -- 將所有記錄的age設置為18 update student set age=18;六、刪除數據
在MySQL通過DELETE語句刪除數據表中的數據
TRUNCATE 刪除數據 truncate table student; -- 創建學生表create table student(id int,name varchar(30),age int,gender varchar(30));-- 插入數據 insert into student (id,name,age,gender) values (2,'lucy',17,'female'),(3,'jack',19,'male'),(4,'tom',18,'male'),(5,'sal',19,'female'),(6,'sun',20,'male') ,(7,'sad',13,'female'),(8,'sam',14,'male');-- 基本的語法格式-- 在該語法中:表名用于指定要執行刪除操作的表;[WHERE 條件表達式]為可選參數用于指定刪除的條件。 DELETE FROM 表名 [WHERE 條件表達式];-- 1、DELETE刪除部分數據 -- 刪除age等于14的所有記錄 delete from student where age=14;-- 2、DELETE刪除全部數據 -- 刪除student表中的所有記錄 delete from student;-- 3、TRUNCATE刪除數據 truncate table student;TRUNCATE和DETELE的區別
TRUNCATE和DETELE都能實現刪除表中的所有數據的功能,但兩者也是有區別的:
1、DELETE語句后可跟WHERE子句,可通過指定WHERE子句中的條件表達式只刪除滿足條件的部分記錄;但是,TRUNCATE語句只能用于刪除表中的所有記錄。
2、使用TRUNCATE語句刪除表中的數據后,再次向表中添加記錄時自動增加字段的默認初始值重新由1開始;使用DELETE語句刪除表中所有記錄后,再次向表中添加記錄時自動增加字段的值為刪除時該字段的最大值加1
3、DELETE語句是DML語句,TRUNCATE語句通常被認為是DDL語句
七、MySQL數據表查詢語句
-- 創建數據庫 DROP DATABASE IF EXISTS mydb; CREATE DATABASE mydb; USE mydb;-- 創建student表 CREATE TABLE student (sid CHAR(6),sname VARCHAR(50),age INT,gender VARCHAR(50) DEFAULT 'male' );-- 向student表插入數據 INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');7.1、簡單查詢
不含where的select語句
-- 1、查詢所有字段 select * from student;-- 2、查詢指定字段(sid、sname) select sid,sname from student;-- 3、常數的查詢日期標記 select sid,sname,'2021-03-02' from student;-- 4、從查詢結果中過濾重復數據(DISTINCT) -- 注:在SELECT查詢語句中DISTINCT關鍵字只能用在第一個所查列名之前(distinct必須放在開頭)。 select distinct gender from student;-- 5、在SELECT查詢語句中使用加減乘除運算符,例如,查詢學生10年后的年齡select sname,age+10 from student;7.2、條件查詢
| = | 等于 |
| <> | 不等于 |
| != | 不等于 |
| < | 小于 |
| <= | 小于等于 |
| > | 大于 |
| >= | 大于等于 |
7.3、多表連接查詢
-- 1、交叉連接查詢 -- 交叉連接返回的結果是被連接的兩個表中所有數據行的笛卡兒積;比如:集合A={a,b},集合B={0,1,2},則集合A和B的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。所以,交叉連接也被稱為笛卡爾連接-- 基本的語法格式,在該語法中:CROSS JOIN用于連接兩個要查詢的表,通過該語句可以查詢兩個表中所有的數據組合。 SELECT * FROM 表1 CROSS JOIN 表2;-- 2、內連接查詢 -- 內連接(Inner Join)又稱簡單連接或自然連接,是一種非常常見的連接查詢。內連接使用比較運算符對兩個表中的數據進行比較并列出與連接條件匹配的數據行,組合成新的 記錄。也就是說在內連接查詢中只有滿足條件的記錄才能出現在查詢結果中 -- 基本的語法格式,在該語法中:INNER JOIN用于連接兩個表,ON來指定連接條件;其中INNER可以省略。 SELECT 查詢字段1,查詢字段2, ... FROM 表1 [INNER] JOIN 表2 ON 表1.關系字段=表2.關系字段-- 若存在數據庫mydb則刪除 DROP DATABASE IF EXISTS mydb; -- 創建數據庫mydb CREATE DATABASE mydb; -- 選擇數據庫mydb USE mydb;-- 創建部門表 CREATE TABLE department(did int (4) NOT NULL PRIMARY KEY, dname varchar(20) );-- 創建員工表 CREATE TABLE employee (eid int (4) NOT NULL PRIMARY KEY, ename varchar (20), eage int (2), departmentid int (4) NOT NULL );-- 向部門表插入數據 INSERT INTO department VALUES(1001,'財務部'); INSERT INTO department VALUES(1002,'技術部'); INSERT INTO department VALUES(1003,'行政部'); INSERT INTO department VALUES(1004,'生活部'); -- 向員工表插入數據 INSERT INTO employee VALUES(1,'張三',19,1003); INSERT INTO employee VALUES(2,'李四',18,1002); INSERT INTO employee VALUES(3,'王五',20,1001); INSERT INTO employee VALUES(4,'趙六',20,1004);-- 例如,查詢員工姓名及其所屬部門名稱 select ename,dname from department inner join employee on did=departmentid; -- 也可以這么寫,都可以 select employee.ename,department.dname from department inner join employee on department.did=employee.departmentid;-- 3、外連接查詢 -- 在使用內連接查詢時我們發現:返回的結果只包含符合查詢條件和連接條件的數據。但是,有時還需要在返回查詢結果中不僅包含符合條件的數據,而且還包括左表、右表或兩個表中的所有數據,此時我們就需要使用外連接查詢。外連接又分為左(外)連接和右(外)連接-- 基本的語法格式,由此可見,外連接的語法格式和內連接非常相似,只不過使用的是LEFT [OUTER] JOIN、RIGHT [OUTER] JOIN關鍵字。其中,關鍵字左邊的表被稱為左表,關鍵字右邊的表被稱為右表;OUTER可以省略。 -- 在使用左(外)連接和右(外)連接查詢時,查詢結果是不一致的,具體如下: -- (1)LEFT [OUTER] JOIN 左(外)連接:返回包括左表中的所有記錄和右表中符合連接條件的記錄。 -- (2)RIGHT [OUTER] JOIN 右(外)連接:返回包括右表中的所有記錄和左表中符合連接條件的記錄 SELECT 查詢字段1,查詢字段2, ... FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.關系字段=表2.關系字段 WHERE 條件-- 若存在數據庫mydb則刪除 DROP DATABASE IF EXISTS mydb; -- 創建數據庫mydb CREATE DATABASE mydb; -- 選擇數據庫mydb USE mydb;-- 創建班級表 CREATE TABLE class(cid int (4) NOT NULL PRIMARY KEY, cname varchar(20) );-- 創建學生表 CREATE TABLE student (sid int (4) NOT NULL PRIMARY KEY, sname varchar (20), sage int (2), classid int (4) NOT NULL ); -- 向班級表插入數據 INSERT INTO class VALUES(1001,'Java'); INSERT INTO class VALUES(1002,'C++'); INSERT INTO class VALUES(1003,'Python'); INSERT INTO class VALUES(1004,'PHP');-- 向學生表插入數據 INSERT INTO student VALUES(1,'張三',20,1001); INSERT INTO student VALUES(2,'李四',21,1002); INSERT INTO student VALUES(3,'王五',24,1002); INSERT INTO student VALUES(4,'趙六',23,1003); INSERT INTO student VALUES(5,'Jack',22,1009);-- 準備這組數據有一定的特點,為的是讓大家直觀的看出左連接與右連接的不同之處 -- (1)班級編號為1004的PHP班級沒有學生 -- (2)學號為5的學生王躍躍班級編號為1009,該班級編號并不在班級表中-- 3.1、左(外)連接查詢 -- 左(外)連接的結果包括LEFT JOIN子句中指定的左表的所有記錄,以及所有滿足連接條件的記錄。如果左表的某條記錄在右表中不存在則在右表中顯示為空-- 例如,查詢每個班的班級ID、班級名稱及該班的所有學生的名字 select class.cid,class.cname,student.sname from class left join student on class.cid=student.classid;-- 展示結果分析: -- (1)分別找出Java班、C++班、Python班的學生 -- (2)右表的王躍躍不滿足查詢條件故其沒有出現在查詢結果中 -- (3)雖然左表的PHP班沒有學生,但是任然顯示了PHP的信息;但是,它對應的學生名字為NULL-- 3.2、右(外)連接查詢 -- 右(外)連接的結果包括RIGHT JOIN子句中指定的右表的所有記錄,以及所有滿足連接條件的記錄。如果右表的某條記錄在左表中沒有匹配,則左表將返回空值-- 例如,查詢每個班的班級ID、班級名稱及該班的所有學生的名字 select class.cid,class.cname,student.sname from class right join student on class.cid=student.classid;-- 展示結果分析: -- (1)分別找出Java班、C++班、Python班的學生 -- (2)左表的PHP班不滿足查詢條件故其沒有出現在查詢結果中 -- (3)雖然右表的jack沒有對應班級,但是任然顯示王躍躍的信息;但是,它對應的班級以及班級編號均為NULL7.4、子查詢
子查詢是指一個查詢語句嵌套在另一個查詢語句內部的查詢;該查詢語句可以嵌套在一個 SELECT、SELECT…INTO、INSERT…INTO等語句中。在執行查詢時,首先會執行子查詢中的語句,再將返回的結果作為外層查詢的過濾條件。在子査詢中通常可以使用比較運算符和IN、EXISTS、ANY、ALL等關鍵字
DROP TABLE IF EXISTS student; DROP TABLE IF EXISTS class;-- 創建班級表 CREATE TABLE class(cid int (4) NOT NULL PRIMARY KEY, cname varchar(20) );-- 創建學生表 CREATE TABLE student (sid int (4) NOT NULL PRIMARY KEY, sname varchar (20), sage int (2), classid int (4) NOT NULL );-- 向班級表插入數據 INSERT INTO class VALUES(1001,'Java'); INSERT INTO class VALUES(1002,'C++'); INSERT INTO class VALUES(1003,'Python'); INSERT INTO class VALUES(1004,'PHP'); INSERT INTO class VALUES(1005,'Android');-- 向學生表插入數據 INSERT INTO student VALUES(1,'張三',20,1001); INSERT INTO student VALUES(2,'李四',21,1002); INSERT INTO student VALUES(3,'王五',24,1003); INSERT INTO student VALUES(4,'趙六',23,1004); INSERT INTO student VALUES(5,'小明',21,1001); INSERT INTO student VALUES(6,'小紅',26,1001); INSERT INTO student VALUES(7,'小亮',27,1002); -- 1、帶比較運算符的子查詢 -- 比較運算符前面我們提到過得,就是>、<、=、>=、<=、!=等-- 例如,查詢張三同學所在班級的信息 select * from class where cid=(select classid from student where sname='張三');-- 例如,查詢比張三同學所在班級編號還大的班級的信息 select * from class where cid>(select classid from student where sname='張三');-- 2、帶EXISTS關鍵字的子查詢 -- EXISTS關鍵字后面的參數可以是任意一個子查詢, 它不產生任何數據只返回TRUE或FALSE。當返回值為TRUE時外層查詢才會 執行-- 例如,假如王五同學在學生表中則從班級表查詢所有班級信息 select * from class where exists (select * from student where sname='王五');-- 3、帶ANY關鍵字的子查詢 -- ANY關鍵字表示滿足其中任意一個條件就返回一個結果作為外層查詢條件-- 例如,查詢比任一學生所屬班級號還大的班級編號 select * from class where cid > any (select classid from student);-- 4、帶ALL關鍵字的子查詢 -- ALL關鍵字與ANY有點類似,只不過帶ALL關鍵字的子査詢返回的結果需同時滿足所有內層査詢條件-- 例如,查詢比所有學生所屬班級號還大的班級編號 select * from class where cid > all (select classid from student);八、函數
-- 創建數據庫 DROP DATABASE IF EXISTS mydb; CREATE DATABASE mydb; USE mydb;-- 創建student表 CREATE TABLE student (sid CHAR(6),sname VARCHAR(50),age INT,gender VARCHAR(50) DEFAULT 'male' );-- 向student表插入數據 INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male'); INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');-- 1、聚合函數 -- 在開發中,我們常常有類似的需求:統計某個字段的最大值、最小值、 平均值等等。為此,MySQL中提供了聚合函數來實現這些功能。所謂聚合,就是將多行匯總成一行;其實,所有的聚合函數均如此——輸入多行,輸出一行。聚合函數具有自動濾空的功能,若某一個值為NULL,那么會自動將其過濾使其不參與運算。 -- 聚合函數使用規則: -- 只有SELECT子句和HAVING子句、ORDER BY子句中能夠使用聚合函數。例如,在WHERE子句中使用聚合函數是錯誤的-- 1.1、count() -- 統計表中數據的行數或者統計指定列其值不為NULL的數據個數 -- 例如,查詢有多少該表中有多少人 select count(*) from student;-- 1.2、max() -- 計算指定列的最大值,如果指定列是字符串類型則使用字符串排序運算 -- 例如,查詢該學生表中年紀最大的學生 select max(age) from student;-- 1.3、min() -- 計算指定列的最小值,如果指定列是字符串類型則使用字符串排序運算 -- 例如,查詢該學生表中年紀最小的學生 select sname,min(age) from student;-- 1.4、sum() -- 計算指定列的數值和,如果指定列類型不是數值類型則計算結果為0 -- 例如,查詢該學生表中年紀的總和 select sum(age) from student;-- 1.5、avg() -- 計算指定列的平均值 -- 例如,查詢該學生表中年紀的平均數 select avg(age) from student;-- 2.其他常用函數 -- 2.1、時間函數 SELECT NOW(); SELECT DAY (NOW()); SELECT DATE (NOW()); SELECT TIME (NOW()); SELECT YEAR (NOW()); SELECT MONTH (NOW()); SELECT CURRENT_DATE(); SELECT CURRENT_TIME(); SELECT CURRENT_TIMESTAMP(); SELECT ADDTIME('14:23:12','01:02:01'); SELECT DATE_ADD(NOW(),INTERVAL 1 DAY); SELECT DATE_ADD(NOW(),INTERVAL 1 MONTH); SELECT DATE_SUB(NOW(),INTERVAL 1 DAY); SELECT DATE_SUB(NOW(),INTERVAL 1 MONTH); SELECT DATEDIFF('2019-07-22','2019-05-05');-- 2.2、字符串函數 -- 連接函數 SELECT CONCAT (); SELECT INSTR (); -- 統計長度 SELECT LENGTH();-- 2.3、數學函數 -- 絕對值 SELECT ABS(-136); -- 向下取整 SELECT FLOOR(3.14); -- 向上取整 SELECT CEILING(3.14);九、別名設置
在査詢數據時可為表和字段取別名,該別名代替表和字段的原名參與查詢操作。
-- 1.為表取別名 -- 在查詢操作時,假若表名很長使用起來就不太方便,此時可為表取一個別名,用該別名來代替表的名稱-- 基本的語法格式 SELECT * FROM 表名 [AS] 表的別名 WHERE .... ; -- 例如,將student改為stu查詢整表 select * from student as stu;-- 2.為字段取別名 -- 在查詢操作時,假若字段名很長使用起來就不太方便,此時可該字段取一個別名,用該別名來代替字段的名稱-- 基本的語法格式 SELECT 字段名1 [AS] 別名1 , 字段名2 [AS] 別名2 , ... FROM 表名 WHERE ... ; -- 例如,將student中的name取別名為“姓名” 查詢整表 select name as '姓名',id from student;十、表的關聯關系
在實際開發中數據表之間存在著各種關聯關系。在此,介紹MySQL中數據表的三種關聯關系。
多對一
多對一(亦稱為一對多)是數據表中最常見的一種關系。例如:員工與部門之間的關系,一個部門可以有多個員工;而一個員工不能屬于多個部門只屬于某個部門。在多對一的表關系 中,應將外鍵建在多的一方否則會造成數據的冗余。
多對多
多對多是數據表中常見的一種關系。例如:學生與老師之間的關系,一個學生可以有多個老師而且一個老師有多個學生。通常情況下,為了實現這種關系需要定義一張中間表(亦稱為連接表)該表會存在兩個外鍵分別參照老師表和學生表。
一對一
在開發過程中,一對一的關聯關系在數據庫中并不常見;因為以這種方式存儲的信息通常會放在同一張表中。
十一、權限
-- 用戶和權限管理 -- 用戶信息表:mysql.user-- 刷新權限 FLUSH PRIVILEGES-- 增加用戶 CREATE USER kuangshen IDENTIFIED BY '123456' CREATE USER 用戶名 IDENTIFIED BY [PASSWORD] 密碼(字符串)-- 必須擁有mysql數據庫的全局CREATE USER權限,或擁有INSERT權限。-- 只能創建用戶,不能賦予權限。-- 用戶名,注意引號:如 'user_name'@'192.168.1.1'-- 密碼也需引號,純數字密碼也要加引號-- 要在純文本中指定密碼,需忽略PASSWORD關鍵詞。要把密碼指定為由PASSWORD()函數返回的混編值,需包含關鍵字PASSWORD-- 重命名用戶 RENAME USER kuangshen TO kuangshen2 RENAME USER old_user TO new_user-- 設置密碼 SET PASSWORD = PASSWORD('密碼') -- 為當前用戶設置密碼 SET PASSWORD FOR 用戶名 = PASSWORD('密碼') -- 為指定用戶設置密碼-- 刪除用戶 DROP USER kuangshen2 DROP USER 用戶名-- 分配權限/添加用戶 GRANT 權限列表 ON 表名 TO 用戶名 [IDENTIFIED BY [PASSWORD] 'password']- all privileges 表示所有權限- *.* 表示所有庫的所有表- 庫名.表名 表示某庫下面的某表-- 查看權限 SHOW GRANTS FOR root@localhost; SHOW GRANTS FOR 用戶名-- 查看當前用戶權限SHOW GRANTS; 或 SHOW GRANTS FOR CURRENT_USER; 或 SHOW GRANTS FOR CURRENT_USER();-- 撤消權限 REVOKE 權限列表 ON 表名 FROM 用戶名 REVOKE ALL PRIVILEGES, GRANT OPTION FROM 用戶名 -- 撤銷所有權限 權限解釋-- 權限列表 ALL [PRIVILEGES] -- 設置除GRANT OPTION之外的所有簡單權限 ALTER -- 允許使用ALTER TABLE ALTER ROUTINE -- 更改或取消已存儲的子程序 CREATE -- 允許使用CREATE TABLE CREATE ROUTINE -- 創建已存儲的子程序 CREATE TEMPORARY TABLES -- 允許使用CREATE TEMPORARY TABLE CREATE USER -- 允許使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。 CREATE VIEW -- 允許使用CREATE VIEW DELETE -- 允許使用DELETE DROP -- 允許使用DROP TABLE EXECUTE -- 允許用戶運行已存儲的子程序 FILE -- 允許使用SELECT...INTO OUTFILE和LOAD DATA INFILE INDEX -- 允許使用CREATE INDEX和DROP INDEX INSERT -- 允許使用INSERT LOCK TABLES -- 允許對您擁有SELECT權限的表使用LOCK TABLES PROCESS -- 允許使用SHOW FULL PROCESSLIST REFERENCES -- 未被實施 RELOAD -- 允許使用FLUSH REPLICATION CLIENT -- 允許用戶詢問從屬服務器或主服務器的地址 REPLICATION SLAVE -- 用于復制型從屬服務器(從主服務器中讀取二進制日志事件) SELECT -- 允許使用SELECT SHOW DATABASES -- 顯示所有數據庫 SHOW VIEW -- 允許使用SHOW CREATE VIEW SHUTDOWN -- 允許使用mysqladmin shutdown SUPER -- 允許使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL語句,mysqladmin debug命令;允許您連接(一次),即使已達到max_connections。 UPDATE -- 允許使用UPDATE USAGE -- “無權限”的同義詞 GRANT OPTION -- 允許授予權限-- 表維護-- 分析和存儲表的關鍵字分布 ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE 表名 ... -- 檢查一個或多個表是否有錯誤 CHECK TABLE tbl_name [, tbl_name] ... [option] ... option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED} -- 整理數據文件的碎片 OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...十二、總結
重要(從關鍵字分析):
查詢語句的書寫順序和執行順序
select ===> from ===> where ===> group by ===> having ===> order by ===> limit
查詢語句的執行順序
from ===> where ===> group by ===> having ===> select ===> order by ===> limi
參考:
1、CSDN博主「老賴的小弟」
鏈接:https://blog.csdn.net/weixin_45851945/article/details/114287877
2、狂神
鏈接:https://mp.weixin.qq.com/s/a4jA3B2j4KXBH7rci4C46w
? https://mp.weixin.qq.com/s/-_-fRKNOi5rI6tb8RINZ0Q
? https://mp.weixin.qq.com/s/dCt_v5KQCTpgBdlY__0BSA
3、菜鳥教程
鏈接:https://www.runoob.com/mysql/mysql-create-tables.html
總結
- 上一篇: WordPress博客网站搬家和换域名方
- 下一篇: 使用Hexo写博客