2.MySQL基础:SQL语句
一 SOL通用语法
1.SQL语句可以单行或多行书写,以分号结尾。
2.SQL语句可以使用空格或缩进来增强语句的可读性。
3.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
4.注释
单行注释:--注释内容 或 # 注释内容(MySQL特有)
多行注释:/*注释内容 */
5.[ ]代表可选选项
二 DDL
1.是什么
数据定义语言,用来定义数据库对象(数据库,表,字段)。
2.语法(数据库操作)
1.查询
(1)查询所有数据库
(2)查询当前数据库
补充:有括号,是函数。
2.创建
补充:字符集。
MySQL数据库中不建议设置utf8,使用utf8mb4。
3.删除
4.使用
3.语法(表操作)
1.查询
注意:要先使用指定数据库才行。
(1)查询当前数据库所有表
(2)查询表结构
(3)查询指定表的建表语句
2.创建
(1)创建表语法
注意:最后一个字段后面没有逗号。
(2)数据类型
分数是正的,一位小数即可。double要指定两个参数,第1个参数是整个长度,100.0最长4位,第2个参数是小数位数。
补充:精度和标度
123.45:精度5,标度(小数位数)2
char(10)和varchar(10)超出10个字符就会报错。
补充:char(10)和 varchar(10)的区别
char 存一个字符也会占用10个字符的空间,其他用空格补位,性能高。varchar 存一个字符就占一个字符的空间,存两个就占两个的空间,性能低,因为要根据内容计算空间。
(3)综合运用
3.添加字段
为emp表增加一个新的字段”昵称”为nickname类型为varchar(20):
4.修改
(1)修改字段数据类型
(2)修改字段名和字段类型
将emp表的nickname字段修改为username,类型为varchar(30) :
(3)修改表名
将emp表的表名修改为 employee:
5.删除
(1)删除字段
将emp表的字段username删除:
(2)删除表
如果存在就删除,不存在就不删,不报错。
(3)删除指定表并重新创建该表
只留下了表结构,删除了里面的数据。
比如恢复出厂设置。
三 DML
1.是什么
数据操作语言,用来对数据库表中的数据进行增删改。
2.语法
1.添加(插入)数据
(1)给指定字段添加数据
字段1对应值1,字段2对应值2。
(2)给全部字段添加数据
表名后面没有跟有字段名,因为要给所有的字段赋值。
值1是表中第1个字段的值,值2是表中第2个字段的值。
(3)批量添加数据
当前表中指定字段进行批量添加数据
当前表中所有字段进行批量添加数据
(4)注意
插入数据的时候,指定字段的顺序和值的顺序要一一对应
插入的值是字符串或者日期型数据,应该包含在引号中。
插入的数据大小要在字段的规定范围内。
某个字段是varchar(10),插入的字符串长度就不能超过10。
(5)案例
打开后编写对应的SQL语句。
2.修改数据
注意:如果没有条件,会修改整张表的所有数据。
修改 id 为1 的数据,将 name 修改为 itheima
修改 id 为1 的数据,将 name 修改为小昭,gender 修改为女
将所有的员工入职日期修改为 2008-01-01
3.删除数据
注意:
1.DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据2.DELETE语句不能删除某一个字段的值(可以使用UPDATE)。
删除 gender 为女的员工
删除所有员工
四 DQL
1.是什么
数据查询语言,用来查询数据库中表的记录。
2.语法
1.基本查询
(1)查询多个字段
查询表格中指定字段
查询表格中全部字段
(2)设置别名
as可以省略
(3)去除重复记录
对查询返回的字段进行去重。
(4)案例
查询指定字段 name,workno,age 返回
select name,workno,age from emp;
查询所有字段返回
select * from emp;
查询所有员工的工作地址,起别名
select workaddress '工作地址' from emp;
查询公司员工的上班地址(不要重复)
select distinct workaddress from emp;
2.条件查询
(1)比较运算符
(2)逻辑运算符
多个条件通过逻辑运算符进行组装。
(3)案例
查询年龄等于 88 的员工
select * from emp where age=88;
查询年龄小于 20 的员工信息
select * from emp where age<20;
查询年龄小于等于 20 的员工信息
select * from emp where age<=20;
查询没有身份证号的员工信息
select * from emp where idcard is null;
查询有身份证号的员工信息
select * from emp where idcard is not null;
查询年龄不等于 88 的员工信息
select * from emp where age!=88
select * from emp where age<>88
查询年龄在15岁(包含)到20岁(包含)之间的员工信息
select * from emp where age>=15 and age <=20;
select * from emp where age>=15 a&& age <=20;
select * from emp where age between 15 and 20;
查询性别为女 且年龄小于 25岁的员工信息
select * from emp where gender='女' and age<25;
查询年龄等于18或20或 40 的员工信息
select * from emp where age=18 or age=20 or age=40;
select * from emp where age in (18,20,40);
查询姓名为两个字的员工信息
select * from emp where name like '__';
查询身份证号最后一位是X的员工信息
select * from emp where idcard like '%X'
select * from emp where idcard like '_________________X'
3.分组查询 select from group by
补充:聚合函数 count max min avg sum
聚合函数是将一列数据作为一个整体,进行纵向的计算。
统计该企业员工数量
select count(id) from emp;
如果是select count(idcard) from emp;查询结果是15,因为聚合函数所有的null值不参与聚合函数的运算。
统计该企业员工的平均年龄select avg(age) from emp;
统计该企业员工的最大年龄select max(age) from emp;
统计该企业员工的最小年龄select min(age) from emp;
统计西安地区员工的年龄之和
select sum(age) from emp where workdress='西安';
分组字段名:根据哪个字段进行分组。
两个条件:where 和 having 。where用来对分组之前的数据进行过滤,如果不满足where条件则不参与group by分组,having是对分组后的结果进行过滤。where不能使用聚合函数,having可以。
执行顺序:where>聚合函数>having
where在分组之前进行过滤,分组的时候执行聚合函数,having是分组聚合后进行过滤。
分组后查询的字段一般为聚合函数和分组字段,查询其他字段没有意义。
根据性别分组,统计男性员工和女性员工的数量。
①先写基础查询的语法:select * from emp;
②根据性别分组:select * from emp group by gender;
③统计数量用count聚合函数:select count(*) from emp group by gender;
④ 增加性别的字段:select gender,count(*) from emp group by gender;
根据性别分组,统计男性员工和女性员工的平均年龄。
select gender,avg(age) from emp group by gender;
查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址。
①分组前:查询年龄小于45的员工 select * from emp where age<45;
②根据工作地址分组:select * from emp where age<45 group by workaddress;
③获取员工数量:select count(*) from emp where age<45 group by workaddress;
根据工作地址进行分组,获取每个工作地址的员工数量。
select workaddress,count(*) from emp where age<45 group by workaddress;
④ 员工数量大于等于3的工作地址:分组后过滤。
select workaddress,count(*) from emp where age<45 group by workaddress having count(*)>=3;
补充:取别名。
4.排序查询 select from order by
排序方式: ASC:升序(默认值) DESC:降序
如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
根据年龄对公司的员工进行升序排序。
select * from emp order by age asc;
根据入职时间,对员工进行降序排序。
select * from emp order by entrydate desc;
根据年龄对公司的员工进行升序排序,年龄相同,再按照入职时间进行降序排序。
select * from emp order by age asc,entrydate desc;
5.分页查询 limit
补充:查询页码。
补充:方言。
数据库和数据库之间不同的地方。MySQL 和 Oracle 之间有差异。
查询第1页员工数据,每页展示10条记录。
select * from emp limit 0,10;
select * from emp limit 10;
查询第2页员工数据,每页展示10条记录。
select * from emp limit 10,10;
3.练习
查询年龄为20,21,22,23岁的员工信息。
select * from emp where age in (20,21,22,23);
查询性别为 男 ,并且年龄在 20-40 岁(含)以内的姓名为三个字的员工。
select * from emp where gender = '男',age>=20 and age <=40,name like '___';
select * from emp where gender = '男' and age>=20 and age <=40 and name like '___';
select * from emp where gender = '男' and age between 20 and 40 and name like '___';
select * from emp where gender = '男' and (age between 20 and 40) and name like '___';
括号是为了更直观。
统计员工表中,年龄小于60岁的,男性员工和女性员工的人数。
select gender,sum(gender) from emp where age < 60 group by gender;
select gender,count(*) from emp where age < 60 group by gender;
查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序。
select name,age from emp where age <= 35 order by age asc,entrydate desc ;
查询性别为男,且年龄在20-40 岁(含)以内的前5个员工信息,对查询的结果按年龄升序排序,年龄相同按入职时间升序排序。
select * from emp where gender='男',age>=20 and age <=40 order by age ,entrydate ;
查询前5个员工是查询第1页的员工,每一页只展示5条记录。
select * from emp where gender='男' and age>=20 and age <=40 order by age ,entrydate limit 5;
4.执行顺序
编写顺序:
执行顺序:
5.小结
五 DCL
1.是什么
数据控制语言,用来控制数据库用户、控制数据库的访问权限。
2.语法
1.用户管理
1.查询用户
用户的信息,用户权限的信息都存放在系统数据库的MySQL的user表中。
2.创建用户
补充:主机名。
在哪个主机上这个用户可以访问MySQL。
主机名可以使用%通配,任意主机都可以访问这个MySQL服务器。
补充:只是创建了这个用户,但是没有给这个用户分配权限。
创建用户 itcast,只能够在当前主机localhost访间,密码123456;
create user 'itcast'@'localhost' identified by '123456';
创建用户 heima,可以在任意主机都访问该数据库,密码123456;
create user 'heima'@'%' identified by '123456';
3.修改用户密码
补充:mysql_native_password:加密方式。
修改用户 heima的访问密码为 1234;
alter user 'heima'@'%' identified with mysql_native_password by '1234';
4.删除用户
删除itcast@localhost用户;
drop user 'itcast'@'localhost';
注意:
2.权限控制
1.查询权限
show grants for 'heima'@'%';
usage:没有其他权限,仅仅能够连接并登录上MySQL而已。
补充:*.*表示所有数据库的所有表。
2.授予权限
grant all on itcast.* to 'heima'@'%';
再次查询heima的权限。
show grants for 'heima'@'%';
表示heima有针对itcast的所有权限。
3.撤销权限
补充:多个权限之间使用逗号分隔。