目录
[3 DDL](#3 DDL)
[3.3 DDL总结](#3.3 DDL总结)
[3.3.1 DDL-数据库操作](#3.3.1 DDL-数据库操作)
[4 DML](#4 DML)
[4.4 DML总结](#4.4 DML总结)
[5 DQL(查询)](#5 DQL(查询))
[5.4 分组查询(group by)](#5.4 分组查询(group by))
[5.5排序查询(order by)](#5.5排序查询(order by))
[5.6 分页查询(limit)](#5.6 分页查询(limit))
[5.7 DQL语句总结](#5.7 DQL语句总结)
[6 DCL语句](#6 DCL语句)
1.SQL通用语法
1.SQL语句可以单行或多行书写,以分号结尾。
- SQL语句可以使用空格/缩进来增强语句的可读性。
3.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
4.注释:
(1)单行注释:--注释内容或#注释内容(MySQL特有)
(2)多行注释:/*注释内容*/
2.SQL分类
SQL语句,根据其功能,主要分为四类:DDL、DML、DQL、DCL。
3 DDL
对数据库、表、字段的定义操作。
3.1数据库操作
3.1.1查询
查询所有数据库:SHOW DATABASES;
例:输入,就可查询当前数据库服务器中所有的数据库,包括我刚刚新建的两个。
查询当前正在使用的数据库:SELECT DATABASE(); #注意括号()不能少!
3.1.2创建
CREATE DATABASE [IF NOT EXISTS]数据库名「 DEFAULT CHARSET字符集][COLLATE 排序规则];
例1:输入create database itcast;
就会创建好名为itcas的数据库:
例2:输入CREATE DATABASE if not exists ithe default charset utf8mb4;
3.1.3删除
DROP DATABASE [ IF EXISTS]数据库名;
例:输入drop DATABASE ithe
然后查询:show DATABASEs
发现就没有ithe这个表了
3.1.4使用
USE 数据库名;
切换到指定的这个数据库,进行使用。
例:输入use library
再查询:SELECT DATABASE()
结果为:
3.2表操作
3.2.1查询
查询当前数据库所有表
也可以用use切换指定数据库,再查询。
查询表结构
DESC表名;
查询指定表的建表语句
SHOW CREATE TABLE表名;
3.2.2创建
逗号分离,最后一个字段没有逗号。通过comment加上对应字段的注释。
示例:
可以用desc+表名 查询表结构:
3.2.3数据类型
(1)数值类型
(2)字符串类型
VARCHAR------VS------CHAR
1)VARCHAR类型用于存储可变长度字符串,是最常见的字符串数据类型。它比固定长度类型更节省空间,因为它仅使用必要的空间(根据实际字符串的长度改变存储空间)。
有一种情况例外,如果MySQL表使用ROW_FORMAT=FIXED创建的话,每一行都会使用定长存储。
2)CHAR类型用于存储固定长度字符串:MySQL总是根据定义的字符串长度分配足够的空间。当存储CHAR值时,MySQL会删除字符串中的末尾空格(在MySQL 4.1和更老版本中VARCHAR 也是这样实现的------也就是说这些版本中CHAR和VARCHAR在逻辑上是一样的,区别只是在存储格式上)。
同时,CHAR值会根据需要采用空格进行剩余空间填充,以方便比较和检索。但正因为其长度固定,所以会占据多余的空间,也是一种空间换时间的策略;
如:
用户名username varchar(50)
性别gender char(1)
(3)日期时间类型
没有负数,就要用无符号的,加上关键字unsigned。
例:设计一张员工信息表,要求如下:
1.编号(纯数字)
2.员工工号(字符串类型,长度不超过10位)
3.员工姓名(字符串类型,长度不超过10位)
4.性别(男/女,存储一个汉字)
5.年龄(正常人年龄,不可能存储负数)
6.身份证号(二代身份证号均为18位,身份证中有X这样的字符)
7.入职时间(取值年月日即可)
代码如下:
create table emp(
id int comment '编号',
empid varchar(10) comment '员工工号',
empname varchar(10) comment '员工姓名',
sex char(1) comment '性别',
age tinyint unsigned comment'年龄',
idcard char(18) comment'身份证号',
entime date comment'入职时间'
)
3.2.4表修改(alter打头)
(1)添加字段add
ALTER TABLE 表名 ADD 字段名 类型(长度)[COMMENT注释][约束];
案例:
为emp表增加一个新的字段"昵称"为nickname,类型为varchar(20)
代码:
alter table emp add nickname varchar(20) comment'昵称'
查询可知已成功添加:
(2)修改字段
1)修改字段数据类型(modify)
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
2)修改字段名和字段类型(change)
ALTER TABLE表名CHANGE旧字段名 新字段名 类型(长度)[COMMENT注释][约束];
案例:
将emp表的nickname字段修改为username,类型为varchar(30)
代码:在添加字段的代码上修改就是将add改为change,原本一个字段名,改为包含旧和新的两个字段名。
alter table emp change nickname username varchar(20) comment'昵称'
(3)修改表名(rename to)
ALTER TABLE 表名 RENAME TO 新表名;
例:改emp为employee
代码:
alter table emp rename to employee
(4)删除字段
ALTER TABLE表名DROP字段名;
3.2.5表删除(drop/truncate打头)
(1)删除表
DROP TABLE [ IF EXISTS]表名;
(2)删除指定表,并重新创建该表。
TRUNCATE TABLE表名; (数据没有了只有一张空表了)
例:drop table if exists employee
查询显示无employee表了。
3.3 DDL总结
3.3.1 DDL-数据库操作
SHOW DATABASES;
CREATE DATABASE数据库名;
USE数据库名;
SELECT DATABASE();
DROP DATABASE数据库名;
3.3.2.DDL-表操作
SHOW TABLES ;
CREATE TABLE表名(字段字段类型,字段字段类型);
DESC表名;
SHOW CREATE TABLE表名;
ALTER TABLE表名 ADD/MODIFY/CHANGE/DROP/RENAME TO ...;
DROP TABLE表名;
4 DML
MySQL图形化工具,DataGrip>Navicat
但是DataGrip是收费的,有30天免费,可以申请学生邮箱!!!
链接数据库成功,跟我Navicat里面是一样的了。安装并链接好DataGrip后,学习DML。
DataGrip中的schema = database
在上面+操作,下面自己生成SQL语句,真香。
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增删改操作。
4.1添加数据(INSERT)
(1)给指定字段添加数据
INSERT INTO表名(字段名1,字段名2,.....)VALUES(值1,值2,....);
(2)给全部字段添加数据(不用写字段名了)
INSERT INTO表名VALUES(值1,值2,...);
(3)批量添加数据(用括号和逗号分隔)
INSERT INTO表名(字段名1,字段名2,...))VALUES(值1,值2,...),(值1,值2...).(值1,值2,...);
INSERT INTO表名VALUES(值1,值2,...).(值1,值2,...), (值1,值2,...);
注意:
·插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
·字符串和日期型数据应该包含在引号中。
·插入的数据大小,应该在字段的规定范围内。
例:
#指定全部字段
insert into employee(id, empid, empname,gender,age, idcard, entime) values(1,'1','zhg','n',10,'1234567889','2000-01-12');
#指定部分字段
insert into employee (id, empid) values(3,'3');
#不用指定,插入全部字段
insert into employee values(2,'2','zhg','n',10,'1234567889','2000-01-12');
#批量插入
insert into employee values(4,'4','zhg','n',10,'1234567889','2000-01-12'), (5,'5','zhg','n',10,'1234567889','2000-01-12'), (6,'6','zhg','n',10,'1234567889','2000-01-12'), (7,'7','zhg','n',10,'1234567889','2000-01-12');
结果如下:
4.2修改数据(UPDATE)
修改"表名"这个表总的字段数据信息:
UPDATE 表名 SET字段名1=值1 ,字段名2=值2,....[ WHERE条件];
例:
#将id=1的员工名字改为xixi
update employee set empname='xixi' where id = 1;
#将所有员工入职时间改为2008-02-13
update employee set entime='2008-02-13'
修改结果如下:
4.3删除数据(DELETE)
DELETE FROM表名[WHERE条件]
注意:
·DELETE语句的条件可有可无,如果没有条件,则会删除整张表的所有数据。
·DELETE语句不能删除某一个字段的值(可以使用URDATE)。
例:
#删除id = 1的员工
delete from employee where id = 1
4.4 DML总结
1.添加数据
INSERT INTO 表名(字段1,字段2,...) VALUES(值1,值2,..)[,,(值1,值2,...)...];
2.修改数据
UPDATE 表名 SET字段1=值1,字段2=值2[ WHERE条件];
3.删除数据
DELETE FROM 表名 [WHERE条件];
5 DQL(查询)
DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。查询关键字:SELECT
·DQL-语法
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
#新建emp表
create table emp(
id int comment '编号',
workno varchar(10) comment '员工工号',
name varchar(10) comment '员工姓名',
gender char comment '性别',
age tinyint unsigned comment'年龄',
idcard char(18) comment'身份证号',
workaddress varchar(50) comment '工作地址',
endate date comment'入职时间'
);
#解决DataGrip对出现中文报错,使用如下语句,否则name和gender中只能是英文不能是中文。alter tableemp convert to charsetutf8;
#插入数据
insert into emp (id,workno,name,gender,age,idcard , workaddress,endate)
values (1,'1','柳岩','女',20,'123456789012345678','北京','2000-01-01'),
(2,'2','张无忌','男',18,'123456789012345670','北京','2005-09-01'),
(3,'3','韦一笑','男',38,'123456789712345670','上海','2005-08-01'),
(4,'4','赵敏','女',18,'123456757123845670','北京','2009-12-01'),
(5,'5','小昭','女',16,'123456769012345678 ','上海','2007-07-01'),
(6,'6','杨道','男',28,'12345678931234567X','北京','2006-01-01 '),
(7,'7','范瑶','男',40,'123456789212345670','北京','2005-05-01 '),
(8,'8','黛绮丝','女',38,'123456157123645670','天津','2015-05-01 '),
(9,'9','范凉凉','女',45,'123156789012345678','北京','2010-04-01 '),
(10,'10','陈友谅','男',53,'123456789012345670','上海','2011-01-01'),
(11,'11','张士诚','男',55,'123567897123465670','江苏','2015-05-01'),
(12,'12','常遇春','男',32,'123446757152345670','北京','2004-02-01 '),
(13,'13','张三丰','男',88,'123656789012345678','江苏','2020-11-01 '),
(14,'14','灭绝','女',65,'123456719012345670','西安','2019-05-01 '),
(15,'15','胡青牛','男',70,'12345674971234567X','西安','2018-04-01 '),
(16,'16 ','周芷若','女',18, null,'北京','2012-06-01 ');
5.1基本查询
查询例:
#查询多个字段
select name,workno,workaddress adr from emp;
#查询员工地址不能重复并起别名
select distinct workaddress adr from emp;
(distinct 好像只能紧跟 select)
5.2条件查询(where)
语法:SELECT 字段列表 FROM 表名 WHERE 条件列表;
案例:
一个下划线_代表一个字符,%匹配任意个字符。
#查询姓名为两个字的员工
select * from emp where name like'__';
#查询身份证最后一位为X的员工
select * from emp where idcard like'%X';
5.3聚合函数
将一列数据作为一个整体,进行纵向计算。
常见聚合函数:
语法:SELECT聚合函数(字段列表)FROM表名;
注意:null值不参与所有聚合函数运算。
案例:
5.4 分组查询(group by)
有些情况不分组也可以进行聚合运算,只有当前数据记录可以进行该纵向计算。
1.语法
SELECT字段列表FROM表名[ WHERE条件 ] GROUP BY分组字段名[HAVING分组后过滤条件];
- where与having区别
执行时机不同: where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。判断条件不同: where不能对聚合函数进行判断,而having可以。
注意
·执行顺序: where >聚合函数>having 。
·分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
案例:查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于1的工作地址。
分析:
分组前过滤:年龄小于45的员工------where
分组:工作地址------group by
分组后过滤:员工数量大于等于3的工作地址------having
代码:
select workaddress,count(id) countid
from emp
where age<45
group by workaddress
having count(id) >=1;
分组后,有些字段就是不能同时输出了。
5.5排序查询(order by)
1.语法
SELECT字段列表FROM表名
ORDER BY字段1排序方式1,字段2排序方式2;
2.排序方式
ASC:升序(默认值,所以asc可以省略)
DESC:降序
注意:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
案例:根据年龄对公司的员工进行升序排序,年龄相同,再按照入职时间进行降序排序.
代码:
select * from emp order by age,endate desc;
5.6 分页查询(limit)
(1)语法:
SELECT字段列表FROM 表名LIMIT起始索引,查询记录数;
(2)注意:
·起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。
·分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
·如果查询的是第一页数据,起始索引0可以省略,直接简写为limit 10。
(3)案例:
#查询第1页员工数据,每页展示10条记录
select * from emp limit 0,10;
select * from emp limit 10; #起始页为0时可省略,效果同上
#查询第2页员工数据,每页展示10条记录#起始索引=(页码-1)\*页展示记录数=(2-1)\*10 =10,所以这里其实索引为10
select * from emp limit 10,10;
5.7 DQL语句总结
6 DCL语句
DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。因此开发人员不用掌握,主要是DBA数据库管理员进行操作。
6.1用户管理
1.查询用户
USE mysql;
SELECT * FROM user;
2.创建用户
CREATE USER '用户名'@'主机名'IDENTIFIED BY'密码';
3.修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY'新密码';
4.删除用户
DROP USER '用户名'@'主机名';
6.2权限控制
1.查询权限
SHOW GRANTS FOR'用户名'@'主机名';
2.授予权限
GRANT权限列表ON数据库名.表名TO'用户名'@'主机名';
3.撤销权限
REVOKE 权限列表ON数据库名.表名FROM''用户名'@'主机名';