MySql教程

MySQL学习

本文主要是介绍MySQL学习,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1、环境需要

mysql数据库的环境 mysql-installer-community-5.7.28.0.msi

数据库的可视化操作工具 SQLyog-11.2.5-0.x64.exe

安装完以后找到安装路径下bin目录 在此目录下打开cmd 输入mysql -uroot -p ####  ,检查是否安装成功,这里的###表示登录数据库的密码

成功登录会显示

打开可视化工具,输入对应端口号和账号密码,即可打开对应数据库可视化界面

 2、数据库概述

  数据库的操作包括SQL语句,约束,分页

3、SQL语句

  Structural query language-----SQL分为以下三种类型

  DML:Data Manipulation Language 数据操作语言

  DDL:Data Definition Language 数据定义语言

  DCL:Data Control Language 数据控制语言

  3.1 DML 

    查询操作 

    #查询表中所有内容

    select *

    from 表名 ;

    #查找表中指定内容

    select 字段名1,字段名2,........

    from 表名;

    #查找满足判断条件的内容

    select *                #注意这里的判断条件  大于>,小于<,等于=,大于等于>=,小于等于<=,不等于<>,也可以加逻辑运算符 与and,或or,^非 
    from 表名        #模糊查询也可以作为判断条件 用法:select * from 表 where name like '_\_%'; 
    where 判断条件;     #%表示任意个数任意字符, _表示任意一个字符 ,\_转义字符,
     #查询条件的转移字符也可以用关键字escape声明
    WHERE first_name LIKE '_$_%' ESCAPE '$'; # escape:指定转义字符

     #特殊运算符

    in(等于列表中的任意一个)       any( 和子查询=中某一个值比较)    all(和子查询中所有的值进行比较)

    #排序

# 查询所有部门的名字,location_id,员工数量和工资平均值

SELECT employees.`department_id`,departments.`department_name`,departments.`location_id`,AVG(salary),COUNT(1)
FROM employees JOIN departments
ON employees.`department_id` = departments.`department_id`
GROUP BY employees.`department_id`,departments.`department_name`;
ORDER BY
employees.`department_id` asc
#ORDER BY是负责排序的,此地方结果按department_id排序,默认增序, 有(desc/asc)俩个选项

    #表的连接  


  /*

    #表本身自己连接  vs 不同的表连接
    自连接 vs 非自连接  

    #连接的表以表中某个值相等的连接 vs 笛卡尔积(全集)或外连接
    等值连接 vs 非等值连接

    #以下详细说明
    内连接 vs 外连接
  */

/*
内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL). 
*/
#内连接 :获取所有员工的姓名和部门名称
select e.first_name,d.department_name
from employees e join departments d
on e.department_id = d.department_id;

#左外连接 :获取所有的员工及部门名称
select e.first_name,d.department_name
from employees e left join departments d
on e.department_id = d.department_id;

#右外连接 :获取所有的部门及员工
select e.first_name,d.department_name
from employees e right join departments d
on e.department_id = d.department_id;
#将右外连接变成左外连接
select e.first_name,d.department_name
from departments d left join employees e
on e.department_id = d.department_id;
#总结:外连接包括内连接里面不满足条件且是某一个表的全集。

    #sql自带的函数

#单行函数
/*
LOWER('SQL Course') : 将内容全部转为小写
UPPER('SQL Course') :将内容全部转为大写
CONCAT('Hello', 'World') : 将两个字符进行拼接
SUBSTR('HelloWorld',1,5) : 将字符串从1的位置开始截取子串长度为5。(索引从1开始)
LENGTH('HelloWorld') : 字符串长度
INSTR('HelloWorld', 'W') :w在当前字符串中首次出现的位置
LPAD(salary,10,'*') :向右对齐
RPAD(salary, 10, '*') :向左对齐
TRIM('H' FROM 'HelloWorld') : 去除字符串两端指定的字符H
REPLACE('abcd','b','m') : 将当前字符串中的b替换成m
ROUND: 四舍五入
ROUND(45.926, 2)            45.93
TRUNCATE: 截断
TRUNCATE(45.926)              45
MOD: 求余
MOD(1600, 300)                  100
now() : 当前日期和时间
#注意组函数,只能出现在分组里面(having)或查询语句(select)上
/*
组函数
AVG() :求平均数
SUM(): 求和
MAX():求最大值
MIN() :求最小值
COUNT() : 求数量

#avg()和sum() : 注意只能运算数值类型的数据
#处理的数据不包括null

#max()和min() :注意只能运算数值,日期,字符串

count(字段名) : 统计的时候不包括null
count(*) : 统计表中所有的数据的条数(个别字段为null不受影响)。
count(数值) : 统计表中所有的数据的条数。
    每条数据都会"存放"该数值然后统计该数值的个数。
    效率比count(*)高
*/
/*
#通用函数
IFNULL(commission_pct,0) : 如果commission_pct中的内容为null那么就用0替换
----------------------等值------------------------
case 字段名
when 值1 then 相应的操作1
when 值1 then 相应的操作2
....
else
    相应的操作
end

----------------------非等值----------------

case 
when 条件1 then 相应的操作1
when 条件2 then 相应的操作2
....
else
    相应的操作
end
*/

