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