目录
将数据放入自己的mysql数据库中做练习用
1.操作登录使用
1.1 登陆Mysql数据库
1.2展示(查询)所有数据库
1.3 进入数据库
1.4 创建数据库
2 DDL
对表结构修改
3 DCL
1 查看用户权限
2 被授权的用户
3 授予权限
4 撤销权限
4 DQL:
1 列(字段)控制
2 条件控制:
条件查询
模糊查询
3 排序:order by 排序的关键字
4 聚合函数:聚合函数用来做某列的纵向运算
5 分组查询
6 limit字句
SQL语法教程 https://www.w3school.com.cn/sql/index.asp
mysql教程https://www.runoob.com/mysql/mysql-tutorial.html
-- 如果test数据库不存在,就创建test数据库:
CREATE DATABASE IF NOT EXISTS test;
-- 切换到test数据库
USE test;
-- 删除classes表和students表(如果存在):
DROP TABLE IF EXISTS classes;
DROP TABLE IF EXISTS students;
-- 创建classes表:
CREATE TABLE classes (
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 创建students表:
CREATE TABLE students (
id BIGINT NOT NULL AUTO_INCREMENT,
class_id BIGINT NOT NULL,
name VARCHAR(100) NOT NULL,
gender VARCHAR(1) NOT NULL,
score INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 插入classes记录:
INSERT INTO classes(id, name) VALUES (1, '一班');
INSERT INTO classes(id, name) VALUES (2, '二班');
INSERT INTO classes(id, name) VALUES (3, '三班');
INSERT INTO classes(id, name) VALUES (4, '四班');
-- 插入students记录:
INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, '小明', 'M', 90);
INSERT INTO students (id, class_id, name, gender, score) VALUES (2, 1, '小红', 'F', 95);
INSERT INTO students (id, class_id, name, gender, score) VALUES (3, 1, '小军', 'M', 88);
INSERT INTO students (id, class_id, name, gender, score) VALUES (4, 1, '小米', 'F', 73);
INSERT INTO students (id, class_id, name, gender, score) VALUES (5, 2, '小白', 'F', 81);
INSERT INTO students (id, class_id, name, gender, score) VALUES (6, 2, '小兵', 'M', 55);
INSERT INTO students (id, class_id, name, gender, score) VALUES (7, 2, '小林', 'M', 85);
INSERT INTO students (id, class_id, name, gender, score) VALUES (8, 3, '小新', 'F', 91);
INSERT INTO students (id, class_id, name, gender, score) VALUES (9, 3, '小王', 'M', 89);
INSERT INTO students (id, class_id, name, gender, score) VALUES (10, 3, '小丽', 'F', 85);
-- OK:
SELECT 'ok' as 'result:';
mysql -u root -p 密码
mysql -uroot -p
命令完成后输入英文符号;并回车执行命令
show databases;
use dataname;
create database dataname;
包括创建,删除,修改数据库,表,列的SQL语句。主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用
create table tablename(name varchar(32),age int);//创建表(字段)
alter table //删除添加修改表
alter table person add home varchar(32);//添加列
alter table person drop name;//删除列
alter table student rename person;
/*这里的student是原名,person是修改过后的名字
用rename来重命名,也可以使用rename to
*/
alter table person change stu_name name varchar(25);
/*
这里stu_name是原名,name是新名
需要注意的是不管改不改数据类型,后面的数据类型都要写
如果不修改数据类型只需写成原来的数据类型即可
tips:我们同样可以使用change来达到modify的效果,只需在其后写一样的字段名
*/
alter table person modify name varchar(20);
//此处modify后面的name为字段名,我们将原来的varchar(25)改为varchar(20)
alter table person modify name c_name integer;
desc person //查看表结构
DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。
当成功创建用户账户后,还不能执行任何操作,需要为该用户分配适当的访问权限。可以使用SHOW GRANTS FOR
语句来查询用户的权限。例如:
SHOW GRANTS FOR test
'user_name'@'host_name'
'host_name'
用于适应从任意主机访问数据库而设置的,可以指定某个地址或地址段访问。user
表中host
列的默认值
host | 说明 |
---|---|
% | 匹配所有主机 |
localhost | localhost不会被解析成IP地址,直接通过UNIXsocket连接 |
127.0.0.1 | 会通过TCP/IP协议连接,并且只能在本机访问 |
::1 | ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1 |
host_name
格式有以下几种:
%
模糊匹配,符合匹配条件的主机可以访问该数据库实例,例如192.168.2.%
或%.test.com
;localhost
、127.0.0.1
、::1
及服务器名等,只能在本机访问;192.168.2.1
或192.168.2.0/24
或192.168.2.0/255.255.255.0
;%
。授予列(字段)权限时,priv_type
的值指定为CREATE USER
权限,具备创建用户、删除用户、重命名用户和撤消所有特权,而且是全局的。
有ON,是授予权限,无ON,是授予角色。如:
-- 授予数据库db1的所有权限给指定账户
GRANT ALL ON db1.* TO 'user1'@'localhost';
-- 授予角色给指定的账户
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
若要权限生效,需要执行以下语句:
FLUSH PRIVILEGES;
REVOKE
语法和GRANT
语句的语法格式相似,但具有相反的效果
REVOKE
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user [, user] ...
REVOKE ALL [PRIVILEGES], GRANT OPTION
FROM user [, user] ...
REVOKE PROXY ON user
FROM user [, user] ...
它们是SELECT就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言
select columnlist //列名
from table_list //哪些表获取数据
where condition //过滤数据的条件
group by grouping //分组条件
having condition //对分组结果进行过滤
start,limit //对结果进行限定
查询需求如下:
–条件:年龄为奇数
按home 分组
查询分数最高的 并且大于80分
只返回一条
查询person表中的age为奇数的以home分组并且age为1的 查询一条
select age from person where age%2=1 group by home having age=1 limit 1;
①:查询所有列
select * from 表名; //其中 * 表示查询所有列
②:查询指定 列()
select 列1 [,列2,列3...] from 表名;
③:完全重复的记录只显示一次
select distinct 列名 from 表名;
④:列运算
* 数值类型的列可以做加、减、乘、除运算
>select 列名+2 from 表名; 把这个列的值加上2
* 字符串类型的列可以做连续运算
>select concat('***',列名) from 表名; 在这个列值前面拼接上3个***
* 转换NULL值
有时候需要把null转换为其他值再来做运算或者赋值,如果该列存在null值,做运算还是null,这时就希望把该列的null值转化为0或者其他值再来做运算
>select ifnull(列名,想要转化为什么样的值) from 表名;
* 给列起别名
>select ifnull(列名,0)+100 AS 别名 from 表名; AS 可以省略不写
与前面的讲的UPDATE和DELETE的语句一样,SELECT语句也可以使用 WHERE关键字来控制条件
SELECT 列名1,列名2... 列名n FROM 表名 WHERE 条件;(age>10 AND name IS NOT NULL)
当你想查询姓cao的name时,这时就可以使用模糊查询
SELECT * FROM 表名 WHERE name LIKE '黄_';( 1 个下划线代表 1 个字符)
:查询限制了字符长度
SELECT * FROM 表名 WHERE name LIKE '黄%';( % 匹配 0...n 个字符)
:查询不限制字符长度
SELECT * FROM 表名 WHERE name LIKE '%小%';(name 中有"小"的所有数据)
(1)升序
* SELECT * FROM 表名 ORDER by 列名 ASC;(ASC :升序)
>按照 列名 来做排序---升序
>其中ASC可以省略(建议不要省略)
(2)降序
* SELECT * FROM 表名 ORDER BY 列名 DESC; ( DESC : 降序)
>按照 列名 来做排序---降序
>其中DESC不可以省略
(3)多列排序
SELECT * FROM 表名 ORDER BY 列名1 ASC ,列名2 DESC;
(1)COUNT
SELECT COUNT(*) FROM 表名;
>计算表中列不全为NULL的记录的行数(有效记录)
SELECT COUNT(列名) FROM 表名;
>计算表中指定的列中值不为NULL的记录的行数
(2)MAX
SELECT MAX(列名) FROM 表名;
>计算指定列中的最大值
(3)MIN
SELECT MIN(列名) FROM 表名;
>计算指定列中的最小值
(4)SUM
SELECT SUM(列名) FROM 表名;
>计算指定列中的所有值的总和
(5)AVG
SELECT AVG(列名) FROM 表名;
>计算指定列中所有值总和的平均值
分组查询是把所有记录使用某一列进行分组,然后查询组信息
例如:
SELECT age,COUNT(*) FROM 表名 GROUP BY age;
>按照年龄进行分组,查询各个年龄的记录数
SELECT sex,MAX(age) FROM 表名 GROUP BY sex;
>按照性别进行分组,查询每组性别中的最大年龄
SELECT 列名 ,COUNT(*) FROM 表名 GROUP BY 列名 HAVING COUNT(*) > 3;
>按照性别分组,查询每组的记录数 大于 3 条记录数,
(方言—只有MySql有)
LIMIT 用来限定查询结果的起始行,以及总行数
例如:查询起始行为第3行,一共查询4行记录
SELECT * FROM 表名 LIMIT (pageIndex - 1)* pageCount , pageCount;
>其中2表示从第三行开始查,4表示查询4条记录,即:第3、4、5、6条记录
limit 被用来做数据分页查询