MySQL基本使用

客户登录操作

  • 登录服务器:mysql -uroot -p123 -hlocalhost

    -u:后面跟随用户名
    -p:后面跟随密码
    -h:后面跟随IP
    
  • 退出服务器:exit或quit


SQL语句分类

  • DDL(Data Definition Language):数据定义语言

    创建、删除、修改 库、表结构
    
  • DML(Data Manipulation Language):数据操作语言

    增、删、改 表记录
    
  • DCL(Data Control Language):数据控制语言

    用来定义访问权限和安全级别
    
  • DQL(Data Query Language):数据查询语言

    用来查询记录
    

DDL 数据定义语言

1. 数据库

  • 查看所有数据库:SHOW DATABASES
  • 切换(选择要操作的)数据库:USE 数据库名
  • 创建数据库:CREATE DATABASE [IF NOT EXISTS] mydb [CHARSET=utf8]
  • 删除数据库:DROP DATABASE [IF EXISTS] mydb
  • 修改数据库编码:ALTER DATABASE mydb CHARACTER SET utf8

2. 表

  • 创建表:
    CREATE TABLE [IF NOT EXISTS] 表名(
    列名 列类型,
    列名 列类型,

    列名 列类型
    );

  • 查看当前数据库中所有表名称:SHOW TABLES;

  • 查看指定表的创建语句:SHOW CREATE TABLE 表名;

  • 查看表结构:DESC 表名;

  • 删除表:DROP TABLE 表名;

    TRUNCATE TABLE 表名:它是先drop该表,再create该表。事务 无法回滚
    
  • 修改表:ALTER TABLE 表名

    • 添加列:

      ALTER TABLE 表名 ADD (
        列名 列类型,
        列名 列类型,
          ...
      );
      
    • 修改列类型:

      如果被修改的列已存在数据,那么新的类型可能会影响到已存在数据
      ALTER TABLE 表名 MODIFY 列名 列类型;
      
    • 修改列名:

      ALTER TABLE 表名 CHANGE 原列名 新列名 列类型;
      
    • 删除列:

      ALTER TABLE 表名 DROP 列名;
      
    • 修改表名称:

      ALTER TABLE 原表名 RENAME TO 新表名;
      

DML 数据操作语言

1. 插入数据

  • INTERT INTO 表名(列名1,列名2, …) VALUES(列值1, 列值2, …);

    在表名后给出要插入的列名,其他没有指定的列等同与插入null值。所以插入记录总是插入一行,不可能是半行。
    在VALUES后给出列值,值的顺序和个数必须与前面指定的列对应
    
  • INTERT INTO 表名 VALUES(列值1, 列值2)

    没有给出要插入的列,那么表示插入所有列。
    值的个数必须是该表列的个数。
    值的顺序,必须与表创建时给出的列的顺序相同。
    

2. 修改数据

  • UPDATE 表名 SET 列名1=列值1, 列名2=列值2, … [WHERE 条件]

  • 条件(条件可选的):

    条件必须是一个boolean类型的值或表达式:UPDATE t_person SET gender='男', age=age+1 WHERE sid='1';
    运算符:=、!=、<>、>、<、>=、<=、BETWEEN...AND、IN(...)、IS NULL、NOT、OR、AND
    -------------------------------------------------------------------------------------------
      WHERE age >= 18 AND age <= 80
      WHERE age BETWEEN 18 AND 80
      WHERE name='zhangSan' OR name='liSi'
      WHERE name IN ('zhangSan', 'liSi')
      WHERE age IS NULL
      WHERE age IS NOT NULL
    

3. 删除数据

  • DELETE FROM 表名 [WHERE 条件];

DCL 数据控制语言

1. 创建用户

  • CREATE USER 用户名@IP地址 IDENTIFIED BY ‘密码’;

    用户只能在指定的IP地址上登录
    
  • CREATE USER 用户名@’%’ IDENTIFIED BY ‘密码’;

    用户可以在任意IP地址上登录
    

2. 给用户授权

  • GRANT 权限1, … , 权限n ON 数据库.* TO 用户名@IP地址

    权限、用户、数据库
    给用户分派在指定的数据库上的指定的权限
    例如;GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON mydb.* TO user001@localhost;
    给user001用户分派在mydb1数据库上的create、alter、drop、insert、update、delete、select权限
    
  • GRANT ALL PRIVILEGES ON 数据库.* TO 用户名@IP地址;

    给用户分派指定数据库上的所有权限
    PRIVILEGES可省略
    
  • GRANT ALL ON *.* TO 用户名@IP地址;

    给用户分派所有数据库上的所有权限
    

3. 撤销授权

  • REVOKE 权限1, … , 权限n ON 数据库.* FROM 用户名@IP地址;

    撤消指定用户在指定数据库上的指定权限
    例如;REVOKE CREATE,ALTER,DROP ON mydb.* FROM user001@localhost;
    撤消user001用户在mydb数据库上的create、alter、drop权限
    

4. 查看权限

  • SHOW GRANTS FOR 用户名@IP地址

