Mysql

这篇笔记详细介绍了MySQL数据库的基本概念,包括数据库的定义、特点和MySQL的部署结构。讲解了常用的SQL命令,如操作数据库、创建与删除表、数据的增删改查。此外,还涵盖了SQL数据类型、列约束以及简单的查询操作,如条件查询、分组查询和子查询。笔记最后探讨了多表查询的不同连接类型。
摘要由CSDN通过智能技术生成

Mysql笔记

1.数据库的基本概念

1.数据库的英文单词: database 简称:DB
2. 什么数据库?
    * 用于存储和管理数据的仓库。
    * 按照一定的形式来组织存放数据,目的是为了更快的操作数据——增删改查
3. 数据库的特点:
	1. 持久化存储数据的。其实数据库就是一个文件系统
	2. 方便存储和管理数据
	3. 使用了统一的方式操作数据库 --- SQL
4.mysql数据库
    Oracal:mysql
    马丁:MariaDB
    Xampp 服务器套装,包含多个服务器软件,例如mysql,Apache…
(1)部署结构
  服务器端:负责存储维护数据 —— 银行的数据库服务器
     启动文件  C:/xampp/mysql/bin/mysqld.exe  占用3306端口
  客户端:负责连接服务器端,对数据进行操作 —— ATM机
     客户端工具  C:/xampp/mysql/bin/mysql.exe
(2)使用客户端连接服务器端
   mysql.exe  -h127.0.0.1  -P3306  -uroot  -p
  -h   host    IP地址/域名   127.0.0.1/localhost
  -P   port    端口
  -u   user    用户名      root 管理员账户
  -p   password   密码     xampp下root的密码是空
  mysql  -uroot    简写形式
  连接的命令结尾不能加分号

2.常用的sql命令

1.操作数据库
(1).删除
   *删除数据库
       * drop database 数据库名称;
(2).创建
   * 设置客户端连接服务器的编码为utf8
       * set names utf8;
   * 创建数据库
       * create database 数据库名称;
   * 丢弃数据库,如果存在
	   * drop database if exists 数据库名称;
   * 创建新的数据库,并设置存储的编码为utf8
	   *create database 数据库名称 charset=utf8;
(3).操作表
   * 创建表
	语法:
	  create table 表名(
		  列名1 数据类型1,
		  列名2 数据类型2,
		  ....
		  列名n 数据类型n
		);
   * 注意:最后一列,不需要加逗号(,)
   * 复制表:
	 * create table 表名 like 被复制的表名;	
(4).查询
   * 查询所有数据库的名称:
       * show databases;
   * 进入创建的数据库
       * use 数据库名称;
(5)常用管理命令(连接成功后)
   quit;   退出服务器的连接
   show  databases;   显示当前所有的数据库
   use  数据库名称;   进入到指定的数据库
   show  tables;  显示当前数据库中所有的数据表
   desc  数据表名称;  描述数据表中都有哪些列
  所有的管理命令都以英文的分号结尾

3.增删改查

      1.添加数据

insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
insert into 表名 values (值1, 值2,....)

       注意: ① 列名和值要一一对应。②如果表名后,不定义列名,则默认给所有列添加值   ③除了数字类型,其他类型需要使用引号(单双都可以)引起来

      2.删除数据(删除多条数据)

delete from 表名 [where 条件];
delete from 表名 where id in (a,b,c);

         注意:  如果不加条件,则删除表中所有记录。  * delete from 表名; -- 不推荐使用。删除全部数据

      3.修改数据

update 表名称 set 列名称 = 新值 where 列名称 = 某值;

         注意:  如果不加任何条件,则会将表中所有记录全部修改。

  4.查询数据

select * from 表名;
select 列名称 from 表名称

