1.SQL语句可以单行或多行书写,分号结尾.
2.SQL语句可以使用空格或缩进增强语句的可读性.
3.MySQL数据库库的SQL语句不区分大小写,关键字建议使用大写.
4.注释:
①单行注释:–注释内容或#注释内容(MySQL特有)
②多行注释:
/*注释内容*/
类型 | 大小 | 有符号(SIGNED)范围 | 无符号(UNSIGNED)范围 | 描述 |
---|---|---|---|---|
TINYINT | 1 byte | (-128,127) | (0,255) | 小整数 |
SMALLINT | 2 bytes | (-32768,32767) | (0,65535) | 大整数 |
MEDIUMINT | 3 bytes | (-8388608,8388607) | (0,16777215) | 大整数 |
INT或INTEGER | 4 bytes | (-2147473648,2147473647) | (0,4294967295) | 大整数 |
BIGINT | 8 bytes | (-263,263-1) | (0,2^64-1) | 极大整数 |
FLOAT | 4 bytes | (-3.402823466 E+38,3.402823466351 E+38) | 0和(1.175494351 E-38,3.402823466 E+38) | 单精度浮点数 |
DOUBLE | 8 bytes | (-1.7976931348623157 E+308,1.7976931348623157 E+308) | 0和(2.2250738585072014 E-308,1.7976931348623157 E+308) | 双精度浮点数 |
DECIMAL | 依赖于M(精度)和D(标度)的值 | 依赖于M(精度)和D(标度)的值 | 小数值(经确定点数) |
类型 | 大小 | 描述 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过255个字符的二进制数据 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65535 bytes | 长文本数据 |
MEDIUMBLOB | 0-15777215 bytes | 二进制形式的中长文本数据 |
MEDIUMTEXT | 0-15777215 bytes | 中长文本数据 |
LONGBLOB | 0-4294967295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4294967295 bytes | 极大文本数据 |
类型 | 大小 | 范围 | 格式 | 描述 |
---|---|---|---|---|
DATE | 3 | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 日期 |
TIME | 3 | -838:59:59 至 838:59:59 | HH:MM:SS | 时间或持续时间 |
YEAR | 1 | 1901 至 2155 | YYYY | 年份 |
DATETIME | 8 | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间 |
TIMESTAMP | 4 | 1970-01-01 00:00:01 至 2038 01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 混合日期和时间,时间戳 |
设计员工表如下:
①编号(纯数字)
②员工工号(字符串类型,长度不超过10位)
③员工姓名(字符串类型,长度不超过10位)
④性别(男/女,存储一个汉字)
⑤年龄(不存在负数)
⑥身份证号(二代身份证均为18位,末位可能是X)
⑦入职时间(取年月日)
mysql> create table emp(
-> id int comment '编号',
-> workno varchar(10) comment '工号',
-> name varchar(10) comment '姓名',
-> gender char(1) comment '性别',
-> age tinyint unsigned comment '年龄',
-> idcard char(18) comment '身份证号',
-> entrydate date comment '入职时间'
-> )comment '员工表';
Query OK, 0 rows affected (0.11 sec)
SHOW DATABASE;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 发字符集] [COLLATE 裴谞规则];
①直接创建
mysql> create database itcast;
Query OK, 1 row affected (0.03 sec)
②如果数据库存在则不进行创建
mysql> create database if not exists itcast;
Query OK, 1 row affected, 1 warning (0.01 sec)
③按默认字符集创建数据库
mysql> create database test001 default charset utf8mb4;
Query OK, 1 row affected (0.02 sec)
DROP DATABASE [IF EXISTS] 数据库名;
mysql> drop database test001;
Query OK, 0 rows affected (0.02 sec)
USE 数据库名;
①使用itcast数据库
mysql> use itcast
Database changed
②查询当前使用的数据库
SELECT DATABASE();
CREAT TABLE 表名(
字段1 字段1类型[COMMENT 字段1注释],
字段n 字段n类型[COMMENT 字段n注释]
)[VCOMMENT 表注释];
mysql> create table tb_user(
-> id int comment '编号',
-> name varchar(50) comment '姓名',
-> age int comment '年龄',
-> gender varchar(1) comment '性别'
-> )comment '用户表';
Query OK, 0 rows affected (0.14 sec)
SHOW TABLES;
mysql> show tables;
+------------------+
| Tables_in_itcast |
+------------------+
| tb_user |
+------------------+
1 row in set (0.00 sec)
DESC 表名;
mysql> desc tb_user;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| gender | varchar(1) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
SHOW CREAT TABLE 表名;
mysql> show create table tb_user;
+---------+---------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------+
| Table | Create Table
|
+---------+---------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------+
| tb_user | CREATE TABLE `tb_user` (
`id` int DEFAULT NULL COMMENT '编号',
`name` varchar(50) DEFAULT NULL COMMENT '姓名',
`age` int DEFAULT NULL COMMENT '年龄',
`gender` varchar(1) DEFAULT NULL COMMENT '性别'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户
表' |
+---------+---------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------+
1 row in set (0.01 sec)
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
案例:
为emp表增加一个新字段"昵称"为nickname,类型为varchar(20).
mysql> alter table emp add nickname varchar(20) comment '昵称';
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+-----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| workno | varchar(10) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| age | tinyint unsigned | YES | | NULL | |
| idcard | char(18) | YES | | NULL | |
| entrydate | date | YES | | NULL | |
| nickname | varchar(20) | YES | | NULL | |
+-----------+------------------+------+-----+---------+-------+
8 rows in set (0.01 sec)
修改字段类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度)[COMMENT 注释] [约束];
案例:
将emp表的nickname字段修改为username,类型为varchar(30).
mysql> alter table emp change nickname username varchar(30) comment '用户名';
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+-----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| workno | varchar(10) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| age | tinyint unsigned | YES | | NULL | |
| idcard | char(18) | YES | | NULL | |
| entrydate | date | YES | | NULL | |
| username | varchar(30) | YES | | NULL | |
+-----------+------------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
ALTER TABLE 表名 DROP 字段名;
案例:
将emp表的字段username删除.
mysql> alter table emp drop username;
Query OK, 0 rows affected (0.18 sec)
Records: 0 Duplicates: 0 Warnings: 0
ALTER TABLE 表名 RENAME TO 新表名;
案例:
将emp表的表名修改为employee.
mysql> alter table emp rename to employee;
Query OK, 0 rows affected (0.04 sec)
删除表
DROP TABLE [IF EXISTS] 表名;
mysql> drop table if exists tb_user;
Query OK, 0 rows affected (0.13 sec)
删除制定表,并重新创建该表
TRUNCATE TABEL 表名;
sqlyog Navicat DataGrip
创建mysql-base项目→添加Data Source→my sql
右键点击MySQL-@locallhost→新建schema→新建数据库:test
右键点击数据库:test→新建:Table
表名:user→注释:用户表→添加字段Columns:id int 编号→添加字段Columns:name varchar(50) 姓名→Execute
右键点击表:user→Modify Table
添加新字段age int 年龄
右键点击数据库test→New→Query Console
show databases;→点击执行
Data manipulation Language(数据操作语言),用来对数据库中标的数据记录进行增删改操作.
INSERT INTO 表名 (字段1,字段2,…) VALUES (值1,值2,…);
INSERT INT O表名 VALUES (值1,值2,…);
INSERT INTO 表名 (字段1,字段2,…) VALUES (值1,值2,…),(值1,值2,…),(值1,值2,…);
INSERT INT O表名 VALUES (值1,值2,…),(值1,值2,…),(值1,值2,…);
插入数据时,制定的字段顺序与值得顺序一致.
字符串和日期型数据应包含在引号中.
插入的数据大小,应该在字段的规定范围内.
在数据库itcast右键→New→Query Console
insert into employee(id, workno, name, gender, age, idcard, entrydate) values (1,'1','Itcast','男',10,'123456789012345678','2000-01-01');
select * from employee;
insert into employee values (1,'1','张无忌','男',10,'123456789012345678','2000-01-01');
select * from employee;
insert into employee values (3,'3','赵敏','女',18,'123456789012345671','2010-03-05'),(4,'4','小昭','女',17,'123456789012345672','2010-09-01');
UPDATE 表名 SET 字段名1=值1,字段名2=值2,…[WHERE 条件];
注意:如果没有条件则修改整张表的数据.
--修改id为1的数据,将name的值修改为'张三丰'
update employee set name='张三丰' where id =1;
--修改id为3的数据,将name修改为'玄冥',gender修改为'男'
update employee set name ='玄冥',gender='男' where id=3;
--修改全部记录的entrydate为'2020-01-09'
update employee set entrydate='2020-01-09';
DELETE FROM 表名 [WHERE 条件];
注意:没有条件会删除整张表的所有数据.
不能删除某一个字段的值(可以使用UPDAE).
--删除gender条件为'女'的数据记录
delete from employee where gender='女';
--删除所有数据记录
delete from employee;
Data Query Language(数据库查询语言),查询数据库中标的记录.
书写顺序:
SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后条件列表 ORDER BY 排序字段列表 LIMIT 分页参数
SELECT 字段1,字段2,字段3… FROM 表名;
SELECT * FROM 表名;
--查询数据
--数据准备
create table emp(
id int comment '编号',
workno varchar(10) comment '工号',
name varchar(10) comment '姓名',
gender char(1) comment '性别',
age tinyint unsigned comment '年龄',
idcard char(18) comment '身份证号',
workaddress varchar(50) comment '工作地址',
entrydate date comment '入职时间'
) comment '员工表';
--数据记录
insert into emp (id,workno,name,gender,age,idcard,workaddress,entrydate)
values (1,'1','柳岩','女',20,'123456789012345678','北京','2000-01-01'),
(2,'2','张无忌','男',18,'123456789012344478','深圳','2005-09-01'),
(3,'3','韦一笑','男',38,'123456789012345578','北京','2000-08-01'),
(4,'4','赵敏','女',18,'123456789012345666','杭州','2009-12-01'),
(5,'5','小昭','女',16,'123456789012345678','杭州','2007-07-01'),
(6,'6','杨肖','男',28,'12345678901234567x','北京','2000-01-01'),
(7,'7','范瑶','男',40,'123456789012345678','天津','2000-01-01'),
(8,'8','爱丽丝','女',38,'123456789012345678','北京','2000-01-01'),
(9,'9','段誉','男',19,'123456789012345558','天津','2000-01-01'),
(10,'10','虚竹','男',21,'123456789066345678','南京','2000-01-01'),
(11,'11','周伯通','男',48,'123456777012345678','上海','2000-01-01'),
(12,'12','王重阳','男',52,'123459989012345678','江苏','2000-01-01'),
(13,'13','灭绝','女',49,'123459989012345678','西安','2000-01-01'),
(14,'14','周芷诺','女',18,NULL,'西安','2000-01-01'),
(15,'15','阿朱','女',17,'123456789012345645','北京','2000-01-01'),
(16,'16','胡青牛','男',65,'12345678901234566x','杭州','2000-01-01');
--1.查询指定字段name,workno,age返回值
select name,workno,age from emp;
--2.查询所有字段返回值
select id,workno,name,gender,age,idcard,workaddress,entrydate from emp;
select * from emp;
--3.查询所有员工的工作地址,起别名
select workaddress as '工作地址' from emp;
select workaddress '工作地址' from emp;
--4.查询工作地址并去除重复值
select distinct workaddress '工作地址' from emp;
SELECT 字段1 [AS 别名1],字段2 [AS 别名2] … FROM 表名;
SELECT DISINCT 字段列表 FROM 表名;
SELECT 字段列表 FROM 表名 WHERE 条件列表;
比较运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小鱼 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
BETWEEN … AND … | 在某个范围内(包含最小,最大值) |
IN(…) | 在IN之后的列表中的值,多选一 |
LIKE 占位符 | 模糊匹配(_匹配单个字符,%匹配任意个字符) |
IS NULL | 是NULL |
逻辑运算符 | 功能 |
---|---|
AND 或 && | 并且(多个条件同时成立) |
OR 或 || | 或者(多个条件任意一个成立) |
NOT 或 ! | 非,不是 |
--条件查询
--1.查询年龄等于65的员工
select * from emp where age=65;
--2.查询年龄小于20的员工
select * from emp where age<20;
--3.查询年龄小于等于20的员工
select * from emp where age<=20;
--4.查询没有身份证号的员工信息
select * from emp where idcard is null;
--5.查询有身份证号的员工信息
select * from emp where idcard is not null;
--6.查询年龄不等于65的员工信息
select * from emp where age!=65;
select * from emp where age<>65;
--7.查询年龄在15(包含15)到20(包含20)之间的员工
select * from emp where age between 15 and 20;
select * from emp where age>=15 and age<=20;
select * from emp where age>=15 && age<=20;
--8.查询性别为女且年龄小于25的员工
select * from emp where gender='女' && age<25;
--9.查询年龄等于18或20或40的员工
select * from emp where age=18 or age=20 or age=40;
select * from emp where age=18 || age=20 || age=40;
select * from emp where age in(18,20,40);
--10.查询姓名为两个字的员工
select * from emp where name like '__';
--11.查询身份证号最后一位是X的员工
select * from emp where idcard like '%x';
将一列数据作为一个整体进行纵向计算.
函数 | 功能 |
---|---|
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
SELECT 聚合函数(字段列表) FROM 表名;
注意:所有聚合函数不计算NULL值.
--聚合函数
--1.统计企业员工数量
select count(*) from emp;
select count(idcard) from emp;
--2.统计企业员工平均年龄
select avg(age) from emp;
--3.统计员工的最大年龄
select max(age) from emp;
--4.统计员工的最小年龄
select min(age) from emp;
--5.统计杭州地区员工年龄之和
select sum(age) from emp where workaddress='杭州';
SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
执行时机不同:where是分组之前进行过滤,不满足where条件的不参与分组;having是分组后对结果进行过滤.
执行条件不同:where不能对聚合函数进行判断;having可以.
--分组查询
--1.根据性别分组,统计男性员工和女性员工的数量
select gender,count(*) from emp group by gender;
--2.根据性别分组,统计男性员工和女性员工的平均年龄
select gender,avg(age) from emp group by gender;
--3.查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
select workaddress,count(*) from emp where age <45 group by workaddress having count(*)>=3;
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
ASC:升序(默认)
DESC:降序
注意:多字段排序,当第一个字段值相同时才会根据第二个字段进行排序.
--排序查询
--1.根据年龄对公司的员工进行升序排序
select * from emp order by age asc;
--2.根据入职时间,对员工进行降序排序
select * from emp order by entrydate desc;
--3.根据年龄对公司的员工进行升序排序,年龄相同,再按照入职时间进行降序排序
select * from emp order by age asc,entrydate desc;
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
注意:
起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数.
分页查询是数据库方言,不同的数据库有不同的实现,MySQL中是LIMIT.
如果查询的是第一页的数据,起始索引可以省略,直接简写为limit 10.
--分页查询
--1.查询第1页员工数据,每页显示6条记录
select * from emp limit 0,6;
select * from emp limit 6;
--2.查询第3页员工数据,每页显示6条记录--起始索引=(页码-1)*每页显示记录数
select * from emp limit 12,6;
Data Control Language(数据库控制语言),用来管理数据库用户,控制数据库访问权限.
注意:主机名可以使用通配符.
USE mysql;
SELECT * FROM user;
用户信息在系统数据库mysql的user表中.
CREATE USER ‘用户名’@‘主机名’ IDENTIFIED BY ‘密码’
ALTER USER ‘用户名’@‘主机名’ IDENTIFIED WITH mysql_native_password BY ‘新密码’;
DROP USER ‘用户名’@‘主机名’;
--创建rexmen用户,只能够在当前主机localhost访问,密码123456
create user 'rexmen'@'localhost' identified by '123456';
--创建nana用户,可以在任意主机访问数据库,密码123456;
create user 'nana'@'%' identified by '123456';
--修改用户nana的访问密码为1234;
alter user 'nana'@'%' identified with mysql_native_password by '1234';
--删除rexmen@localhost用户
drop user 'rexmen'@'localhost';
常用权限
权限 | 说明 |
---|---|
ALL,ALL PRIVILEGES | 所有权限 |
SELECT | 查询数据 |
INSERT | 插入数据 |
UPDATE | 修改数据 |
DELETE | 删除数据 |
ALTER | 修改表 |
DROP | 删除数据库/表/视图 |
CREATE | 创建数据库/表 |
SHOW GRANTS FOR ‘用户名’@‘主机名’;
GRANT 权限列表 ON 数据库名.表名 TO ‘用户名’@‘主机名’;
REVOKE 权限列表 ON 数据库名.表名 FROM ‘用户名’@‘主机名’;
--查询权限
show grants for 'nana'@'%';
--授予权限
grant all on itcast.* to 'nana'@'%';
--撤销权限
revoke all on itcast.* from 'nana'@'%';
注意:
多个权限之间使用逗号分隔.
授权时数据库名和表名可以使用*进行通配代表所有.