mysql 基本操做

數據庫操做:mysql

---查看warnings內容
show warnings

---查看當前在那個數據庫
select database();

---查看有那些數據庫
show databases;

---查看數據庫建立信息
show create database s3;

---建立數據庫
create database if not exists s3;

---建立數據庫 設置編碼
create database if not exists s4 character set utf8;

---修改數據庫編碼
alter database s4 character set gbk;

---刪除數據庫
drop database s4;

建立表sql

/////////////表處理(主鍵:非空且惟一) 非空:not null 惟一:unique float(4,2)表示6位數,小數點數2位 最大99.99
---建立表
create table emp(
id INT primary KEY auto_increment,
name VARCHAR(30),
age TINYINT DEFAULT 100,
salary FLOAT(9,2)
);

 

---多字段聯合主鍵
create table users2(
id INT,
name varchar(20),
city varchar(20),
primary key(name,id)
);

 

查看錶信息數據庫

---查看錶建立信息
desc tab_name 查看錶結構
show columns from tab_name 查看錶結構
show tables 查看當前數據庫中的全部的表
show create table tab_name 查看當前數據庫表建表語句


修改表信息函數

----修改表結構
--增長列(字段) alter table tab_name add [column] 列名 類型[完整性約束條件][first|after 字段名];
ALTER TABLE emp ADD address TEXT;
#添加多個字段
ALTER TABLE emp ADD date DATE not NULL,ADD work VARCHAR(22) not NULL;

--刪除列
alter TABLE emp DROP WORK; 刪除work 字段
#刪除多個字段
alter TABLE emp DROP date,DROP address;

--修改字段屬性
ALTER TABLE emp MODIFY age SMALLINT NOT NULL; #age字段類型修改爲SMALLINT NOT NULL
#修改到那個字段後面[first|after 字段名] 放到第一 after 放到那個字段後面
ALTER TABLE emp MODIFY age SMALLINT NOT NULL AFTER id; #AFTER id放到ID 後面

--修改列名
alter table tab_name change [column] 列名 新列名 類型 [完整性約束條件][first|after 字段名];
ALTER TABLE emp CHANGE age uuid VARCHAR(20) not null; #age 修改爲uuid


--修改代表
RENAME TABLE emp to emppp;

--添加主鍵,刪除主鍵
alter table tab_name add primary key(字段名稱,...)
alter table users drop primary key;

eg:
mysql> create table test5(num int auto_increment);
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
create table test(num int primary key auto_increment);
-- 思考,如何刪除主鍵?
alter table test modify id int; -- auto_increment沒了,但這樣寫主鍵依然存在,因此還要加上下面這句
alter table test drop primary key;-- 僅僅用這句也沒法直接刪除主鍵

--惟一索引
alter table tab_name add unique [index|key] [索引名稱](字段名稱,...)

alter table users add unique(name)-- 索引值默認爲字段名show create table users;
alter table users add unique key user_name(name);-- 索引值爲user_name

-- 添加聯合索引
alter table users add unique index name_age(name,age);#show create table users;

-- 刪除惟一索引
alter table tab_name drop {index|key} index_name
 
--插入表數據
INSERT into emp(name,salary) VALUES("張三丰",1900.99);
INSERT into emp set name="黑墨水"
#插入多行
INSERT into emp(name,salary) VALUES("張三丰",1900.99),("張無忌",2900.99);
--更新
UPDATE emp set salary=salary+20000 WHERE name="張無忌"; #salary=salary+20000(salary是原來存在的數據在加上20000)
#修改多個字段
UPDATE emp set salary=salary+20000,name="一天" WHERE name="張無忌"

---刪除表數據
DELETE FROM emp; #刪除全部數據 (TRUNCATE TABLE emp)
DELETE FROM emp WHERE name="一天"
DELETE FROM emp WHERE id=2 and name="張三丰"
DELETE FROM emp WHERE id=2 OR name="張三丰"

表查詢
SELECT id,name as 肚子 FROM emp #查詢id name
SELECT DISTINCT name FROM emp ; #DISTINCT 給name字段去除重複的內容
#別名
SELECT DISTINCT name as 肚子 FROM emp

--%
SELECT id,name FROM emp WHERE salary like 'yuan%'
/*
pattern能夠是%或者_,
若是是%則表示任意多字符,此例如唐僧,唐國強
若是是_則表示一個字符唐_,只有唐僧符合。兩個_則表示兩個字符:__
*/


--大於查詢出來
SELECT id,name FROM emp WHERE salary > 100;

--查找區間
SELECT id,name FROM emp WHERE salary BETWEEN 80 and 90 #between 80 and 100 值在10到20之間

--值包含這些的
SELECT id,name FROM emp WHERE salary in (80,90,200) # in(80,90,100) 值是10或20或30

