1. 程式人生 > >MySql-基本語句

MySql-基本語句

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頁