MySql-基本語句
阿新 • • 發佈:2018-12-26
DDl 資料定義語言
#1. 建立表 CREATE TABLE #方式一: CREATE TABLE emp3( id INT, NAME VARCHAR(20), birthday DATE, salary DOUBLE(10,2) ) CREATE TABLE emp2( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10) ) #方式二:基於現有表建立新表(相當於表的複製) CREATE TABLE mep4 AS SELECT id,NAME FROM emp; CREATE TABLE emp5 AS SELECT * FROM emp; CREATE TABLE emp4 AS SELECT employee_id, last_name, salary FROM employees WHERE department_id = 90; #基於現有表建立新表,但是不匯入資料 CREATE TABLE emp5 AS SELECT employee_id, last_name, salary FROM employees WHERE 1 = 2;
DML : 資料操縱語言
#1. 新增資料 INSERT INTO emp VALUES(101, '張三', '1990-01-01', 10000); INSERT INTO emp(id, NAME, hire_ddate) VALUES(103, '李四', '1990-01-01'); INSERT INTO emp(salary) VALUES(8888); #基於現有表匯入資料 INSERT INTO emp SELECT employee_id, last_name, phone_number, salary FROM employees WHERE department_id = 90; INSERT INTO emp(id, NAME, salary) SELECT employee_id, last_name, salary FROM employees; #2. 刪除資料 DELETE FROM emp WHERE id = 0; DELETE FROM emp WHERE id IS NULL; #3. 修改資料 UPDATE emp SET hire_ddate = '1990-11-11' WHERE id = 103; UPDATE emp SET hire_ddate = '1989-11-11', salary = 20000.00 WHERE id = 101; #4. 查詢 SELECT * FROM emp;
DCL : 資料控制語言(對DDL語言無法進行回滾)
SET autocommit = FALSE;(取消自動提交)
COMMIT;
ROLLBACK;
常用sql語句
SELECT employee_id,last_name,salary AS SAL,salary*12*(1+IFNULL(commission_pct,0)) AS "annul salary" FROM employees; 字元型和日期型值必須使用在單引號中, SELECT employee_id,last_name,salary,department_id FROM employees WHERE last_name='KING'; #between ... and ... (包含邊界) 數值小的在前面 SELECT employee_id,last_name,salary,department_id FROM employees WHERE salary BETWEEN 6000 AND 10000 ; SELECT * FROM employees WHERE salary>=6000 AND salary<=8000 AND commission_pct IS NOT NULL #in用法 SELECT employee_id,last_name,salary,department_id FROM employees WHERE department_id IN (60,80,90); SELECT employee_id,last_name,salary,department_id FROM employees WHERE department_id NOT IN (60,80,90); SELECT employee_id,last_name,salary,commission_pct FROM employees WHERE commission_pct IS NOT NULL; # 模糊查詢 like #1. % : 表示0個或多個的任意字元 # 顯示名字包含 e 的員工資訊 SELECT employee_id ,last_name,salary,department_id FROM employees WHERE last_name LIKE '%e%'; # _ : 表示1個任意字元 #2 顯示第二個字母是 e 的員工資訊 SELECT employee_id,last_name,salary FROM employees WHERE last_name LIKE '_e%'; #3 返回名字中有_的員工 SELECT employee_id,last_name,salary FROM employees WHERE last_name LIKE '%/_%' ESCAPE '/'; -- 此處可以用任意當轉義字元 # 顯示出表employees中的全部job_id(不能重複) SELECT DISTINCT job_id FROM employees; #按別名排序 SELECT last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) "年薪" FROM employees ORDER BY 年薪 DESC; 此處別名不加雙引號 #格式化日期 select * from t_apply_pay where DATE_FORMAT(createTime,'%Y-%m-%d') = '2018-12-05'; select * from t_apply_pay where createTime >= '2018-12-05 00:00:00' AND createTime <'2018-12-06 00:00:00'; #10 #包含邊界 select * from t_apply_pay where createTime BETWEEN '2018-12-05 00:00:00' AND '2018-12-05 23:59:59'; #按照年月日分組 select year(createTime),month(createTime),day(createTime),count(0) from t_apply_pay GROUP BY year(createTime),month(createTime),day(createTime);
#二 多表查詢
/*根據查詢情況不同 多表查詢可以分為以下幾種
①等值連線 - 非等值連線
②內連線 - 外連線
③自連線 - 非自連線
*/
#問題:當完成多表查諮詢時,容易引發 笛卡爾集 的情況 如下 原因:缺少表之間的連線情況
SELECT employee_id,department_name
FROM employees,departments;
#增連線條件 解決加笛卡爾集 和下面內連線語句效果一樣
SELECT employee_id,department_name
FROM employees,departments;
WHERE employees.`department_id`=departments.`department_id`;
#內連線(將兩個表中滿足條件的資料查出來) sql99語法適合所有資料庫
SELECT employee_id,e.deoartment_id,department_name
FROM employees e
INNER JOIN departments d -- inner join(內連線) inner可以省略不寫
ON e.`department_id`=d.`department_id`;
# 外連線:不僅將多個表中滿足條件的資料查詢出來,還將不滿足條件的資料查詢出來
-- 左外連線:不僅將多個表中滿足條件的資料查詢出來,還將 左表 中不滿足條件的資料查詢出來
SELECT employee_id,last_name,e.department_id,department_name
FROM employees e
LEFT OUTER JOIN departments d
ON e.`department_id`=d.`department_id`;
-- 右外連線:不僅將多個表中滿足條件的資料查詢出來,還將 右表 中不滿足條件的資料查詢出來
SELECT employee_id,last_name,e.department_id,department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON e.`department_id`=d.`department_id`;
#以上是非自連線
#自連線(一個表之間的連線,將一個表看作兩個表即可)
# xxx works for xxx
SELECT CONCAT(e.last_name,' works for ',m.last_name)
FROM employees e
JOIN employees m
ON e.`manager_id`=m.`employee_id`
下面用圖示的方法表示sql的七連線
建表語句
CREATE TABLE `tbl_dept` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`deptName` VARCHAR(30) DEFAULT NULL,
`locAdd` VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `tbl_emp` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) DEFAULT NULL,
`deptId` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_dept_id` (`deptId`)
#CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `tbl_dept` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO tbl_dept(deptName,locAdd) VALUES('RD',11);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('HR',12);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('MK',13);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('MIS',14);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('FD',15);
INSERT INTO tbl_emp(NAME,deptId) VALUES('z3',1);
INSERT INTO tbl_emp(NAME,deptId) VALUES('z4',1);
INSERT INTO tbl_emp(NAME,deptId) VALUES('z5',1);
INSERT INTO tbl_emp(NAME,deptId) VALUES('w5',2);
INSERT INTO tbl_emp(NAME,deptId) VALUES('w6',2);
INSERT INTO tbl_emp(NAME,deptId) VALUES('s7',3);
INSERT INTO tbl_emp(NAME,deptId) VALUES('s8',4);
INSERT INTO tbl_emp(NAME,deptId) VALUES('s9',51);
七圖中FULL OUTRE JOIN... ON...在orcal中可以,在mysql中用union來實現
單行函式:方法中傳入單行變數,返回結果為一個值
#轉換大小寫的函式
SELECT LOWER ('HelloWorld') 轉小寫,UPPER('HelloWorld') "轉大寫";
#拼串的函式
SELECT CONCAT('Hello','World') 拼串兒;
#擷取字串
-- 注意:SQL中的索引是從1開始
-- 從第幾個索引位置開始,擷取幾個
-- substr後不能有空格,否則方法報錯
SELECT SUBSTR('HelloWorld',2,5);
#字元個數
SELECT LENGTH('HelloWorld');
#某個字元出現的索引位置,沒有返回0
SELECT INSTR('Helloworld','o');
SELECT INSTR('Helloworld','or');
#去除首尾指定字元,包括空格
SELECT TRIM('H' FROM 'HelloWHHorldHH'),TRIM(' ' FROM ' HelloWHHorldHH ');
#替換
SELECT REPLACE('abcbbdbbbBBBe','b','m');
#對數字四捨五入
SELECT ROUND(163.4556,0),ROUND(163.456,-2);
#截斷數字
SELECT TRUNCATE(163.456,2),TRUNCATE(163.456,0),TRUNCATE(163.456,-2);
#求餘數
SELECT MOD(15,2),MOD(15,3),MOD(5,10);
#練習:查詢部門號為 所有 的員工資訊, 若部門號為 10,則列印其工資的 1.1 倍,
# 部門號為 20,則列印其工資的 1.2 倍,
# 部門號為 30,則列印其工資的 1.3 倍,
# 其他列印其工資的 1.4 倍.
SELECT last_name,department_id,salary,CASE department_id WHEN 10 THEN salary*1.1
WHEN 20 THEN salary*1.2
WHEN 30 THEN salary*1.3
ELSE salary*1.4
END haha #haha為別名,job_id
FROM employees
組行數(多行函式):方法中傳入多行變數,返回一個值
#組函式
#MAX() MIN() SUM() AVG() COUNT()
#組函式不計算空值
SELECT COUNT(commission_pct)
FROM employees;
SELECT AVG(commission_pct), SUM(commission_pct) / COUNT(IFNULL(commission_pct, 0))
FROM employees;
#group by 分組
#求出 employees 表中各個部門的平均工資
SELECT department_id,AVG(salary)
FROM employees
GROUP BY department_id;
#求出每個部門中每個工種(job_id)的平均工資
SELECT department_id,job_id,AVG(salary)
FROM employees
GROUP BY department_id,job_id;
#where 子句不能過濾組函式。 需要 having
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 8000;
#分頁公式:
#limit (當前頁數-1)*每頁條數,每頁條數
#SELECT * FROM table LIMIT(PageNo - 1)*PageSize,PageSize
SELECT * FROM employees LIMIT (1-1)*10, 10; -- 第1頁
SELECT * FROM employees LIMIT (2-1)*10, 10; -- 第2頁
SELECT * FROM employees LIMIT (n-1)*10, 10; -- 第n頁