DDL,DML,DQL,DCL

DDL定义数据库结构
create/drop/alter(修改表)
DML操作数据
insert/delete(删除)/update(修改)
DQL查询数据
select
DCL控制用户权限
grant(授权)/revoke(授权)

一、SQL命令
1、修改
update 数据库名称 set 列名称=值,列名称=值…where 条件;
#修改数据
UPDATE USER SET email=‘123@abc.com’,phone=‘123456258’ WHERE uid=‘1’;
2、删除
delete from 数据库名称 where 条件;
#删除数据
DELETE FROM USER WHERE uid=‘01’;

二、计算机中如何存储字符
1、如何存储英文字符
ASCLL:对128个英文字母及其符号进行了编译
Latin-1:总共有256个,对欧洲字符进行了编码,兼容ASCLL(MySQL默认)
2、如何存储中文字符
GB2312:对常用的6千多汉字进行了编码,兼容ASCLL
GBK:对2万多的汉字进行了编码,兼容GB2312
Unicode码:对世界是主流国家常用的语言进行了编码,分为三种存储方案分别是utf-8,utf-16,utf-32
3.解决MySQL中文乱码
(1)脚本文件另存为的编码为utf8
(2)客户端连接服务器端的编码为utf8
#设置客户端连接服务器端使用的编码utf-8
SET names utf8;
(3)服务器端创建数据库,存储字符编码为utf8
#创建新的数据库,设置存储字符编码为utf8
CREATE DATABASE xz charset = utf8;
(4)特殊情况:如果以上在交互模式哈有乱码,需要先推出交互模式然后执行修改命令行的编码为utf8
chcp 65001

三、常见的列类型
列类型 :在创建数据表的时候,指出的列所能存储的数据类型
create table user(
列名称 列类型,
列名称 列类型
);

 数值型
        tinyint   微整型   1个字节,范围-128~127
        smallint    小整型    2个字节,范围-32768~32767
        int   整型    4个字节  ,范围-2147483648~214748647
        bigint  大整型  8个字节

 浮点型
         float 单精度浮点型,占4个字节,存的的值越大,精度越低
         double 双精度浮点型,占8个字节,存的的值越大,精度越低
         decimal   定点小数,存储的值小数点不会发生变化
                     decimal(M,D)     M表示总的有效位数,D表示小数点后的位数
                        eg:9999999.99      decimal(9,2)

boolean布尔型(只有两个值)
          true     真
          false     假
              true和false是关键字,使用时不能加引号
              boolean会自动转为tinyint,true转为1,false转为0,也可以直接插入1和0
          常用于存储只有两个值的数据,eg:性别(男、女);是否在线(是、否);
           .

日期时间型
          date    日期型    ‘2021-10-20’
          time    时间型      ‘13:52:43’
          datetime    日期时间型   '2013-11-12 15:20:26'

字符串类型——必须加引号
varchar(M) 变长字符串,不会产生空间浪费,数据操作速度相对慢,M最大值65535
存储变化长度的数据,例如:文章标题,详情,姓名…
char(M) 定长字符串,可能会产生浪费,数据操作速度相对快,M最大值255
存储固定长度的数据,例如:手机号码,身份证号码…
text(M) 大型变量字符串,M最大值2G

           (   \0表示空格    )
                         |     varchar (5)              |              char(5)
               a        |        a\0                       |          a\0\0\0\0
               ab      |        ab\0                    |          ab\0\0\0
           一二三    |   一二三\0                  |         一二三\0\0

四、列约束
MySQL可以对插入的数据进行验证,只有通过验证才允许插入,例如:编号不能重复、性别只能是男女,一个人的成绩范围~100
create table t1(
id int 列约束
);

    1、主键约束——primary key
           声明了主键约束的列,不允许插入重复的值,一个表里只能有一个主键约束,通常加在编号列,可以加快数据的查找速度
                 null:表示空,代表一个暂时无法确定的值,例如:无法确定一个员工的手机号码、邮箱、性别等
                 null为关键字,使用这个值的时候不能加引号
    2、非空约束——not null
            声明了非空约束的列不允许插入null
    3、默认值约束——default
             如果插入数据,不提供值,会使用默认值;
             使用default关键字设置默认值
    4、唯一约束——unique
              声明了唯一约束的列上不允许出现重复的值
              一个表中可以有多个唯一约束,允许插入null,甚至多个null
     5、检查约束——check
               也称为自定义约束,用户可以自己指定约束条件
                      creat table student(
                              score tinyint check(score>=0  and  score<=0)
                        );
                 MySQL不支持检查约束,后期由JS代替
      6、外键约束——foreign key(外键列) references 外键列所在的表名称(主键列)
                  声名了外键约束的列上插入的值必须是另一个表的主键列出现过,目的是为了确保两个表之间建立关联,
                         外键约束和另一个表主键的列类型保持一致, 外键约束里面允许插入null
                                  #把familyid作为外键,取值必须在family表的fid出现过
                                  foreign key(familyid) references family(fid) 