4.Sql常用数据类型

    (1)数值型 —— 可以不加引号

       tinyint   微整型,占1个字节,范围-128~127

       smallint   小整型,占2个字节,范围-32768~32767

       int   整型,占4个字节,范围-2147483648~2147483647

       bigint   大整型,占8个字

       decimal(M,D)   定点小数,小数点位置不会发生变化,M代表总的有效位数,D代表小数点后的有效位数

       boolean   布尔型,只有两个值,分别是true和false,代表真和假,用于存储只有两个值的数据,例如是否在线、性别、是否在售…  在使用的过程中会自动转为tinyint,true转为1,false转为0,也可以直接使用1和0      true和false是关键字,使用的时候不能加引号

       float   单精度浮点型,占4个字节,范围比int大的多,存储的数字越大精度越低,以牺牲小数点后的若干位为代价。最大3.4e+38

       double   双精度浮点型,占8个字节,范围比bigint大的多

    (2)日期时间型 —— 必须加引号

       date    日期型    2020-12-25

       time    时间型    15:20:30

       datetime  日期时间型    2020-12-25 15:20:30

    (3)字符串型 —— 必须加引号

       varchar(M)   变长字符串,几乎不会产生空间浪费,数据操作速度相对慢,M最大值是65535,用于存储变化长度的数据,例如用户名、邮箱、标题、文章详情…

       char(M)   定长字符串,可能会产生空间浪费,数据操作速度相对快,M的最大值是255,用于存储固定长度的数据,例如手机号码、身份证号码

       text(M)   大型变长字符串,M最大值是2G

5.列约束

       Mysql可以对要插入的数据进行特定的验证,只有符合格式才允许插入,例如编号不允许重复,一个人的性别只能是男或者女,一个人成绩范围0~100之间         

create table t1( 
    lid  int  列约束
);

    (1)主键约束 —— primary key

          声明了主键约束的列上不允许插入重复的值,一个表中只有能有一个主键约束,通常是在编号列,会加快数据的查找速度

          null  表示空,在插入数据的时候,表示暂时无法确定的值,例如无法确定一个人的有效,无法确定一个商品的价格…

          null是关键字,不能加引号  主键约束的列上不允许插入null

    (2)非空约束 —— not  null

        声明了非空约束的列上不允许插入null

    (3)唯一约束 —— unique

         声明了唯一约束的列上不允许插入重复的值,允许插入null,甚至多个null

         两个无法确定的值(null)是不一定相同的,所以允许多个

    (4)默认值约束 —— default

         可以使用关键字default来设置默认值     insert  into  表名  values(1 ,’张三’, default ….);

    (5)检查约束 —— check

         也称为自定义约束,用户自己添加的约束

create  table  student(

    score  tinyint  check(score>=0  and  score<=100)

);

          mysql不支持检查约束,会极大的影响数据的插入速度。将来可以通过js完成

    (5)外键约束

          声明了外键约束的列,取值会另一个表的主键列去找,允许插入null;外键列和对应的主键列两者的列类型要保持一致。

          foreign key(外键列) references 另一个表(主键列)

          外键约束是为了让两个表之间建立关联

     * 自增列

           auto_increment  自动增长,如果设置了自增列,在插入数据的时候,只需要设置为null,就会获取当前的最大值然后加1插入

           注意事项:

           自增列只能添加在整数形式的主键列上

           自增列允许手动赋值

6.简单查询

   数据库名tedu;    表1:部门表dept;   表2:员工表emp;

(1)查询特定的列

   示例 :查询出所有员工的姓名、生日、工资

select  ename,birthday,salary  from emp;

(2)查询所有的列(两种方式)

select  eid,ename,sex,birthday,salary,deptId  from emp;
select * from emp;

(3)给列起别名

   示例:查询出所有员工的编号和姓名,使用汉字别名

   as关键字可以省略,保留即可。 给列起别名的目的是为了简化列名称。

select  eid as 编号,ename as 姓名  from emp;

(4)显示不同的记录

   示例:查询出都有哪些性别的员工

select  distinct sex  from  emp;
distinct 显示不同的记录

(5)查询时执行计算

   示例:

        ①计算 1+3+5+8*7.4+5*4.39 

        ②练习:查询出所有员工的姓名及其年薪 

        ③假设每个员工的工资增长1000,年终奖20000,查询出所有员工的姓名及其年薪,使用汉字别名

select  1+3+5+8*7.4+5*4.39;
select  ename,salary*12  from emp;
select  ename 姓名,(salary+1000)*12+20000 年薪 from emp;

