SQL语句,根据其功能,主要分为四类:DDL、DML、DQL、DCL。
Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段)。
案例1: 创建一个yun3k数据库,使用数据库默认的字符集。
案例2:在同一个数据库服务器中,不能创建两个名称相同的数据库,否则会报错。
案例3:可以通过if not exists 参数来解决这个问题,数据库不存在,则创建该数据库,如果存在,则不创建。
案例4:创建一个yun3k_com数据库并指定字符集
案例1:如果删除一个不存在的数据库,将会报错。此时,可以加上参数 if exists,如果数据库存在,再执行删除,否则不执行删除。
案例1:我们要操作某一个数据库下的表时,就需要通过该指令,切换到对应的数据库下,否则是不能操作的。比如,切换到yun3k数据库。
查看指定表的字段,字段的类型、是否可以为NULL,是否存在默认值等信息
案例1:查询mysql数据库下的component字段
查看建表语句,而有部分参数我们在创建表的时候,并未指定也会查询到,因为这部分是数据库的默认值,如:存储引擎、字符集等。
案例1:查询mysql数据库下的component建表语句
案例1:在yun3k数据库下创建一张表yun3k_user,对应的结构如下,那么建表语句为:
Mysql中的数据类型有很多,主要分为三类:树值类型、字符串类型、日期时间类型。
- 数值类型
案例1:年龄字段,不会出现负数,而且人的年龄不会太大
案例2:分数,总分100分,最多出现一位小数
- 字符串类型
注:char与varchar都可以描述字符串,char是定长字符串,指定长度多少,就占用多少个字符,和字段值的长度无关。而varchar是变长字符串,指定的长度为最大占用长度。相对来说,char的性能会更高些
案例1:用户名 username长度不定,最长不会超过50
案例2:性别 gender存储值,不是男,就是女
案例3:手机号 phone固定长度为11
- 日期时间类型
案例1:生日字段 birthday
案例2:创建时间 createtime
- 员工信息表
设计一张员工信息表,要求如下:
-
编号(纯数字)
-
员工工号(字符串类型,长度不超过10位)
-
员工姓名(字符串类型,长度不超过10位)
-
性别(男/女,存储一个汉字)
-
年龄(正常人年龄,不可能存储负数)
-
身份证号(二代身份证号均为18位,身份证中有X这样的字符)
-
入职时间(取值年月日即可)
- 添加字段
案例1:为yun3k_emp表增加一个新的字段”昵称”为nickname,类型为varchar(20)。
- 修改数据类型
案例1:将yun3k_emp表的nickname字段类型改为varchar(100)。
- 修改字段名和字段类型
案例1:将yun3k_emp表的nickname字段修改为username,类型为varchar(30)。
- 删除字段
案例1:将yun3k_emp表的字段username删除
- 修改表名
案例1:将yun3k_emp表的表名修改为yun3k_employee。
- 删除表
注:可选项 IF EXISTS 代表,只有表名存在时才会删除该表,表名不存在,则不执行删除操作(如果不加该参数项,删除一张不存在的表,执行将会报错)。
案例1:如果yun3k_user表存在,则删除yun3k_user表。
- 删除指定表,并重新创建表
注:在删除表的时候,表中的全部数据也都会被删除。
案例1:删除并重新创建yun3k_employee。
DML英文全称是Data Manipulation Language(数据库操作语言),用来对数据库中表的记录进行增、删、改操作。
-
添加数据(INSERT)
-
修改数据(UPDATE)
-
删除数据(DELETE)
案例1:给yun3k_employee表所有的字段添加数据。
案例1:给yun3k_employee表所有的字段添加数据。
案例1:批量插入数据到yun3k_employee表中
注:
-
插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
-
字符串和日期型数据应该包含在引号中。
-
插入的数据大小,应该在字段的规定范围内。
案例1:修改yun3k_employee表中id为1的数据,将name修改为yun3k_net。
案例2:修改yun3k_employee表中id为1的数据,将name修改为黄蓉,gender修改为女。
案例3:将所有的员工入职日期entrydate修改为2009-01-01。
注:修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
案例1:删除yun3k_employee表中gender为女的员工。
案例2:删除yun3k_employee表中的所有员工。
注:
-
DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据
-
DELETE 语句不能删除某一个字段的值(可以使用UPDATE,将该字段值置为NULL即可)。
DQL英文全称是Data Query Language(数据查询语言),数据查询语言是用来查询数据库中表的记录
运行以下sql,准备数据:
DQL 查询语句,语法结构如下:
-
基本查询(不带任何条件)
-
条件查询(WHERE)
-
聚合函数(count、max、min、avg、sum)
-
分组查询(group by)
-
排序查询(order by)
-
分页查询(limit)
注: 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)。*
案例1:查询yun3k_emp指定字段 name,workno,age并返回
案例2:查询返回所有字段
案例1:查询所有员工的工作地址,起别名
案例1:查询公司员工的上班地址有哪些(不要重复)
案例1:查询年龄等于88的员工
案例2:查询年龄小于20的员工信息
案例3:查询年龄小于等于20的员工信息
案例4:查询没有身份证号的员工信息
案例5:查询有身份证号的员工信息
案例6:查询年龄不等于88的员工信息
案例7:查询年龄在15岁(包含)到20岁(包含)之间的员工信息
案例8:查询性别为 女 且年龄 小于 5岁的员工信息
案例9:查询年龄等于18或20或40的员工信息
案例10:查询姓名为两个字的员工信息
案例11:查询身份证号最后一位是X的员工信息
注:NULL值是不参与所有聚合函数运算的
案例1:统计该企业员工数量
注:对于count聚合函数,统计符合条件的总记录数,还可以通过count(数字/字符串)进行统计查询,比如:
案例2:统计该企业员工的平均年龄
案例3:统计该企业员工的最大年龄
案例4:统计该企业员工的最小年龄
案例5:统计西安地区员工的年龄之和
-
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
-
判断条件不同:were不能对聚合函数进行判断,而having可以。
注:
-
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
-
执行顺序:where > 聚合函数 > having
-
支持多字段分组,具体语法为:group by columnA, columnB
案例1:根据性别分组,统计男性员工和女性员工的数量
案例2:根据性别分组,统计男性员工和女性员工的平均年龄
案例3:查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
案例4:统计各个工作地址上班的男性及女性员工的数量
-
ASC:升序(默认值)
-
DESC:降序
注:
-
如果是升序,可以不指定排序方式ASC;
-
如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序
案例1:根据年龄对公司的员工进行升序排序
案例2:根据入职时间,对员工进行降序排序
案例3:根据年龄对公司的员工进行升序排序,年龄相同,再按照入职时间进行降序排序
注:
-
起始索引从0开始,起始索引 = (查询页码 - 1) 每页显示记录数。*
-
分页查询是数据库的方言,不同的数据库有不同的实现,Mysql中是LIMIT。
-
如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
案例1:查询第1页员工数据,每页展示10条记录
案例2:查询第2页员工数据,每页展示10条记录((页码 - 1) 页展示记录数)*
(2).查询性别为男,并且年龄在20-40岁(含)以内的姓名为三个字的员工。
验证:
查询年龄大于15的员工姓名、年龄,并根据年龄进行升序排序。
在查询时,我们给yun3k_emp表起一个别名 e,然后在select及where中使用该别名。
执行上述SQL语句后,我们看到依然可以正常的查询到结果,此时就说明:from先执行,然后where和select执行。那where和select到底哪个先执行呢?
此时我们可以给select后面的字段起别名,然后在where中使用这个别名,然后看看是否可以执行成功。
执行上述sql报错了:
由此我们可以得出结论:from先执行,然后执行where,再执行select。
接下来,我们再执行如下SQL语句,查看执行效果:
结果执行成功。那么也就验证了:order by 是在select语句之后执行的。
综上所述,我们可以看到DQL语句的执行顺序为:from ... where ... group by ... having ... select ... order by ... limit ...
DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。
其中Host代表当前访问的主机,如果为localhost,仅代表只能够在当前本机访问,是不可以远程访问的。User代表的是访问该数据库的用户名。在Mysql中需要通过Host和User来唯一标识一个用户。
案例1:创建一个名为"yun3k"的用户,设置密码为”123456”,并且只能本地访问。
案例2:创建一个名为”yun3k_com”的用户,可以在任意主机访问该数据库
案例1:修改”yun3k”的用户密码为”654321”。
案例1:删除”yun3k”用户。
注:
-
在Mysql中需要通过用户名@主机名的方式来唯一标识一个用户。
-
主机名可以使用%通配。
常用权限如下:
案例1:查询'yun3k_com'@'%'用户的权限
案例1:授予'yun3k_com'@'%'用户yun3k数据库所有表的所有操作权限
案例1:撤销'yun3k_com'@'%'用户的yun3k数据库的所有权限
注:
-
多个权限之间,使用逗号分隔
-
授权事时,数据库名和表名可以使用*进行通配,代表所有