--查詢空的
SELECT id,name FROM emp WHERE salary=null; #這個沒法查詢
SELECT id,name FROM emp WHERE salary is null; 用這個查詢空

--升序排序
SELECT id,name FROM emp WHERE ORDER BY id; #按id
SELECT id,name FROM emp WHERE id > 100 ORDER BY id; #按id

--降序
SELECT id,name FROM emp WHERE id > 100 ORDER BY id desc; #按id

--2個字段的相加
SELECT age+salary FROM emp; #age+salary 2個字段相加
SELECT age+salary FROM emp ORDER BY age+salary desc; #age+salary降序排
SELECT age+salary as test FROM emp ORDER BY test desc;

重點:Select from where group by having order by 這些過濾條件執行順序
-- Mysql在執行sql語句時的執行順序:
-- 先執行 from ---> where ---> select ---> group by ---> having ---> order by
-- 分析:
select JS as JS成績 from ExamResult where JS成績 >70; ---- 不成功
select JS as JS成績 from ExamResult having JS成績 >90; --- 成功


---分組
-- 注意,按分組條件分組後每一組只會顯示第一條記錄(也就說若是按name分類了,那name中有3個叫張三丰的,只會顯示第一條記錄,另外兩條記錄給裏分離到第一條裏面去了)
-- group by字句,其後能夠接多個列名,也能夠跟having子句,對group by 的結果進行篩選。

--按第二個字段進行分組
SELECT * FROM emp GROUP BY 2

--按name分組 而後計算salary的和
SELECT `name`,SUM(salary) FROM emp GROUP BY name;#解析 name 分組後只會顯示第一條記錄,而後計算sum計算統計這時候 有3個張珊分到一個組裏面會算出 全部是30000
 結果:

 

--HAVING分組後過濾條件 不能使用where where是在分組以前過濾
SELECT `name`,SUM(salary) FROM emp GROUP BY name HAVING SUM(salary) > 20000;
/*
having 和 where二者均可以對查詢結果進行進一步的過濾,差異有:
<1>where語句只能用在分組以前的篩選,having能夠用在分組以後的篩選;
<2>使用where語句的地方均可以用having進行替換
<3>having中能夠用聚合函數,where中就不行。
*/
-- (6)聚合函數: 先不要管聚合函數要幹嗎,先把要求的內容查出來再包上聚合函數便可。
-- (通常和分組查詢配合使用)

--<1> 統計表中全部記錄

-- COUNT(列名):統計行的個數
-- 統計一個班級共有多少學生?先查出全部的學生,再用count包上
select count(*) from ExamResult;
-- 統計JS成績大於70的學生有多少個?
select count(JS) from ExamResult where JS>70;
-- 統計總分大於280的人數有多少?
select count(name) from ExamResult
where (ifnull(JS,0)+ifnull(Django,0)+ifnull(OpenStack,0))>280;
-- 注意:count(*)統計全部行; count(字段)不統計null值.

-- SUM(列名):統計知足條件的行的內容和
-- 統計一個班級JS總成績?先查出全部的JS成績,再用sum包上
select JS as JS總成績 from ExamResult;
select sum(JS) as JS總成績 from ExamResult;
-- 統計一個班級各科分別的總成績
select sum(JS) as JS總成績,
sum(Django) as Django總成績,
sum(OpenStack) as OpenStack from ExamResult;

-- 統計一個班級各科的成績總和
select sum(ifnull(JS,0)+ifnull(Django,0)+ifnull(Database,0))
as 總成績 from ExamResult;
-- 統計一個班級JS成績平均分
select sum(JS)/count(*) from ExamResult ;
-- 注意:sum僅對數值起做用,不然會報錯。

-- AVG(列名):
-- 求一個班級JS平均分?先查出全部的JS分,而後用avg包上。
select avg(ifnull(JS,0)) from ExamResult;
-- 求一個班級總分平均分
select avg((ifnull(JS,0)+ifnull(Django,0)+ifnull(Database,0)))
from ExamResult ;
-- Max、Min
-- 求班級最高分和最低分(數值範圍在統計中特別有用)
select Max((ifnull(JS,0)+ifnull(Django,0)+ifnull(OpenStack,0)))
最高分 from ExamResult;
select Min((ifnull(JS,0)+ifnull(Django,0)+ifnull(OpenStack,0)))
最低分 from ExamResult;
-- 求購物表中單價最高的商品名稱及價格
---SELECT id, MAX(price) FROM order_menu;--id和最高價商品是一個商品嗎?

SELECT MAX(price) FROM order_menu;

-- 注意:null 和全部的數計算都是null,因此須要用ifnull將null轉換爲0!
-- -----ifnull(JS,0)


-- with rollup的使用

--<2> 統計分組後的組記錄