(6)查询结果排序(升序、降序)

   示例:查询出所有的部门,结果按照部门编号升序排列(asc全称:ascendant 升序的。 可省略)

select * from dept order by did asc;

   示例:查询出所有的部门,结果按照部门编号降序排列(desc全称:descendant  降序。不可省略)

select * from dept order by did desc;

(7)条件查询

and (&&)  并且,两个条件都满足
or (||)  或者,两个条件满足其一
between  and   在两者之间
not  between  and  不在两者之间
is  null   值为null
is  not  null   值不为null
in(  )   满足其中一个
not  in(  )    都不满足

   示例(1):

         ①查询出编号为5的员工所有列 

         ②查询出姓名为king的员工所有列

select * from emp where eid=5;
select * from emp where ename='king';

   示例(2):

        ①查询出不在20号部门下的员工有哪些       

         ②查询出没有明确部门的员工有哪些     

         ③查询出有明确部门的员工有哪些

select * from emp where deptId!=20;
select * from emp where deptId is null;
select * from emp where deptId is not null;

   示例(3):查询出工资在7000以上的男员工有哪些  (两种写法:and 或 &&)

select * from emp where salary>7000 and sex=1;
select * from emp where salary>7000 && sex=1;

   示例(4):查询出工资在6000~9000直接的员工有哪些

select * from emp where salary>=6000 && salary<=9000;
select * from emp where salary between 6000 and 9000;

   示例(5):查询出工资在6000以下或者9000以上的员工有哪些

select * from emp where salary<6000  or  salary>9000;
select * from emp where salary<6000  ||  salary>9000;
select * from emp where salary not between 6000 and 9000;

   示例(6):查询出20号部门或者30号部门的员工有哪些

select * from emp where deptId=20 || deptId=30;
select * from emp where deptId in(20,30);

   示例(7):查询出不在20号部门并且不在30号部门的员工有哪些

select * from emp where deptId!=20 && deptId!=30;
select * from emp where deptId not in(20,30);

(8)模糊条件查询(使用like关键字)

              %  匹配任意个字符   >=0           _ 表示 任意一个字符      =1

   示例:

         ①查询出姓名中含有字母o的员工有哪些

         ②查询出姓名中以o结尾的员工有哪些

          ③查询出姓名中第二个字符是o员工有哪些

select * from emp where ename like '%o%';
select * from emp where ename like '%o';
select * from emp where ename like '_o%';

(9)分页查询

        查询的结果中有太多的数据,一次显示不完可以做成分页显示

        需要用两个已知的条件:当前的页码、每页的数据量

        公式:开始查询的值 = (当前的页码-1)*每页的数据量

         select * from emp  limit  开始查询的值,每页的数据量;

   示例:假设每页显示5条数据,分别查询出前3页

select * from emp limit 0,5;
select * from emp limit 5,5;
select * from emp limit 10,5;

7.复杂查询

(1)聚合查询 / 分组查询

     聚合查询:

        函数:就是一个功能体,需要提供若干个数据,最终返回结果

        聚合函数:

           count()/sum()/avg()/max()/min()

            数量   总和   平均   最大   最小

   示例:

          ①查询出所有员工的数量

          ②计算出所有员工工资的总和

          ③计算出所有女员工的平均工资

          ④查询出年龄最大的员工的生日

          ⑤查询出10号部门的最高工资

select count(ename) from emp;
select sum(salary) from emp;
select avg(salary) from emp where sex=0;
select min(birthday) from emp;
select max(salary) from emp where deptId=10;

     分组查询:

          按照指定的列分组,不是每一个列都适合分组

          分组查询只能查询分组条件和聚合函数

   示例:

         ①查询出男女员工的数量,平均工资

         ②查询出各个部门员工的最高工资,最低工资,工资总和

select count(eid),avg(salary),sex from emp  group by sex;
select max(salary),min(salary),sum(salary),deptId from emp group by deptId;

       md5()  加密函数

select  md5('123456');

       year()  获取日期中的年份

