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页

猜你喜欢

转载自blog.csdn.net/wxd_1024/article/details/84842719