五、自增列
auto_increment:自动增长,如果设置了自增列,在插入编号的时候只需要赋值为null,就会获取最大值然后加1插入
自增列必须应用在整形形式的主键列
允许手动赋值

六、简单查询
1、查询特定的列
示例:查询所有员工的编号和姓名
select eid, ename from emp;
练习:查询出所有员工的姓名,性别,生日,工资
select ename,sex,birthday,salary from emp;

2、查询所有的列
(方法1) select eid,ename,sex,birthday,salary,deptid from emp;
(方法2)select * from emp;

3、给列起别名
示例:查询出所有员工的编号和姓名,使用一个字母作为别名
select eid as a,ename as b from emp;
练习:查询出所有员工的姓名,生日,工资,使用一个字母作为别名
select ename as a,birthday as b,salary as s from emp;

            as意思是作为,作用是用来连接别名的
            as作为关键字,可以省略,保留空格

4、显示不同的记录
示例:查询出员工都分布在那些部门
select distinct deptid from emp;
联系:查询出有哪些性别的员工
select distinct sex from emp;
5、查询时执行计算
示例:计算出2+5-9+812
select 2+5-9+8
12;
练习:查询出所有员工的姓名及其年薪
select ename,salary*12 from emp;
假设每个员工的工资增加2000,年终是20000,查询出所有员工姓名及其年薪,使用一个字母作为别名
select ename as a,(salary+2000)*12+20000 as s from emp;
6、查询结果排序
示例:查询出所有的部门,结果按照编号从小到大排序
select * from dept order by did asc; #ascendent升序
示例:查询出所有的部门,结果按照编号从大到小排序
select * from dept order by did desc; #descendant 降序的
练习:查询出所有的员工,结果按照工资降序排列
select * from emp order by salary desc;
练习:查询出所有的员工,结果按照生日升序排列
select * from emp order by birthday asc;
练习:查询出所有的员工,结果按照姓名升序排列
select * from emp order by ename asc;

            按照字符串排列,按照字符的编码排列
            不加排序规则,默认是按升序排列

        示例:查询出所有员工,结果按照工资降序排列,如果工资相同,按照姓名排列
                  select * from emp order by salary desc,ename asc; 
            练习:查询出所有员工,结果按照性别排序,如果性别相同,则按照生日从小到大排列
                       select * from emp order by sex asc,birthday asc;

7、条件查询
示例:查询出编号为10的员工
select * from emp where eid=10;
练习:查询出姓名为king 的员工
select * from emp where ename=‘king’;
练习:查询出工资在6000以上的员工有哪些
select * from emp where salsry>6000;

             比较运算符
              >    <      >=       <=      =         !=(不等于)
        练习:查询出不在10号部门的员工有哪些
              select * from emp where deptid!=10; 
        练习:查询出没有明确部门的员工
                       select * from emp where deptid is null;
                   查询出有明确部门的员工
                        select * from emp where deptid is not null;     
   示例: 查询7000以上的女员工都有哪些
         select * from emp where salary>7000 and sex=0;   
          练习:查询7000~10000之间的员工有哪些
                         select * from emp where salary>7000 and salary<10000;  
          练习:查询7000一下或者10000以上的员工;    
                         select * from emp where salary<7000 or salary>10000;  
          练习:查询出20号部门或者30号部门的员工
                         (方法1): select * from emp where deptid=20 or deptid=30;
                         (方法2):select * from emp where deptid in(20,30);
          练习:查询出不在20号并且不在30号部门的员工     
                         (方法1): select * from emp where deptid !=20 and deptid !=30;
                         (方法2):select * from emp where deptid not in(20,30);

               and(&&):并且,要求两个条件都满足
               or(||):或者,要求两个条件满足其一

8、模糊条件查询
不明确的条件,常用于搜索
示例:查询出员工姓名中含有e的员工有哪些
select * from emp where ename like’%e%‘;
练习:查询出员工姓名以e结尾的员工有哪些
select * from emp where ename like’%e’;
练习:查询出员工姓名中倒数第二个字符是e的员工有哪些
select * from emp where ename like’%e_';

                            %:匹配任意个字符   >=0
                             _ :匹配任意1个字符    =1
                            以上匹配符号必须结合like 关键字使用