5. 删除用户

  • DROP USER 用户名@IP地址

DQL 数据查询语言

练习的表

DROP DATABASE exam;
CREATE DATABASE exam;

USE exam;

/*创建部门表*/
CREATE TABLE dept(
	deptno		INT 	PRIMARY KEY,
	dname		VARCHAR(50),
	loc 		VARCHAR(50)
);

/*创建雇员表*/
CREATE TABLE emp(
	empno		INT 	PRIMARY KEY,
	ename		VARCHAR(50),
	job		VARCHAR(50),
	mgr		INT,
	hiredate	DATE,
	sal		DECIMAL(7,2),
	comm 		DECIMAL(7,2),
	deptno		INT,
	CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno)
);

1. 基本查询

字段控制
  • 查询所有列
    SELECT * FROM 表名;

  • 查询指定列
    SELECT 列1 [, 列2, … 列N] FROM 表名;

  • 记录去重
    当查询结果中的多行记录一模一样时,只显示一行。一般查询所有列时很少会有这种情况,但只查询一列(或几列)时,这总可能就大了!
    SELECT DISTINCT * | 列1 [, 列2, … 列N] FROM 表名;
    SELECT * FROM 表名 GROUP BY 某列; /*MySQL独有*/

  • 列运算

    • 数量类型的列可以做加、减、乘、除运算

      SELECT sal*1.5 FROM emp;
      
    • 字符串类型可以做连接运算

      SELECT CONCAT('$', sal) FROM emp;
      
    • 转换NULL值

      SELECT IFNULL(comm, 0)+1000 FROM emp;
      

      –> IFNULL(comm, 0):如果comm中存在NULL值,那么当成0来运算。

    • 给列起别名
      你也许已经注意到了,当使用列运算后,查询出的结果集中的列名称很不好看,这时我们需要给列名起个别名,这样在结果集中列名就显示别名了

      SELECT IFNULL(comm, 0)+1000 AS 奖金 FROM emp;
      

      –> 其中AS可以省略

条件控制
  • 条件查询
    与前面介绍的UPDATE和DELETE语句一样,SELECT语句也可以使用WHERE子句来控制记录。

    SELECT empno,ename,sal,comm FROM emp WHERE sal > 10000 AND comm IS NOT NULL;
    SELECT empno,ename,sal FROM emp WHERE sal BETWEEN 20000 AND 30000;
    SELECT empno,ename,job FROM emp WHERE job IN ('经理', '董事长');
    
  • 模糊查询
    当你想查询姓张,并且姓名一共两个字的员工时,这时就可以使用模糊查询

    SELECT * FROM emp WHERE ename LIKE '张_';
    

    –> 模糊查询需要使用运算符:LIKE,其中_匹配一个任意字符,注意,只匹配 一个 字符而不是多个。
    –> 上面语句查询的是姓张,名字由两个字组成的员工。

    SELECT * FROM emp WHERE ename LIKE '___'; /*姓名由3个字组成的员工*/
    

    如果我们想查询姓张,名字几个字都可以的员工时就要使用“%”了。

    SELECT * FROM emp WHERE ename LIKE '张%';
    

    –> 其中%匹配0~N个任意字符,所以上面语句查询的是姓张的所有员工。

    SELECT * FROM emp WHERE ename LIKE '%阿%';
    

    –> 千万不要认为上面语句是在查询姓名中间带有阿字的员工,因为%匹配0~N个字符,所以姓名以阿开头和结尾的员工也都会查询到。

    SELECT * FROM emp WHERE ename LIKE '%';
    

    –> 这个条件等同与不存在,但如果姓名为NULL的查询不出来!

2. 排序

  • 升序
    SELECT * FROM emp ORDER BY sal ASC;
    
    –> 按sal排序,升序
    –> 因为默认是升序,所以ASC是可以省略的
  • 降序
    SELECT * FROM emp ORDER BY comm DESC;
    
    –> 按comm排序,降序
    –> 其中DESC不能省略
  • 使用多列作为排序条件
    SELECT * FROM emp ORDER BY sal ASC, comm DESC;
    
    –> 使用sal升序排,如果sal相同时,使用comm的降序排

3. 常用的聚合函数

聚合函数用来做某列的纵向运算。

  • COUNT
    SELECT COUNT(*) FROM emp;
    
    –> 计算emp表中所有列都不为NULL的记录的行数
    SELECT COUNT(comm) FROM emp;
    
    –> 云计算emp表中comm列不为NULL的记录的行数
  • MAX
    SELECT MAX(sal) FROM emp;
    
    –> 查询最高工资
  • MIN
     SELECT MIN(sal) FROM emp;
    
    –> 查询最低工资
  • SUM
    SELECT SUM(sal) FROM emp;
    
    –> 查询工资合
  • AVG
    SELECT AVG(sal) FROM emp;
    
    –> 查询平均工资

4. 分组查询

