mysql 基本操作
生活随笔
收集整理的這篇文章主要介紹了
mysql 基本操作
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、 數(shù)據(jù)庫及對象
1、系統(tǒng)數(shù)據(jù)庫
- infomation_schema: 存放數(shù)據(jù)庫對象信息,表信息、列信息,權(quán)限信息
- performance_schema: 數(shù)據(jù)庫服務(wù)器性能參數(shù)
- mysql: 用戶權(quán)限信息
- sys : mysql5.7增加了sys 系統(tǒng)數(shù)據(jù)庫,通過這個庫可以快速的了解系統(tǒng)的元數(shù)據(jù)信息
2、操作
- 創(chuàng)建數(shù)據(jù)庫 : create database learn; - 查詢數(shù)據(jù)庫 : show databases; - 選擇數(shù)據(jù)庫 : use learn; - 刪除數(shù)據(jù)庫 : drop database learn;二、 引擎與數(shù)據(jù)類型
1、引擎
查看引擎:show engines ; -- show engines G
- Transactions: 是否支持事務(wù)
- XA: YES 分布式是否符合XA規(guī)范
- Savepoints: 是否支持事務(wù)處理中的保存點
2、數(shù)據(jù)類型
- 整數(shù)類型 :- tinyint- smallint- mediumint- int,integer- bigint - 浮點 : - float- double - 定點數(shù)類型 :- decimal->字符串存儲- dec - 日期 :- date 4字節(jié)- datetime 8字節(jié)- timestamp 4- time 3- year 1 - 字符串:- char 4- varchar 可變0~65535- tinytext -> text -> mediumtext -> longtext- tinyblob -> blob -> mediumblob -> longblob三、 表操作
CREATE TABLE t_dept (dept_no INT,dept_name VARCHAR(40),location VARCHAR(80) ); ##描述表結(jié)構(gòu) desc t_dept; ## 查看創(chuàng)建語句 show create table t_dept; ##刪除表 drop table t_dept; ##修改表名 alter table t_dept rename to t_deptartment;##增加字段 alter table t_deptartment add dept_name_us VARCHAR(40); ##第一個位置增加字段 alter table t_deptartment add first_col VARCHAR(40) first; ## 某列后面添加字段 alter table t_deptartment add after_dept_name VARCHAR(80) after dept_name; ## 刪除字段 alter table t_deptartment drop first_col; ##修改字段 數(shù)據(jù)類型 alter TABLE t_deptartment MODIFY after_dept_name VARCHAR(100); ## 修改字段名字 可以一同修改字段屬性 ALTER TABLE t_deptartment CHANGE after_dept_name dept_name_after VARCHAR(10);四、約束
##創(chuàng)建表的時候直接加入約束 CREATE TABLE t_dept (dept_no INT(20) PRIMARY KEY NOT NULL, ## 非空約束type VARCHAR(20) DEFAULT 'Co., Ltd', ##默認值dept_name VARCHAR(100) UNIQUE ##唯一值 ); desc t_dept ;##創(chuàng)建有名字的約束值 CREATE TABLE t_dept (dept_no INT(20) AUTO_INCREMENT, ##自增type VARCHAR(20),dept_name VARCHAR(100), CONSTRAINT uk_dept_name UNIQUE (dept_name), ##唯一值CONSTRAINT pk_dept_no PRIMARY KEY (dept_no) ##一個字段主鍵 );## 聯(lián)合主鍵 CREATE TABLE t_dept1 (dept_no INT(20) AUTO_INCREMENT, ##自增type VARCHAR(20),dept_name VARCHAR(100), ##唯一值CONSTRAINT uk_dept_name1 UNIQUE (dept_name), ##唯一值CONSTRAINT pk_dept_no_name1 PRIMARY KEY (dept_no, dept_name) ##聯(lián)合主鍵 );#外鍵 CREATE TABLE t_employee (emp_no int(30) PRIMARY KEY,emp_name VARCHAR(20),dept_no INT(20),CONSTRAINT fk_dept_no FOREIGN KEY (dept_no) REFERENCES t_dept(dept_no) );desc t_employee;五、索引
1.索引類型
普通索引,唯一索引,全文索引,單列索引,多列索引,空間索引
適用: 經(jīng)常被查詢的字段,分組字段,主鍵或者外鍵。唯一完整性約束
不適用: 很少查詢;擁有許多重復(fù)值的字段
2.語句
#普通索引 CREATE TABLE t_dept_2 (dept_no INT,dept_name VARCHAR(20),loc VARCHAR(40),INDEX index_dept_no(dept_no) );SHOW CREATE TABLE t_dept_2; ## 查看解析計劃 EXPLAIN SELECT *FROM t_dept_2WHERE dept_no = 1;## 單獨創(chuàng)建索引 CREATE INDEX idx_dept_nameON t_dept_2 (dept_name);ALTER TABLE t_dept_2ADD INDEX idx_loc(loc DESC);## 唯一索引 CREATE TABLE t_dept_3 (dept_no INT UNIQUE,UNIQUE INDEX idx_dept_no(dept_no) ); CREATE UNIQUE INDEX idx_dept_nameON t_dept_2 (dept_name); ALTER TABLE t_dept_2ADD UNIQUE INDEX idx_loc(loc);##全文索引 ####默認不區(qū)分大小寫,只能在數(shù)據(jù)類型char,varchar,text上創(chuàng)建 CREATE TABLE t_dept_4 (dept_no INT,dept_name VARCHAR(20),FULLTEXT INDEX idx_dept_no (dept_name) ); CREATE FULLTEXT INDEX idx_dept_nameON t_dept_2 (dept_name); ALTER TABLE t_dept_2ADD FULLTEXT INDEX idx_loc(loc);##多列索引 CREATE TABLE t_dept_5 (dept_no INT,dept_name VARCHAR(20),INDEX idx_dept_no (dept_no, dept_name) ); CREATE INDEX idx_dept_nameON t_dept_2 (dept_name); ALTER TABLE t_dept_2ADD INDEX idx_loc(loc);##刪除索引 DROP INDEX idx_loc ON t_dept_2;六、視圖
###創(chuàng)建視圖 CREATE VIEW view_dept_no ASSELECT dept_noFROM t_dept;select * from t_dept; insert into t_dept (dept_no, dept_name) VALUES (1,'ccdata');select * from view_dept_no ;#查看view show tables; show table status from learn like 'view_dept_no'; use information_schema; select * from views where table_name = 'view_dept_no' \G;##刪除view drop view view_dept_no;##修改視圖 CREATE OR REPLACE VIEW view_dept_nameASSELECT dept_nameFROM t_dept;ALTER VIEW view_dept_name ASSELECTdept_no,dept_nameFROM t_dept;select * from view_dept_name; SELECT * FROM t_dept;##對視圖的操作 insert into view_dept_name VALUES (2,'apple'); UPDATE view_dept_name set dept_name = 'Google' WHERE dept_no = 2; delete from view_dept_name WHERE dept_no = 1;七、觸發(fā)器
## 語句 CREATE TRIGGER TRIGGER_NAMEBEFORE | AFTER TRIGGER_EVENTON TABLE_NAME FOR EACH ROW TRIGGER_STMT## before|after 制定觸發(fā)器觸發(fā)的時間 ## trigger_event 觸發(fā)的事件(條件) ## for each row 每行改變都觸發(fā) ## trigger_stmt 觸發(fā)的語句##準備 CREATE TABLE department (no INT(12),name VARCHAR(40),location VARCHAR(60) );CREATE TABLE diary (diary_no INT(12) AUTO_INCREMENT PRIMARY KEY,table_name VARCHAR(50),diary_time DATETIME );## 創(chuàng)建觸發(fā)器 CREATE TRIGGER trigger_diary_time BEFORE INSERT ON department FOR EACH ROWINSERT INTO diary (table_name, diary_time) VALUES ('department', now());## 測試 INSERT INTO department VALUES (1, 'apple', 'Peking'); SELECT * FROM diary;## 觸發(fā)器中包含多個語句 CREATE TRIGGER trigger_diary_time BEFORE INSERT ON department FOR EACH ROWBEGININSERT INTO diary (table_name, diary_time) VALUES ('department', now());INSERT INTO diary (table_name, diary_time) VALUES ('department2', now());END;## 創(chuàng)建多個語句時候,書上說;可能被當做結(jié)束符?(沒碰到這種情況) DELIMITER $$ CREATE TRIGGER trigger_diary_time BEFORE INSERT ON department FOR EACH ROWBEGININSERT INTO diary (table_name, diary_time) VALUES ('department', now());INSERT INTO diary (table_name, diary_time) VALUES ('department2', now());END; $$ DELIMITER ;## 查看 SHOW TRIGGERS;USE information_schema; SELECT * FROM TRIGGERS;##刪除 DROP TRIGGER trigger_diary_time;八、數(shù)據(jù)操作
##插入數(shù)據(jù) INSERT INTO t_dept_2 (dept_no, dept_name, loc) VALUES ('1', 'apple', 'Peking'); INSERT INTO t_dept_2 (dept_no, dept_name) VALUES ('2', 'Google'); INSERT INTO t_dept_2 VALUES ('3', 'Amazon', 'USA');## 插入多個值 INSERT INTO t_dept_2 VALUES('4', 'Tencent', 'Guangzhou'),('5', '網(wǎng)易', '杭州'),('6', '餓了嗎', '北京');## 別的表轉(zhuǎn)移 INSERT INTO t_dept_2 (dept_name)SELECT dept_nameFROM t_deptartment;##### 更新 UPDATE T_DEPT_2 SET LOC= '美國' WHERE DEPT_NAME = 'GOOGLE';##### 刪除 delete from t_dept_2 WHERE dept_no = 6;九、記錄查詢
## 去重復(fù) SELECT DISTINCTDEPT_NAME,LOC FROM T_DEPT_2;## 數(shù)學(xué)運算 CREATE TABLE employee (no INT(10),name VARCHAR(20),salary DOUBLE(10, 2) );INSERT INTO employee VALUES(1, 'a', 1234),(2, 'b', 2500),(3, 'c', 3600),(4, 'd', 4500),(5, 'e', 7800);SELECTname,salary + 100,salary - 200,salary * 1.2,salary / 1000,salary % 1000 FROM employee;關(guān)系運算符
| 大于
< | 小于
= | 等于
!=(<>) | 不等于
= | 大于等于
<= | 小于等于
邏輯運算符
| AND (&&) | 與 | ||
| OR (` | `) | 或 | |
| XOR | 異或 | ||
| NOT(!) | 非 | ||
統(tǒng)計函數(shù)
select count(*) from employee; select count(1) from employee; select count(salary) from employee; -- 將忽略null值,不參與計數(shù)## 平均值,null值既不計入和值也不計入 個數(shù) select avg(salary) from employee;select sum(salary) from employee; select max(salary) from employee; select min(salary) from employee;## 分組 SELECTsubstr(salary, 1, 1),count(*) FROM employee GROUP BY substr(salary, 1, 1);SELECTsubstr(salary, 1, 1),count(*) FROM employee GROUP BY substr(salary, 1, 1) HAVING count(*) > 1;十、多表查詢
## 內(nèi)連接 SELECTa.name,b.name,a.salary FROM employee aJOIN employee b ON a.salary = b.salary AND a.name != b.name;SELECTa.name,b.name,a.salary FROM employee a, employee b WHERE a.salary = b.salaryAND a.name != b.name;## 外鏈接 ### 左外聯(lián)結(jié) left join on ### 右外聯(lián)結(jié) right join on ### 全外聯(lián)結(jié) full join on select * from employee; select * from t_dept_2 ;select * from t_dept_2 a LEFT JOIN employee b on a.dept_no = b.dept_no; select * from t_dept_2 a RIGHT JOIN employee b on a.dept_no = b.dept_no; ##### mysql 不支持。。。 select * from t_dept_2 a FULL JOIN ## 合并 #### union 合并重復(fù)記錄 SELECT DEPT_NO FROM T_DEPT_2 UNION SELECT NO FROM EMPLOYEE;SELECT DEPT_NO FROM T_DEPT_2 UNION ALL SELECT NO FROM EMPLOYEE;## 子查詢SELECT * FROM employee WHERE (no, dept_no) IN (SELECTno,dept_noFROM employeeWHERE salary > 4000);##any ## 類似于 in select * from employee WHERE salary = ANY (select salary from employee WHERE dept_no = 2); ## 大于最小值 select * from employee WHERE salary > ANY (select salary from employee WHERE dept_no = 2); ## 小于最大值 select * from employee WHERE salary < ANY (select salary from employee WHERE dept_no = 2);##all ## 大于最大值 select * from employee WHERE salary > ALL (select salary from employee WHERE dept_no = 2); ## 小于最小值 select * from employee WHERE salary < ALL (select salary from employee WHERE dept_no = 2);## exists SELECT * FROM employee a WHERE exists(SELECT *FROM t_dept_2 bWHERE a.dept_no = b.dept_no );## not exists SELECT * FROM employee a WHERE NOT exists(SELECT *FROM t_dept_2 bWHERE a.dept_no = b.dept_no );十一、運算符
## 算數(shù)運算符 SELECT6 + 4,6 - 4,6 / 2,6 DIV 2,6 % 4,6 MOD 4;## 結(jié)果: 10,2,3.0000,3,2,2## Why?### The MySQL DIV function is used for integer division where n is divided by m and an integer value is returned.總結(jié)
以上是生活随笔為你收集整理的mysql 基本操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。