9、分页查询
查询的结果有太多数据,一次显示不完可以做成分页显示
需要有两个已知条件:当前页码、每页的数量

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

         select * from emp limit 开始查询的值,每页的数据       /*注意事项:limit 后面的两个值必须是数值型,不能加引号*/

               示例:假设每页显示5条数据,查询出前四页每页的数据
                     第1页:select * from emp limit 0,5;
                     第2页:select * from emp limit 5,5;
                     第3页:select * from emp limit 10,5;
                     第4页:select * from emp limit 15,5;

七、复杂查询
1、聚合查询/分组查询
函数:是一个功能体,需要提供若干个数据,然后返回结果
聚合函数:
count()/sum()/avg()/max()/min()
数量 总和 平均 最大 最小

             示例:查询出所有员工的数量
                  select count(*) from emp;
                         结果:16个员工
                 练习:使用员工编号列查询出员工数量
                      select count(eid) from emp;      #建议使用主键列
                           结果:16个员工
                 练习:使用所属部门列查询出员工数量
                       select count(deptid) from emp;
                            结果:15个员工
                  练习:查询出所有女员工的工资总和
                         select sum(salary) from emp where sex=0;
                  练习:查询出10号部门的平均工资
                         select avg(salary) from emp where deptid=10;
                  练习:查询出男员工的最低工资
                          select  min(salary) from emp where sex=1;
                  练习:查询出年龄最小员工的生日(查询出生日的最大值)
                           select max(birthday) from emp;

  分组查询通常查询聚合函数和分组条件
      示例:查询出男女员工的数量、平均工资、工资总和
           select count(eid),avg(salary),sum(salary),sex from emp group by sex;
           练习:查询出各部门的工资总和,最高工资,最低工资
                 select sum(salary),max(salary),min(salary),deptid from emp group by deptid;

2、子查询
是多个sql命令的组合,将一个查询的结果作为另一个的条件
示例:查询高于平均工资的员工有哪些
步骤1:查询出平均工资=11125
select avg(salary) from emp;
步骤2:查询出工资大于的员工
select * from emp where salary>11125;
综合:
select * from emp where salary>(select avg(salary) from emp);
练习:查询和tao同一个部门的员工有哪些
步骤1:查询tao所在的部门——20
select deptid from emp where enamr=‘tao’;
步骤2:查询出部门20为的员工有哪些
select * from emp where deptid=20;
综合:
select * from emp where deptid=(select deptid from emp where ename=‘tao’) and ename!=tao;

    |   year()  获取日期中的年份
    |   示例:查询出所有员工的出生年份
    |       select year(birthday) from emp;
    |   示例:查询出1993年出生的员工
    |       select * from emp where year(birthday)=1993;  

                            练习:查询出和tom同一年出生的员工有哪些
                                   select * from emp where year(birthday)=(select year(birthday) from emp where ename='tom') and ename!='tom';

3、多表查询
要查询的数据分别在多个表中,前提表之间已经建立了关联
示例:查询出所有员工的姓名及其部门名称
select ename,deptid from emp,dept where deptid=did;
select emp.ename,dept.dname from emp,dept where emp.deptid=dept.did;

   (1)内连接
           select ename,dname from emp inner join dept on deptid=did;
            和之前的查询结果一样
   (2)左外连接
             左表 left outer join 右表 on 左表外键=右表主键
             select ename,dname from emp left outer join dept on deptid=did;
              显示左侧表中的所有记录,先写哪个表哪个就是左
    (3)右外连接
              左表 right outer join 右表 on 左表外键=右表主键
             select ename,dname from emp right outer join dept on deptid=did;
              显示右侧表中所有记录,后写哪个表哪个就是右
    (4)全连接
              full join...on
                同时显示左侧和右侧表中的所有记录
                 mysql不支持全连接
                 union all  联合后不合并相同的项
                 union  联合后合并相同的项
                 (select ename,dname from emp left outer join dept on deptid=did)
                   union all
                 (select ename,dname from emp right outer join dept on deptid=did); 
                 共32条记录
                 (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); 
                 共17条记录
              解决方案:将左外连接和右外连接进行联合,合并相同的项

综合练习:查询出工资在7000以上的男员工的姓名,性别,生日,工资;结果按照工资从高到低排列,只能显示前3个人;给列使用别名
select ename a,sex b,birthday c,salary d from emp where sex=1 and salary>7000 order by salary desc limit 0,3;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luanma3p

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值