zoukankan      html  css  js  c++  java
  • MySQL常用语句总结

    一、SQL的分类

    1、DDL:数据定义语言
    2、DML:数据操作语言
    3、DCL:数据控制语言
    4、DQL:数据查询语言(从DML中抽取出来的)

    二、DDL

    (一)操作数据库

    1、创建数据库查看所有数据库名称:

    CREATE DATABASE [IF NOT EXISTS] mydb1;
    

    2、切换数据库:

    USE mydb1,  -- 切换到mydb1数据库;
    

    3、查看所有数据库名称:

    SHOW DATABASES;
    

    4、删除数据库

    DROP DATABASE [IF EXISTS] mydb1;
    

    5、修改数据库编码

    ALTER DATABASE mydb1 CHARACTER SET utf8
    
    (二)操作表

    1、创建表

    CREATE TABLE stu(
    	sid	    CHAR(6),
    	sname	VARCHAR(20),
    	age		INT,
    	gender	VARCHAR(10) 
    );
    

    2、查看当前数据库中所有表名称

    SHOW TABLES;
    

    3、查看指定表的创建语句

    SHOW CREATE TABLE emp	-- 查看emp表的创建语句;
    

    4、查看表结构

    DESC emp 	-- 查看emp表结构;
    
    

    5、删除表

    DROP TABLE emp 	-- 删除emp表;
    
    

    6、修改表

    1.修改之添加列:给stu表添加classname列:
    	ALTER TABLE stu ADD (classname varchar(100));
    2.修改之修改列类型:修改stu表的gender列类型为CHAR(2):
    	ALTER TABLE stu MODIFY gender CHAR(2);
    3.修改之修改列名:修改stu表的gender列名为sex:
    	ALTER TABLE stu change gender sex CHAR(2);
    4.修改之删除列:删除stu表的classname列:
    	ALTER TABLE stu DROP classname;
    5.修改之修改表名称:修改stu表名称为student:
    	ALTER TABLE stu RENAME TO student;
    
    

    三、DML

    1、插入数据

    INSERT INTO stu(sid, sname,age,gender) VALUES('s_1001', 'zhangSan', 23, 'male');
    
    INSERT INTO stu(sid, sname) VALUES('s_1001', 'zhangSan');
    
    INSERT INTO stu VALUES('s_1002', 'liSi', 32, 'female');
    
    

    2、修改数据

    UPDATE stu SET sname=’zhangSanSan’, age=’32’, gender=’female’ WHERE sid=’s_1001’;
    UPDATE stu SET gender=’female’ WHERE gender IS NULL
    UPDATE stu SET age=age+1 WHERE sname=’zhaoLiu’;
    
    

    3、删除数据

    DELETE FROM stu WHERE sid=’s_1001’003B
    
    DELETE FROM stu;
    
    

    4、查询数据(在后面有详细总结)

    四、DCL

    1、创建用户

    CREATE USER 用户名@地址 IDENTIFIED BY '密码';
    
    CREATE USER user1@localhost IDENTIFIED BY ‘123’; 
    	-- user1用户只能在localhost这个IP登录mysql服务器
    CREATE USER user2@’%’ IDENTIFIED BY ‘123’;
    	-- user2用户可以在任何电脑上登录mysql
    
    

    2、给用户授权

    GRANT 权限1, … , 权限n ON 数据库.* TO 用户名
    
    GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb1.* TO user1@localhost;
    GRANT ALL ON mydb1.* TO user2@localhost;
    
    

    3、查看用户权限

    SHOW GRANTS FOR 用户名
    
    SHOW GRANTS FOR user1@localhost;
    
    

    4、撤销授权

    REVOKE权限1, … , 权限n ON 数据库.* FORM 用户名
    
    REVOKE CREATE,ALTER,DROP ON mydb1.* FROM user1@localhost;
    
    

    5、删除用户

    DROP USER 用户名
    
    DROP USER user1@localhost;
    
    

    6、修改用户密码

    USE mysql;
    UPDATE USER SET PASSWORD=PASSWORD(‘密码’) WHERE User=’用户名’ and Host=’IP’;
    FLUSH PRIVILEGES;
    
    USE mysql;
    UPDATE USER SET PASSWORD=PASSWORD('1234') WHERE User='user2' and Host=’localhost’;
    FLUSH PRIVILEGES;
    
    

    五、DQL

    (一)数据查询语法
    SELECT selection_list 			/*要查询的列名称*/
    FROM table_list 				/*要查询的表名称*/
    WHERE condition 				/*行条件*/
    GROUP BY grouping_columns 	 	 /*对结果分组*/
    HAVING condition 				/*分组后的行条件*/
    ORDER BY sorting_columns 		 /*对结果分组*/
    LIMIT offset_start, row_count 	 /*结果限定*/
    
    
    (二)常见查询方式

    1、基础查询

    SELECT * FROM stu;				 -- 查询所有列
    
    SELECT sid, sname, age FROM stu;  -- 查询指定列
    
    

    2、条件查询

    条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:
    =、!=、<>、<、<=、>、>=;
    BETWEEN…AND;
    IN(set);
    IS NULL;
    AND;
    OR;
    NOT;
    
    
    /*查询性别为女,并且年龄50的记录*/
    SELECT * FROM stu 
    WHERE gender='female' AND ge<50;
    
    /*查询学号为S_1001,S_1002,S_1003的记录*/
    SELECT * FROM stu 
    WHERE sid IN ('S_1001','S_1002','S_1003');
    
    /*查询年龄为null的记录*/
    SELECT * FROM stu
    WHERE age IS NULL;
    
    

    3、模糊查询

    /*查询姓名以“z”开头的学生记录*/
    SELECT * 
    FROM stu
    WHERE sname LIKE 'z%';
    
    /*查询姓名中第2个字母为“i”的学生记录*/
    SELECT * 
    FROM stu
    WHERE sname LIKE '_i%';
    
    

    4、字段控制查询

    /*去除重复记录*/
    SELECT DISTINCT sal FROM emp;
    
    /*查看雇员的月薪与佣金之和*/
    SELECT *,sal+comm FROM emp;
    
    /*comm列如果有记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。下面使用了把NULL转换成数值0的函数IFNULL:*/
    SELECT *,sal+IFNULL(comm,0) FROM emp;
    
    /*给列名添加别名*/
    SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
    SELECT *,sal+IFNULL(comm,0) total FROM emp; -- 省略AS关键字
    
    

    5、排序

    /*查询所有学生记录,按年龄降序排序*/
    SELECT *
    FROM stu
    ORDER BY age DESC;
    
    /*查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序*/
    SELECT * FROM emp
    ORDER BY sal DESC,empno ASC;
    
    

    6、聚合函数

    聚合函数是用来做纵向运算的函数:
    COUNT():统计指定列不为NULL的记录行数;
    MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
    MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
    SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
    AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
    
    
    /*查询emp表中月薪大于2500的人数*/
    SELECT COUNT(*) FROM emp
    WHERE sal > 2500;
    
    /*查询最高工资和最低工资*/
    SELECT MAX(sal), MIN(sal) FROM emp;
    
    /*查询所有雇员月薪和*/
    SELECT SUM(sal) FROM emp;
    
    /*统计所有员工平均工资*/
    SELECT AVG(sal) FROM emp;
    
    

    7、分组查询

    /*查询每个部门的部门编号以及每个部门的人数*/
    SELECT deptno,COUNT(*)
    FROM emp
    GROUP BY deptno;
    
    /* HAVING子句 */
    /*查询工资总和大于9000的部门编号以及工资和*/
    SELECT deptno, SUM(sal)
    FROM emp
    GROUP BY deptno
    HAVING SUM(sal) > 9000;
    
    -- 或者
    SELECT deptno, SUM(sal) total
    FROM emp
    GROUP BY deptno
    HAVING total > 9000;
    
    

    8、LIMIT

    -- LIMIT用来限定查询结果的起始行,以及总行数。
    
    /*查询5行记录,起始行从0开始*/
    SELECT * FROM emp LIMIT 0, 5;
    
    /*查询10行记录,起始行从3开始*/
    SELECT * FROM emp LIMIT 3, 10;
    
    
    (三)多表查询

    1、合并结果集

    作用:合并结果集就是把两个select语句的查询结果合并到一起!
    
    合并结果集有两种方式:
    UNION:去除重复记录,例如:SELECT * FROM t1 UNION SELECT * FROM t2;
    UNION ALL:不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。
    
    要求:被合并的两个结果:列数、列类型必须相同
    
    
    SELECT * FROM cd
    UNION 
    SELECT * FROM ab;
    
    

    2、内连接

    -- 特殊用法(不建议使用)
    SELECT e.ename, e.sal, d.dname
    FROM emp e, dept d  
    WHERE e.deptno = d.deptno;
    
    -- 标准用法(建议使用)
    SELECT e.ename, e.sal, d.dname
    FROM emp e INNER JOIN dept d 
    ON e.deptno=d.deptno
    
    

    3、外连接(左连接、右连接)
    外连接的特点:查询出的结果存在不满足条件的可能。
    左连接是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL。

    -- 左外连接
    SELECT e.ename, e.sal, d.dname
    FROM emp e LEFT OUTER JOIN dept d
    ON e.deptno=d.deptno
    
    

    右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。

    -- 右外连接
    SELECT e.ename, e.sal, d.dname
    FROM emp e RIGHT OUTER JOIN dept d
    ON e.deptno=d.deptno
    
    
    -- 全外连接(mysql不支持全外连接,但是我们可以使用合并结果集来达到同样的效果),了解即可
    SELECT e.ename, e.sal, d.dname
    FROM emp e LEFT OUTER JOIN dept d
    ON e.deptno=d.deptno
    UNION
    SELECT e.ename, e.sal, d.dname
    FROM emp e RIGHT OUTER JOIN dept d
    ON e.deptno=d.deptno
    
    

    4、自然连接
    两张连接的表中名称和类型完成一致的列作为条件,例如emp和dept表都存在deptno列,并且类型一致,所以会被自然连接找到!

    -- 自然连接(可读性较差,不建议使用)
    /* 自然连接的原理:使用该方法,mysql会自动的去找两张表中相同的列,然后列值相同的记录进行匹配后输出*/
    SELECT e.ename, e.sal, d.dname
    FROM emp e NATURAL JOIN dept d
    
    
    -- 自然连接其他的查找条件的方式
    SELECT * FROM emp NATURAL JOIN dept;
    SELECT * FROM emp NATURAL LEFT JOIN dept;
    SELECT * FROM emp NATURAL RIGHT JOIN dept;
    
    

    5、子查询
    子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。
    子查询出现的位置:
    where后,作为条件的一部分;
    from后,作为被查询的一条表;

    /* 找出本公司工资最高的员工信息 */		-- 单行单列
    SELECT * FROM emp where sal=(SELECT max(sal) FROM emp)	
    
    /* 找出本公司中高于30部门所有员工工资的员工信息 */	-- 多行一列
    SELECT * 
    FROM emp
    WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30)
    
    /* 查询工资和部门与殷天正完全相同的员工信息 */
    /* 即:找出殷天正所在部门中,和他工资相同的员工信息 */	-- 单行多列
    SELECT * 
    FROM emp
    WHERE (sal, deptno) IN (SELECT sal,deptno FROM emp WHERE ename='殷天正')
    
    /* 可以对查询出的表进行二次查询 */
    /*例如:先找出30部门的所有员工,然后找出奖金不为空的员工姓名和工资*/ 	-- 多行多列
    SELECT e.ename, e.sal 
    FROM (SELECT * FROM emp WHERE deptno=30) e		
    WHERE comm IS NOT NULL;
    
    /*
    1、单行单列:表示条件,相当于聚合函数的作用,通常用于where中
    2、单行多列:相当于一个对象,比较少见
    3、多行单列:相当于一个集合
    4、多行多列:表示一个查询出来的表,通常用在from中,进行二次查询
    */
    
    

    六、完整性约束

    1、主键约束
    当某一列添加了主键约束后,具有以下特点:
    a. 非空
    b. 唯一
    c. 被其他表引用

    /*创建表:定义列时指定主键*/
    CREATE TABLE stu(
    	sid	    CHAR(6) PRIMARY KEY,
    	sname	VARCHAR(20),
    	age		INT,
    	gender	VARCHAR(10) 
    );
    
    /*创建表:定义列之后独立指定主键*/
    CREATE TABLE stu(
    	sid	    CHAR(6),
    	sname	VARCHAR(20),
    	age		INT,
    	gender	VARCHAR(10),
    	PRIMARY KEY(sid)
    );
    
    /*修改表时指定主键*/
    ALTER TABLE stu
    ADD PRIMARY KEY(sid);
    
    /*删除主键(只是删除主键约束,而不会删除主键列)*/
    ALTER TABLE stu 
    DROP PRIMARY KEY;
    
    

    2、主键自增长
    MySQL提供了主键自动增长的功能!这样用户就不用再为是否有主键,是否重复而烦恼了。当主键设置为自动增长后,在没有给出主键值时,主键的值会自动生成,而且是最大主键值+1,也就不会出现重复主键的可能了。

    /*创建表时设置主键自增长(主键必须是整型才可以自增长)*/
    CREATE TABLE stu(
    	sid INT PRIMARY KEY AUTO_INCREMENT,
    	sname	VARCHAR(20),
    	age		INT,
    	gender	VARCHAR(10)
    );
    
    /*修改表时设置主键自增长*/
    ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;
    
    /*修改表时删除主键自增长*/
    ALTER TABLE stu CHANGE sid sid INT;
    
    

    3、非空约束
    指定非空约束的列不能没有值,也就是说在插入记录时,对添加了非空约束的列一定要给值;在修改记录时,不能把非空列的值设置为NULL。

    指定非空约束:
    CREATE TABLE stu(
    		sid INT PRIMARY KEY AUTO_INCREMENT,
    		sname VARCHAR(10) NOT NULL,
    		age		INT,
    		gender	VARCHAR(10)
    );
    
    

    4、唯一
    还可以为字段指定唯一约束!当为字段指定唯一约束后,那么字段的值必须是唯一的。这一点与主键相似!

    CREATE TABLE tab_ab(
    	sid INT PRIMARY KEY AUTO_INCREMENT,
    	sname VARCHAR(10) UNIQUE
    );
    
    

    5、外键约束
    主外键是构成表与表关联的唯一途径!
    外键是另一张表的主键!例如员工表与部门表之间就存在关联关系,其中员工表中的部门编号字段就是外键,是相对部门表的外键。

    /*创建t_user表,指定uid为主键列*/
    CREATE TABLE t_user(
    	uid	INT PRIMARY KEY AUTO_INCREMENT,
    	uname	VARCHAR(20) UNIQUE NOT NULL
    );
    
    /*创建t_section表,指定sid为主键列,u_id为相对t_user表的uid列的外键*/
    CREATE TABLE t_section(
    	sid	INT PRIMARY KEY AUTO_INCREMENT,
    	sname	VARCHAR(30),
    	u_id	INT,
    	CONSTRAINT fk_t_user FOREIGN KEY(u_id) REFERENCES t_user(uid)
    );
    
    
    /*修改t_section表,指定u_id为相对t_user表的uid列的外键*/
    ALTER TABLE t_section 
    ADD CONSTRAINT fk_t_user FOREIGN KEY(u_id) REFERENCES t_user(uid);
    
    /*修改t_section表,删除u_id的外键约束*/
    ALTER TABLE t_section
    DROP FOREIGN KEY fk_t_user;
    
    

    七、编码相关命令

    1、查看MySQL编码
    SHOW VARIABLES LIKE 'char%';
    2、修改character_set_client变量
    set character_set_client=gbk;
    3、修改character_set_results变量
    set character_set_results=gbk;

  • 相关阅读:
    腾讯蓝鲸cmdb部署
    Linux 检测 tls
    MongoDB主从
    rundeck配置salt-api
    salt-api 配置使用
    rsync同步备份
    su与su -,sudo 的区别
    Redis 迁移 DB; move key db
    数据结构与算法面试题80道(36)
    数据结构与算法面试题80道(35)
  • 原文地址:https://www.cnblogs.com/Java-biao/p/12763575.html
Copyright © 2011-2022 走看看