分组查询是把记录使用某一列进行分组,然后查询组信息。

  • GROUP BY

    SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
    

    –> 使用deptno分组,查询部门编号和每个部门的记录数

    SELECT job, MAX(SAL) FROM emp GROUP BY job;
    

    –> 使用job分组,查询每种工作的最高工资

  • HAVING
    以部门分组,查询每组记录数。条件为记录数大于3

    SELECT deptno, COUNT(*) FROM emp GROUP BY deptno HAVING COUNT(*) > 3;
    

5. LIMIT子句

LIMIT用来限定查询结果的起始行,从起始行开始查询多少行。
例如:查询起始行为第5行,一共查询3行记录

SELECT * FROM emp LIMIT 4, 3;

–> 其中4表示从第5行开始,其中3表示一共查询3行。即第5、6、7行记录。

分页查询:

  1. 一页的记录数:10行
  2. 查询第3页

起始行 = (当前页-1) * 每页记录数
代码中常用:startRowIndex = (currentPage - 1) * pageSize

-- 20 = (3-1) * 10
select * from emp limit 20, 10;

字段约束

1. 主键约束

特点:唯一、非空、可被外键引用

  • 创建表指定主键

        CREATE TABLE stu(
    	sid	    CHAR(6) PRIMARY KEY,
    	sname	VARCHAR(20),
    	age		INT,
    	gender	VARCHAR(10) 
    	-- 或用如下方式
    	-- PRIMARY KEY(sid)
        );
    
  • 为指定的字段添加主键约束

        CREATE TABLE stu(
    	sid	    CHAR(6),
    	sname	VARCHAR(20),
    	age		INT,
    	gender	VARCHAR(10),
        );
    	-- 添加主键
        ALTER TABLE stu ADD PRIMARY KEY(sid);
        -- 删除主机
        ALTER TABLE stu DROP PRIMARY KEY;
    
  • 主键自增长

      CREATE TABLE stu(
        -- AUTO_INCREMENT
    	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;
    

2. 非空约束

  CREATE TABLE stu(
	sid INT PRIMARY KEY AUTO_INCREMENT,
	-- NOT NULL
	sname	VARCHAR(20) NOT NULL,
	age		INT,
	gender	VARCHAR(10)
  );

3. 唯一约束

  CREATE TABLE stu(
	sid INT PRIMARY KEY AUTO_INCREMENT,
	-- UNIQUE
	sname	VARCHAR(20) UNIQUE,
	age		INT,
	gender	VARCHAR(10)
  );

4. 外键约束

  • 外键必须是另一表的主键的值(外键要引用主键)
  • 外键可以重复
  • 外键可以为空
  • 一张表中可以有多个外键

语法:CONSTRAINT 约束名称 FOREIGN KEY(外键列名) REFERENCES 关联表(关联表的主键)

  • 创建表时指定外键约束
  create talbe emp (
    empno int primary key,
    ...
    deptno int,
    CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno)  
  );
  • 修改表时添加外键约束
  ALERT TABLE emp
  ADD CONSTRAINT fk_emp_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno);
  • 修改表时删除外键约束
  ALTER TABLE emp
  DROP FOREIGN KEY fk_emp_deptno;/*约束名称*/

多表查询

1. 合并结果集

  • 要求被合并的表中,列类型和列数相同
  • UNION,去除重复行
  • UNION ALL,不去除重复行

2. 连接查询

  • 内连接
    方言:SELECT * FROM 表1 别名1, 表2 别名2 WHERE 别名1.xx=别名2.xx
    标准:SELECT * FROM 表1 别名1 INNER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
    自然:SELECT * FROM 表1 别名1 NATURAL JOIN 表2 别名2
    
  • 外连接
    • 左外连接
      SELECT * FROM 表1 别名1 LEFT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
      左表记录无论是否满足条件都会查询出来,而右表只有满足条件才能出来。左表中不满足条件的记录,右表部分都为NULL
      
    • 右外连接
      SELECT * FROM 表1 别名1 RIGHT OUTER JOIN 表2 别名2 ON 别名1.xx=别名2.xx
      右表记录无论是否满足条件都会查询出来,而左表只有满足条件才能出来。右表不满足条件的记录,其左表部分都为NULL
      
    • 全外连接(MySQL不支持)
      可以使用UNION来完成全连接
      

3. 子查询

查询中有查询(查看select关键字的个数!)

  • where后作为条件存在
    • 单行单列:SELECT * FROM 表1 别名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 别名2 WHERE 条件)
    • 多行单列:SELECT * FROM 表1 别名1 WHERE 列1 [IN, ALL, ANY] (SELECT 列 FROM 表2 别名2 WHERE 条件)
    • 单行多列:SELECT * FROM 表1 别名1 WHERE (列1,列2) IN (SELECT 列1, 列2 FROM 表2 别名2 WHERE 条件)
  • from后作为表存在
    • 多行多列:SELECT * FROM 表1 别名1 , (SELECT …) 别名2 WHERE 条件
  • select后
    • 单行单列:SELECT d.*, (SELECT COUNT(*) FROM emp WHERE deptno= d.deptno) AS countNum FROM dept AS d;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值