---外鍵
--- 每個班主任會對應多個學生 , 而每一個學生只能對應一個班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY KEY auto_increment, name VARCHAR (20), age INT , is_marriged boolean -- show create table ClassCharger: tinyint(1)  ); INSERT INTO ClassCharger (name,age,is_marriged) VALUES ("冰冰",12,0), ("丹丹",14,0), ("歪歪",22,0), ("姍姍",20,0), ("小雨",21,0); ----子表 CREATE TABLE Student( id INT PRIMARY KEY auto_increment, name VARCHAR (20), charger_id TINYINT, --切記:做爲外鍵必定要和關聯主鍵的數據類型保持一致
FOREIGN KEY (charger_id) REFERENCES ClassCharger(id), 關聯外建 charger_id字段當前表 到 classcharger表的id字段
-- ADD CONSTRAINT charger_fk_stu FOREIGN KEY (charger_id) REFERENCES ClassCharger(id) ##給外建加名字 ADD CONSTARAINT charger_fk_stu 這段是本身加上外鍵名字 ) ENGINE=INNODB; INSERT INTO Student(name,charger_id) VALUES ("alvin1",2), ("alvin2",4), ("alvin3",1), ("alvin4",3), ("alvin5",1), ("alvin6",3), ("alvin7",2); DELETE FROM ClassCharger WHERE name="冰冰"; INSERT student (name,charger_id) VALUES ("yuan",1); -- 刪除竟然成功,但是 alvin3顯示仍是有班主任id=1的冰冰的; -----------增長外鍵和刪除外鍵--------- ALTER TABLE student ADD CONSTRAINT abc FOREIGN KEY(charger_id) REFERENCES classcharger(id); ALTER TABLE student DROP FOREIGN KEY abc;
 
 
--外鍵約束對子表的含義: 若是在父表中找不到候選鍵,則不容許在子表上進行insert/update --外鍵約束對父表的含義: 在父表上進行update/delete以更新或刪除在子表中有一條或多條對 -- 應匹配行的候選鍵時,父表的行爲取決於:在定義子表的外鍵時指定的 -- on update/on delete子句 -----------------innodb支持的四種方式--------------------------------------- -----cascade方式 在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄 -----外鍵的級聯刪除:若是父表中的記錄被刪除,則子表中對應的記錄自動被刪除-------- FOREIGN KEY (charger_id) REFERENCES ClassCharger(id) ON DELETE CASCADE #主表刪除字表裏面的數據也跟着刪除 ------set null方式 在父表上update/delete記錄時,將子表上匹配記錄的列設爲null -- 要注意子表的外鍵列不能爲not null FOREIGN KEY (charger_id) REFERENCES ClassCharger(id) ON DELETE SET NULL #主表刪掉後,字表裏面的記錄變成null值 不會報錯. ------Restrict方式 :拒絕對父表進行刪除更新操做(瞭解) ------No action方式 在mysql中同Restrict,若是子表中有匹配的記錄,則不容許對父表對應候選鍵 -- 進行update/delete操做(瞭解)
 
 

多表查詢:ui

 

內鏈接查詢編碼

-- 準備兩張表 -- company.employee -- company.department create table employee( emp_id int auto_increment primary key not null, emp_name varchar(50), age int, dept_id int ); insert into employee(emp_name,age,dept_id) values ('A',19,200), ('B',26,201), ('C',30,201), ('D',24,202), ('E',20,200), ('F',38,204); create table department( dept_id int, dept_name varchar(100) ); insert into department values (200,'人事部'), (201,'技術部'), (202,'銷售部'), (203,'財政部'); mysql> select * from employee; +--------+----------+------+---------+ | emp_id | emp_name | age | dept_id | +--------+----------+------+---------+ | 1 | A | 19 | 200 | | 2 | B | 26 | 201 | | 3 | C | 30 | 201 | | 4 | D | 24 | 202 | | 5 | E | 20 | 200 | | 6 | F | 38 | 204 | +--------+----------+------+---------+ rows in set (0.00 sec) mysql> select * from department; +---------+-----------+ | dept_id | dept_name | +---------+-----------+ | 200 | 人事部 | | 201 | 技術部 | | 202 | 銷售部 | | 203 | 財政部 | +---------+-----------+ rows in set (0.01 sec)

查詢A在那個部門
SELECT * FROM department,employee WHERE employee.emp_name = "A" AND  employee.dept_id = department.dept_id
或者:
SELECT * FROM employee INNER JOIN department  on employee.emp_name = "A" AND  employee.dept_id = department.dept_id
都是同樣的

 外鏈接查詢spa

 
  
--(1)左外鏈接:在內鏈接的基礎上增長左邊有右邊沒有的結果 也就是說主表爲左邊的上的數據所有顯示出來,右邊表上面若是沒有匹配上就顯示空置 select * from employee left join department on employee.dept_id = department.dept_id; +--------+----------+------+---------+---------+-----------+ | emp_id | emp_name | age | dept_id | dept_id | dept_name | +--------+----------+------+---------+---------+-----------+ | 1 | A | 19 | 200 | 200 | 人事部 | | 5 | E | 20 | 200 | 200 | 人事部 | | 2 | B | 26 | 201 | 201 | 技術部 | | 3 | C | 30 | 201 | 201 | 技術部 | | 4 | D | 24 | 202 | 202 | 銷售部 | | 6 | F | 38 | 204 | NULL | NULL | +--------+----------+------+---------+---------+-----------+ --(2)右外鏈接:在內鏈接的基礎上增長右邊有左邊沒有的結果 select * from employee RIGHT JOIN department on employee.dept_id = department.dept_id; +--------+----------+------+---------+---------+-----------+ | emp_id | emp_name | age | dept_id | dept_id | dept_name | +--------+----------+------+---------+---------+-----------+ | 1 | A | 19 | 200 | 200 | 人事部 | | 2 | B | 26 | 201 | 201 | 技術部 | | 3 | C | 30 | 201 | 201 | 技術部 | | 4 | D | 24 | 202 | 202 | 銷售部 | | 5 | E | 20 | 200 | 200 | 人事部 | | NULL | NULL | NULL | NULL | 203 | 財政部 | +--------+----------+------+---------+---------+-----------+ --(3)全外鏈接:在內鏈接的基礎上增長左邊有右邊沒有的和右邊有左邊沒有的結果 -- mysql不支持全外鏈接 full JOIN -- mysql可使用此種方式間接實現全外鏈接 select * from employee RIGHT JOIN department on employee.dept_id = department.dept_id UNION select * from employee LEFT JOIN department on employee.dept_id = department.dept_id; +--------+----------+------+---------+---------+-----------+ | emp_id | emp_name | age | dept_id | dept_id | dept_name | +--------+----------+------+---------+---------+-----------+ | 1 | A | 19 | 200 | 200 | 人事部 | | 2 | B | 26 | 201 | 201 | 技術部 | | 3 | C | 30 | 201 | 201 | 技術部 | | 4 | D | 24 | 202 | 202 | 銷售部 | | 5 | E | 20 | 200 | 200 | 人事部 | | NULL | NULL | NULL | NULL | 203 | 財政部 | | 6 | F | 38 | 204 | NULL | NULL | +--------+----------+------+---------+---------+-----------+ -- 注意 union與union all的區別:union會去掉相同的紀錄

 

 

-- 查詢員工年齡大於等於25歲的部門 SELECT DISTINCT department.dept_name FROM employee,department WHERE employee.dept_id = department.dept_id AND age>25; --之內鏈接的方式查詢employee和department表,而且以age字段的升序方式顯示 select employee.emp_id,employee.emp_name,employee.age,department.dept_name from employee,department where employee.dept_id = department.dept_id order by age asc;

 

 子查詢3d

 

-- 子查詢是將一個查詢語句嵌套在另外一個查詢語句中。 -- 內層查詢語句的查詢結果,能夠爲外層查詢語句提供查詢條件。 -- 子查詢中能夠包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等關鍵字 -- 還能夠包含比較運算符:= 、 !=、> 、<等 -- 1. 帶IN關鍵字的子查詢 ---查詢employee表,但dept_id必須在department表中出現過 select * from employee where dept_id IN (select dept_id from department); +--------+----------+------+---------+ | emp_id | emp_name | age | dept_id | +--------+----------+------+---------+ | 1 | A | 19 | 200 | | 2 | B | 26 | 201 | | 3 | C | 30 | 201 | | 4 | D | 24 | 202 | | 5 | E | 20 | 200 | +--------+----------+------+---------+ rows in set (0.01 sec) -- 2. 帶比較運算符的子查詢 -- =、!=、>、>=、<、<=、<> -- 查詢員工年齡大於等於25歲的部門 select dept_id,dept_name from department where dept_id IN (select DISTINCT dept_id from employee where age>=25); -- 3. 帶EXISTS關鍵字的子查詢 -- EXISTS關字鍵字表示存在。在使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄。 -- 而是返回一個真假值。Ture或False -- 當返回Ture時,外層查詢語句將進行查詢;當返回值爲False時,外層查詢語句不進行查詢 select * from employee WHERE EXISTS (SELECT dept_name from department where dept_id=203);#(SELECT dept_name from department where dept_id=203)這句是返回若是是真 就繼續執行select * from employee 否則就不執行了
--department表中存在dept_id=203,Ture select * from employee WHERE EXISTS (SELECT dept_name from department where dept_id=205); -- Empty set (0.00 sec)  ps: create table t1(select * from t2); 拷貝表
相關文章
相關標籤/搜索