select  year('2021-5-8');

   示例:查询出1993年出生的员工有哪些

select * from emp where year(birthday)=1993;

(2)子查询

    子查询是多个SQL命令的组合,将一个SQL命令的结果作为另一个的条件使用

   示例(1):查询出工资最高的员工所有的列

          步骤1:查询出工资的最高值

          步骤2:通过最高值查询员工

          步骤3:综合:

select max(salary) from emp;
select * from emp where salary=22000;
select * from emp where salary=(select max(salary) from emp);

    示例(2):查询出和tom同一个部门的员工有哪些

           步骤1:查询tom的部门编号 —— 20

           步骤2:通过部门编号查询员工

           步骤3:综合:

select deptId from emp where ename='tom';
select * from emp where deptId=20 and ename!='tom';
select * from emp where deptId=(select deptId from emp where ename='tom') and ename!='tom';

    示例(3):查询出和Maria同一年出生的员工有哪些

          步骤1:查询出Maria出生的年份

          步骤2:查询出这一年出生的员工,排除Maria

          步骤3:综合:

select year(birthday) from emp where ename='Maria';
select * from emp where year(birthday)=1992 and ename!='Maria';
select * from emp where year(birthday)=(select year(birthday) from emp where ename='Maria') and ename!='Maria';

(3)多表查询

     多表查询查询的数据是分布在多个表中,前提是表之间是有关联的。

    示例:查询出所有的员工姓名及其部门名称(两种方法)

select ename,dname from emp,dept where deptId=did;
select emp.ename,dept.dname from emp,dept where emp.deptId=dept.did;

     内连接(和之前的结果是一样的)

select ename,dname from emp inner join dept on deptId=did;

     左外连接(显示左侧表中所有的记录,先写哪个表哪个是左)

select ename,dname from emp left outer join dept on deptId=did;

     右外连接(显示右侧表中所有的记录,后写哪个表哪个是右)

     注意:左外连接和右外连接中的outer关键字可以省略的

select ename,dname from emp right outer join dept on deptId=did;

     全连接 :full join ... on  (左侧和右侧所有记录都显示)  :mysql不支持

          全连接解决方案:左外连接和右外连接的结果联合,合并相同的记录

     联合:union all   联合后不合并相同的记录 

                union   联合后合并相同的记录

(select ename,dname from emp left outer join dept on deptId=did)
   union
(select ename,dname from emp right outer join dept on deptId=did);

总:

列约束:
    主键约束 —— primary key
    非空约束 —— not  null
    唯一约束 —— unique
    默认值约束 —— default
    检查约束 —— check
    外键约束 —— foreign key(外键列) references 另一个表(主键列)
    自增列 —— auto_increment

sql语句关键字:
    给列起别名 —— as(可省略)
    显示不同的记录 —— distinct 
    升序 —— order by 列名 asc (asc可省略)
    降序 —— order by 列名 desc  
    默认值为null —— is null
    默认值不为null —— is not null
    并且 —— and
    或者 —— or / ||  / 
    满足其中一个 —— in(n1,n2)  都不满足 —— not in(n1,n2)
    在两者之间 —— between ... and  ...
    不在两者之间 —— not between... and ...
    模糊条件查询 —— 使用'like'关键字
                   % 匹配任意个字符   >=0
                   _  任意一个字符     =1
    分页查询 —— limit(当前的页码,每页的数据量) 
               当前的页码=开始查询的值 = (当前的页码-1)*每页的数据量
               开始查询的值和每页的数据量必须是数值型,不能加引号
    分组查询 —— group by
聚合函数:
    数量 —— count()
    总和 —— sum()
    平均 —— avg()
    最大 —— max()
    最小 —— min()
    加密函数 —— md5()
    获取日期中的年份 —— year()
多表查询:
    内连接 —— inner join...on...
    左外连接 —— left outer join...on...
    右外连接 —— right outer join...on...
    全连接 —— full join ... on...(mysql不支持)
 ----全连接解决方案:左外连接和右外连接的结果联合,合并相同的记录 ----
    联合后合并相同的记录 —— union
    联合后不合并相同的记录 —— union all

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值