#if表达式
#if(条件表达式,值1,值2) :如果条件表达式的值为true结果为值1,否则为值2
#去重函数
#distinct 字段名: 去除重复的数据
   

    #分组和过滤

#分组group by
#过滤having 
/*
    select 字段名1,字段名299
    from 表名
    group by 字段名1,字段名2......
*/
/*
 having 过滤条件
 
 having和where的不同点?
 1.having后面可以现出组函数,where后面不能出现组函数
 2.过滤条件如果可以出现在where或having后面,那么优先放在where后面(不影响结果)
*/

     #插入和删除(对表里的数据操作)

#插入单行数据
insert into 表名(字段名1,字段名2...) values(value1,value2......)
#插入多行数据
insert into 表名(字段名1,字段名2...) values(value1,value2......),(value1,value2......).....
#如果插入数据时是全字段插入,那么表名后面的字段可以省略
insert into 表名 values(value1,value2......)
#基于现有的表中的数据插入到当前表中
#注意:数据类型必须保持一致
insert into 表名(字段名1,字段名2....)
select 字段名1,字段名2.....
from 表名

#删除表数据
delete from 表名; #删除表中所有内容
delete from 表名 where 过滤条件;

#修改表中所有的指定字段的值
update 表名 set 字段名1=value1,字段名2=value2... 
update 表名 set 字段名1=value1,字段名2=value2...  where 过滤条件

#删除的区别
1.truncate删除的内容不能回滚,delete删除的内容可以回滚(前提是要开启事务)
2.如果删除的数据不用回滚那么优先truncate因为效率高一些

  3.2DDL创建和管理表

    #一般操作

#创建库
create database 库名;
#删除库
drop database 库名;
#选库
use 库名;
#查看库中所有的表
show tables;
#删除表
drop table 表名;
#查看表和库的信息
show create database/table 库名/表名;
#指定库的编码集
create database 库名 character set '编码集';
#指定表的编码集
create table 表名(
字段名 类型
.......
)character set ‘编码集’

    #创建表

        注意常见的数据类型

INT

从-2^31到2^31-1的整型数据。存储大小为 4个字节

CHAR(size)

定长字符数据。若未指定,默认为1个字符,最大长度255

VARCHAR(size)

可变长字符数据,根据字符串实际长度保存,必须指定长度

FLOAT(M,D)

单精度,M=整数位+小数位,D=小数位。 D<=M<=255,0<=D<=30,默认M+D<=6

DOUBLE(M,D)

双精度。D<=M<=255,0<=D<=30,默认M+D<=15

DATE

日期型数据,格式’YYYY-MM-DD’

BLOB

二进制形式的长文本数据,最大可达4G

TEXT

长文本数据,最大可达4G

    1、白手起家法

create table 表名(
id int,
name varchar(20),
........
)

     2、根据查询表的结果创建表(没有原表的约束条件)

create table 表名
select 字段名1.......
from 表名;

    #对表进行操作(增减列和行)

    对表名修改 alter table 原表名 rename to 新表名;

    格式: alter table 表名 add/drop/modify/change column .....

#添加列
ALTER TABLE person ADD COLUMN sex CHAR;
#修改列的名称
ALTER TABLE person CHANGE COLUMN age2 age3 CHAR;
#修改列的类型
ALTER TABLE person MODIFY COLUMN sex INT;
#删除列
ALTER TABLE person DROP COLUMN birthday;
#清空表
TRUNCATE TABLE emp;

 

  3.3DCL数据库事务

讲事务就要谈案例

例子:小A到银行取钱给小B转账1000元

处理过程: 小A账户-1000元   ------------ 小B账户+1000元

事务完成

但是,当小A账户钱扣掉后,银行停电或出现意外时,事务终止,此时就会出现错误,小A的钱扣掉了,但是小B的钱没加

问题的解决:引入事务概念

      当任务开始进行时,开启事务

      任务顺利完成时,结束事务,也可以说时提交事务

      当出现错误时,数据开始回滚到开启事务的状态,然小A和小B账号的数据回到没有转账的状态

 

mysql中的事务操作

开启事务 :set autocommit=false;
提交事务 :commit;
回滚事务 : rollback;

java中事务的处理

try{
   1.开启事务 : set autocommit=false;
   2.AA-100 : 900 
   ---------发生异常了--------
   3.BB+100 : 执行不了
    commit;
}catch(Exception e){
    回滚数据;
}finally{
    set autocommit=true;
}

 

4、约束

  #约束的种类

/*
    NOT NULL 非空约束,规定某个字段不能为空
    UNIQUE  唯一约束,规定某个字段在整个表中是唯一的
    PRIMARY KEY  主键(非空且唯一)
    FOREIGN KEY  外键
    DEFAULT  默认值
    CHECK  检查约束(mysql不支持)
*/
/*
  约束: 列级约束 vs 表级约束
  列级约束 :只能约束一列。
  表级约束 :可以同时约束多列。
  注意 :not null和default只有列级约束。
*/

  #约束的创建

  1、创建表时增加约束

#添加列级约束
CREATE TABLE stu(
id INT PRIMARY KEY,#主键约束(非空且唯一,只要是表一定有主键约束)
age INT DEFAULT 18,#如果没有给该字段插入数据那么默认插入18
NAME VARCHAR(20) NOT NULL,
sid INT UNIQUE #唯一维束内容不能相同
);
#添加表级约束
CREATE TABLE stu2(
id INT,
age INT,
NAME VARCHAR(20),
passwd VARCHAR(20),
sid INT,
#添加表级约束--可以同时约束多个列
CONSTRAINT stu_id PRIMARY KEY(id),
CONSTRAINT stu_name_pwd UNIQUE(NAME,passwd)
);

  2、表创建成功之后添加约束

/*
primary key

添加约束 : alter table 表名 add primary key (字段名)

修改约束 : alter table 表名 modify  字段名 类型 primary key

删除约束 : alter table 表名 drop primary key

unique:

添加约束 : alter table 表名  add unique(字段名)

添加约束 : alter table 表名 add constraint  索引名 unique(字段名)

修改约束 :alter table 表名 modify 字段名 类型  unique

删除约束 :alter table 表名 **drop** index 索引名
*/
#表创建成功以后添加约束
CREATE TABLE s(
id INT,
NAME VARCHAR(20),
age INT
)
#添加约束
ALTER TABLE s ADD PRIMARY KEY(id);
INSERT INTO s(id,NAME,age) VALUES(1,"aa",20);

DROP TABLE s;
ALTER TABLE s MODIFY  id INT PRIMARY KEY;

#删除约束 -- 仍然保留不能为null
ALTER TABLE s DROP PRIMARY KEY;
DESC s;
/*

not null

添加约束:alter table 表名 modify 字段名 字段类型 not null

删除约束 :alter table 表名 modify 字段名 字段类型 null

default:

设置默认约束 : alter table tb_name alter 字段名 set default value;

删除默认约束 : alter table tb_name alter 字段名 **drop** default;

foreign key:

添加约束 :  ALTER TABLE 表名  ADD  [CONSTRAINT emp_dept_id_fk]   FOREIGN KEY(dept_id) 

            REFERENCES dept(dept_id);

删除约束 :alter table 表名 **drop** foreign key  索引名

*/

  3、外键

#格式
CONSTRAINT 索引名 FOREIGN KEY(字段名) 
REFERENCES 主表名(字段名)
#注意事项
创建表:应该先创建主表再创建从表
​添加内容:先添加主表再添加从表
​删除内容:先删除从表再删除主表
注:有外键约束的主表和从表,删除主表后,从表也会被删除


#当创建表后添加外键约束
#删除索引
ALTER TABLE emp
DROP FOREIGN KEY 索引名;
#添加约束
ALTER TABLE emp
ADD [CONSTRAINT 索引名] FOREIGN KEY(dept_id) 
REFERENCES dept(dept_id);

5、limit分页

limit 索引值,数据的条数
#公式:
#(当前页数-1)*每页条数,每页条数
注意:索引值是从0开始的
    用来分批获取表中的数据(分页)

 

这篇关于MySQL学习的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!