安徽建站平台,众筹网站怎么做,广州建设网站是什么,合肥做一个网站要多少钱一、Mysql5.7安装配置 下载后会得到zip 安装文件解压的路径最好不要有中文和空格这里我解压到 D:\hspmysql\mysql-5.7.19-winx64 目录下 【根据自己的情况来指定目录,尽量选择空间大的盘】 添加环境变量 : 电脑-属性-高级系统设置-环境变量#xff0c;在Path 环境变量增加mysq…
一、Mysql5.7安装配置 下载后会得到zip 安装文件解压的路径最好不要有中文和空格这里我解压到 D:\hspmysql\mysql-5.7.19-winx64 目录下 【根据自己的情况来指定目录,尽量选择空间大的盘】 添加环境变量 : 电脑-属性-高级系统设置-环境变量在Path 环境变量增加mysql的安装目录\bin目录, 如下图 在D:\hspmysql\mysql-7.19-winx64 目录下下创建 my.ini 文件, 需要我们自己创建 [client] port3306 default-character-setutf8 [mysqld] # 设置为自己MYSQL的安装目录 basedirD:\hspmysql\mysql-5.7.19-winx64\ # 设置为MYSQL的数据目录 datadirD:\hspmysql\mysql-5.7.19-winx64\data\ port3306 character_set_serverutf8 #跳过安全检查 skip-grant-tables 使用管理员身份打开 cmd , 并切换到 D:\hspmysql\mysql-5.7.19-winx64\bin 目录下, 执行mysqld -install初始化数据库: mysqld --initialize-insecure --usermysql 如果执行成功会生成 data目录: 启动mysql 服务: net start mysql 【停止mysql服务指令 net stop mysql】, 如果成功: 进入mysql 管理终端: mysql -u root -p 【当前root 用户密码为 空】修改root 用户密码 use mysql; update user set authentication_stringpassword(hsp) where userroot and Hostlocalhost; 老韩解读: 上面的语句就是修改 root用户的密码为 hsp 注意在后面需要带 分号回车即可执行该指令 执行: flush privileges; 刷新权限 退出: quit 修改my.ini , 再次进入就会进行权限验证了 #skip-grant-tables 重新启动mysql net stop mysql net start mysql 韩顺平提示: 该指令需要退出mysql 在Dos下执行. 再次进入Mysql, 输入正确的用户名和密码 mysql -u root -p 密码正确进入mysql 密码错误提示如下信息 安装过程中一定要按照老师的步骤来不然会错误. 如果真的错误了 清除mysql服务, 再次安装. 二、连接mysql
1.命令行连接mysql 2.Navicat图形化操作数据库 Navicat 安装配置教程 安装步骤下载后会得到exe 安装文件使用管理员身份安装这里我安装到 D:\program\Navicat 15 for MySQL 目录下 【根据自己的情况来指定目录】双击运行, 配置连接 和老师讲解的 命令行是一样只是变成的图形化. 输入正确的密码即可登录MySQL 韩顺平老师提示一定要保证MySQL 服务是运行的状态 3.SQLyog的安装和使用 下载后会得到SQLyog-13.6-0.x64Community.exe 安装文件使用管理员身份安装这里我安装到 D:\program\SQLyog Community 目录下 【根据自己的情况来指定目录】双击运行, 配置连接 输入正确的密码即可登录MySQL 韩顺平老师提示一定要保证MySQL 服务是运行的状态 三、Mysql的基础介绍
1.Mysql的三层结构
1.所谓安装Mysql数据库就是在主机安装一 个数据库管理系统(DBMS),这个管理程序可以管理多个数据库。DBMS(database manage system)
2. 一个数据库中可以创建多个表以保存数据(信息)。
3.数据库管理系统(DBMS)、数据库和表的关系如图所示:示意图 2.数据以表的形式存放 3.sql语句分类
DDL :数据定义语句[create表库]
DML :数据操作语句[增加insert修改update删除delete]
DQL :数据查询语句[select]
DCL :数据控制语句[管理数据库 grant revoke]
四、体会通过Java操作Mysql
1.创建一个商品hsp goods表选用适当的数据类型
2.添加2条数据
3.删除表goods
五、数据库的基本操作
1.创建数据库
CREATE DATABASE [IF NOT EXISTS] db_ name [create_ specification [, create_ specification] ..
create_ specification: [DEFAULT] CHARACTER SET charset_ name [DEFAULT] COLLATE collation_ name
1. CHARACTER SET:指定数据库采用的字符集如果不指定字符集,默认utf8
2. COLLATE:指定数据库字符集的校对规则(常用的utf8_bin 区分大小写、utf8_general不区分大小写 ci 注意默认是utf8_general ci)
练习:
1.创建一个名称为hsp db01的数据库。[图形化和指令演示] 2.创建个使用utf8字符集的hsp db02数据库 3.创建一个使用utf8字符集并带校对规则的hsp db03数据库 2.查看删除数据库
显示数据库语句:SHOW DATABASES
显示数据库创建语句:SHOW CREATE DATABASE db name
数据库删除语句: DROP DATABASE [IF EXISTS] db name
练习: database02.sql
1.查看当前数据库服务器中的所有数据库
2.查看前面创建的hsp db01数据库的定义信息
3.删除前面创建的hsp db01数据库
#演示删除和查询数据库
#查看当前数据库服务器中的所有数据库
SHOW DATABASES
#查看前面创建的hsp_db01数据库的定义信息
SHOW CREATE DATABASE hsp_db01
#老师说明 在创建数据库,表的时候为了规避关键字可以使用反引号解决
CREATE DATABASE CREATE
#删除前面创建的hsp_db01数据库
DROP DATABASE hsp_db01
3.备份和恢复数据库
备份数据库(注意:在DOS执行) mysqldump -u 用户名 -p -B 数据库1数据库2 数据库n 文件名.sql
恢复数据库(注意:进入SQLyog再执行) Source文件名.sql
练习: database03.sql备份hsp db02和hsp db03库中的数据并恢复 备份数据库的表
mysqldump -u 用户名 -p密码 数据库 表1 表2 表n d:\\文件名.sql 六、库的表的基本操作
1.创建表 CREATE TABLE tablename ( field1 datatype, field2 datatype, field3 datatype )character set字符集 collate校对规则 engine引擎 field:指定列名 datatype: 指定列类型(字段类型)
character set :如不指定则为所在数据库字符集
collate:如不指定则为所在数据库校对规则
engine:引擎(这个涉及内容较多后面单独讲解)
注意:yh_db02创建表时要根据需保存的数据创建相应的列并根据数据的类型定义相 应的列类型。例:(图形化 指令) 通过指令
CREATE TABLE user (id INT,name VARCHAR(255),password VARCHAR(255),birthday DATE)CHARACTER SET utf8 COLLATE utf8_bin ENGINE INNODB; 2.修改表和删除表
指令
使用ALTER TABLE语句追加修改或删除列的语法 ALTER TABLEtablename --添加列 ADD (column da ta type [DEFAULT expr] [column da tatype] . . .) ; ALTER TABLE tablename --修改列 MODIFY(column da ta type [DEFAULT expr] [column datatype] . . .) ; ALTER TABLE tablename--删除列 DROP (column) ; 查看表的结构desc表名; 修改表名: Rename table 表名 to 新表名 修改表字符集: alter table 表名 character set字符集; #修改表的操作练习
-- 员工表emp的上增加一个image列varchar类型(要求在resume后面)。
ALTER TABLE emp ADD image VARCHAR(32) NOT NULL DEFAULT AFTER RESUME
DESC employee -- 显示表结构可以查看表的所有列
-- 修改job列使其长度为60。
ALTER TABLE emp MODIFY job VARCHAR(60) NOT NULL DEFAULT
-- 删除sex列。
ALTER TABLE empDROP sex
-- 表名改为employee。
RENAME TABLE emp TO employee
-- 修改表的字符集为utf8
ALTER TABLE employee CHARACTER SET utf8
-- 列名name修改为user_name
ALTER TABLE employee CHANGE name user_name VARCHAR(64) NOT NULL DEFAULT
DESC employee七、Mysql常用的数据类型 常用的列类型 int double decimal char varchar text datetime timestamp 1.如何定义一个无符号的整数
int.sql文件
create table t10 (id tinyint ); //默认是有符号的
create table t11 (id tinyint unsigned );无符号的
#演示整型的是一个
#使用tinyint 来演示范围 有符号 -128 ~ 127 如果没有符号 0-255
#说明 表的字符集校验规则, 存储引擎老师使用默认
#1. 如果没有指定 unsinged , 则TINYINT就是有符号
#2. 如果指定 unsinged , 则TINYINT就是无符号 0-255
CREATE TABLE t3 (id TINYINT);
CREATE TABLE t4 (id TINYINT UNSIGNED);INSERT INTO t3 VALUES(127); #这是非常简单的添加语句
SELECT * FROM t3INSERT INTO t4 VALUES(255);
SELECT * FROM t4;
2.数值型(bit)的使用
1.基本使用
mysq| create table t02 (num bit(8));
mysq| insert into t02 (1, 3);
mysq| insert into t02 values(2, 65);
2.细节说明bit.sql
bit字段显示时
按照位的方式显示.
查询的时候仍然可以用使用添加的数值
如果一个值只有0, 1可以考虑使用bit(1) ,可以节约空间
位类型。M指定位数默认值1,范围1-64
使用不多
#演示bit类型使用
#说明
#1. bit(m) m 在 1-64
#2. 添加数据 范围 按照你给的位数来确定比如m 8 表示一个字节 0~255
#3. 显示按照bit
#4. 查询时仍然可以按照数来查询
CREATE TABLE t05 (num BIT(8));
INSERT INTO t05 VALUES(255);
SELECT * FROM t05;
SELECT * FROM t05 WHERE num 1; 3.数值型(小数)的基本使用
1. FLOAT/DOUBLE (UNSIGNED)
Float单精度精度Double 双精度.
2. DECIMAL(M,D) (UNSIGNED)
可以支持更加精确的小数位。M是小数位数(精度)的总数D是小数点(标度)后面的位数。
如果D是0,则值没有小数点或分数部分。M最大65。D最大是30。如果D被
省略默认是0。 如果M被省略默认是10。
建议:如果希望小数的精度高推荐使用decimal
#演示decimal类型、float、double使用#创建表
CREATE TABLE t06 (num1 FLOAT,num2 DOUBLE,num3 DECIMAL(30,20));
#添加数据
INSERT INTO t06 VALUES(88.12345678912345, 88.12345678912345,88.12345678912345);
SELECT * FROM t06;#decimal可以存放很大的数
CREATE TABLE t07 (num DECIMAL(65));
INSERT INTO t07 VALUES(8999999933338388388383838838383009338388383838383838383);SELECT * FROM t07;
CREATE TABLE t08(num BIGINT UNSIGNED)
INSERT INTO t08 VALUES(8999999933338388388383838838383009338388383838383838383);
SELECT * FROM t08; 4.字符串的基本使用
CHAR(size) size固定长度字符串最大255字符
VARCHAR(size) 0~65535理论上能存的字节数 可变长度字符串最大65532字节[utf8编码最大21844字符1-3个字节用于记录大小] (utf8 3个字节1个字符 / gbk 2个字节1个字符
#演示字符串类型使用char varchar
#注释的快捷键 shiftctrlc , 注销注释 shiftctrlr
-- CHAR(size)
-- 固定长度字符串 最大255 字符
-- VARCHAR(size) 0~65535字节
-- 可变长度字符串 最大65532字节 【utf8编码最大21844字符 1-3个字节用于记录大小】
-- 如果表的编码是 utf8 varchar(size) size (65535-3) / 3 21844
-- 如果表的编码是 gbk varchar(size) size (65535-3) / 2 32766
CREATE TABLE t09 (name CHAR(255));CREATE TABLE t10 (name VARCHAR(32766)) CHARSET gbk;DROP TABLE t10;
4.1字符串使用细节
1. 细节1 (字符所占用的字节是根据编码格式而改变的)
char(4) //这个4表示字符数(最大255)不是字节数,不管是中文还是字母都是放四个按字符计算根据编码格式计算字节大小 varchar(4)//这个4表示字符数不管是字母还是中文都以定义好的表的编码来存放数据.不管是中文还是英文字母都是最多存放4个是按照字符来存放的.
#演示字符串类型的使用细节
#char(4) 和 varchar(4) 这个4表示的是字符而不是字节, 不区分字符是汉字还是字母
CREATE TABLE t11(name CHAR(4));
INSERT INTO t11 VALUES(韩顺平好);SELECT * FROM t11;CREATE TABLE t12(name VARCHAR(4));
INSERT INTO t12 VALUES(韩顺平好);
INSERT INTO t12 VALUES(ab北京);
SELECT * FROM t12; 2.细节2
char(4)是定长(固定的大小)就是说即使你插入aa ,也会占用分配的4个字符的空间
varchar(4)是变长就是说如果你插入了aa ,实际占用空间大小并不是4个字符而是按照实际占用空间来分配(说明: varchar本身还需要占用1-3个字节来记录存放内容长度)
3.细节3
什么时候使用char ,什么时候使用varchar
1.如果数据是定长推荐使用char,比如md5的密码,邮编手机号身份证号码等. char(32)
2.如果一个字段的长度是不确定 我们使用varchar 比如留言文章
查询速度:
char varchar
4.细节4
在存放文本时也可以使用Text数据类型.可以将TEXT列视为VARCHAR列注意Text不能有默认值.大小0-2^16字节
如果希望存放更多字符可以选择MEDIUMTEXT 0-2^24或者LONGTEXT 0~2^32
#如果varchar 不够用可以考虑使用mediumtext 或者longtext,
#如果想简单点可以使用直接使用text
CREATE TABLE t13( content TEXT, content2 MEDIUMTEXT , content3 LONGTEXT);
INSERT INTO t13 VALUES(韩顺平教育, 韩顺平教育100, 韩顺平教育1000~~);
SELECT * FROM t13; 5.日期时间类型的基本使用
CREATE TABLE birthday6
( t1 DATE, t2 DATETIME, t3 TIM ESTAMP NOT NULL DEFAULT
CURRENT TIMESTAMP ON UPDATE
CURRENT TIMESTAMP ) ; timestamp时间戳
mysq| INSERT INTO birthday (t1,t2)
VALUES(2022-11-11 2022-11-11 10:10:10);
#演示时间相关的类型
#创建一张表, date , datetime , timestamp
CREATE TABLE t14 (birthday DATE , -- 生日job_time DATETIME, -- 记录年月日 时分秒login_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); -- 登录时间, 如果希望login_time列自动更新, 需要配置SELECT * FROM t14;
INSERT INTO t14(birthday, job_time) VALUES(2022-11-11,2022-11-11 10:10:10);
-- 如果我们更新 t14表的某条记录login_time列会自动的以当前时间进行更新
6.创建表的练习
创建一个员工表emp选用适当的数据类型 #创建表的课堂练习
-- 字段 属性
-- Id 整形
-- name 字符型
-- sex 字符型
-- brithday 日期型date
-- entry_date 日期型 (date)
-- job 字符型
-- Salary 小数型
-- resume 文本型
-- 自己一定要练习一把
CREATE TABLE emp (id INT,name VARCHAR(32),sex CHAR(1), brithday DATE,entry_date DATETIME,job VARCHAR(32),salary DOUBLE,resume TEXT) CHARSET utf8 COLLATE utf8_bin ENGINE INNODB;
-- 添加一条
INSERT INTO empVALUES(100, 小妖怪, 男, 2000-11-11, 2010-11-10 11:11:11, 巡山的, 3000, 大王叫我来巡山);SELECT * FROM emp; 八、数据库CRUD语句
1. Insert语句(添加数据)
INSERT INTO table name (colum [ column...]) VALUES (value[ value...] ) ;
#练习insert 语句
-- 创建一张商品表goods (id int , goods_name varchar(10), price double );
-- 添加2条记录
CREATE TABLE goods (id INT ,goods_name VARCHAR(10), -- 长度10price DOUBLE NOT NULL DEFAULT 100 );
-- 添加数据
INSERT INTO goods (id, goods_name, price) VALUES(10, 华为手机, 2000);
INSERT INTO goods (id, goods_name, price) VALUES(20, 苹果手机, 3000);
SELECT * FROM goods;CREATE TABLE goods2 (id INT ,goods_name VARCHAR(10), -- 长度10price DOUBLE NOT NULL DEFAULT 100 );
1.1Insert细节说明
1.插入的数据应与字段的数据类型相同。
比如把abc添加到int类型会错误
2.数据的长度应在列的规定范围内例如:不能将一个长度为80的字符串加
入到长度为40的列中。
3.在values中列出的数据位置必须与被加入的列的排列位置相对应。
4.字符和日期型数据应包含在单引号中。
5.列可以插入空值[前提是该字段允许为空]insert into table value(nulI)
6. insert into tab name (列名..) values (),(),()形式添加多条记录
7.如果是给表中的所有字段添加数据可以不写前面的字段名称
8.默认值的使用当不给某个字段值时如果有默认值就会添加否则报错如果希望有默认值需要在创建表的时候添加进去 #说明insert 语句的细节
-- 1.插入的数据应与字段的数据类型相同。
-- 比如 把 abc 添加到 int 类型会错误
INSERT INTO goods (id, goods_name, price) VALUES(韩顺平, 小米手机, 2000);--底层会尝试把字符串转为int型如果能转则不会报错如果是30就不会报错-- 2. 数据的长度应在列的规定范围内例如不能将一个长度为80的字符串加入到长度为40的列中。
INSERT INTO goods (id, goods_name, price) VALUES(40, vovo手机vovo手机vovo手机vovo手机vovo手机, 3000);--报错-- 3. 在values中列出的数据位置必须与被加入的列的排列位置相对应。
INSERT INTO goods (id, goods_name, price) -- 不对VALUES(vovo手机,40, 2000);-- 4. 字符和日期型数据应包含在单引号中。
INSERT INTO goods (id, goods_name, price) VALUES(40, vovo手机, 3000); -- 错误的 vovo手机 应该 vovo手机-- 5. 列可以插入空值[前提是该字段允许为空]insert into table value(null)
INSERT INTO goods (id, goods_name, price) VALUES(40, vovo手机, NULL);-- 6. insert into tab_name (列名..) values (),(),() 形式添加多条记录
INSERT INTO goods (id, goods_name, price) VALUES(50, 三星手机, 2300),(60, 海尔手机, 1800);-- 7. 如果是给表中的所有字段添加数据可以不写前面的字段名称
INSERT INTO goods VALUES(70, IBM手机, 5000);-- 8. 默认值的使用当不给某个字段值时如果有默认值就会添加默认值否则报错-- 如果某个列 没有指定 not null ,那么当添加数据时没有给定值则会默认给null-- 如果我们希望指定某个列的默认值可以在创建表时指定
INSERT INTO goods (id, goods_name) VALUES(80, 格力手机);SELECT * FROM goods;INSERT INTO goods2 (id, goods_name) VALUES(10, 顺平手机);
SELECT * FROM goods2;
2. Update语句(更新数据)
UPDATE tb1_name
SET col_name1 expr1 [ col name2expr2 . . .]
[WHERE where defini tion ]
-- 演示update语句
-- 要求: 在上面创建的employee表中修改表中的纪录
-- 1. 将所有员工薪水修改为5000元。[如果没有带where 条件会修改所有的记录因此要小心]
UPDATE employee SET salary 5000
-- 2. 将姓名为 小妖怪 的员工薪水修改为3000元。
UPDATE employee SET salary 3000 WHERE user_name 小妖怪
-- 3. 将 老妖怪 的薪水在原有基础上增加1000元
INSERT INTO employee VALUES(200, 老妖怪, 1990-11-11, 2000-11-11 10:10:10, 捶背的, 5000, 给大王捶背, d:\\a.jpg);UPDATE employee SET salary salary 1000 WHERE user_name 老妖怪 -- 可以修改多个列的值
UPDATE employee SET salary salary 1000 , job 出主意的WHERE user_name 老妖怪
SELECT * FROM employee;
2.1Update语句使用细节
1. UPDATE语法可以用新值更新原有表行中的各列。
2. SET子句指示要修改哪些列和要给予哪些值。
3. WHERE子句指定应更新哪些行。如没有WHERE子句则更新所有的行。
4.如果需要修改多个字段可以通过set字段1 值1,字段2 值2...
3. Delete语句(删除数据) delete from tb1 name [WHERE where defini tion] -- delete 语句演示-- 删除表中名称为’老妖怪’的记录。
DELETE FROM employee WHERE user_name 老妖怪;
-- 删除表中所有记录, 老师提醒一定要小心
DELETE FROM employee;-- Delete语句不能删除某一列的值可使用update 设为 null 或者
UPDATE employee SET job WHERE user_name 老妖怪;SELECT * FROM employee-- 要删除这个表
DROP TABLE employee;3.1 Delete语句使用细节
1.如果不使用where子句将删除表中所有数据。
2.Delete语句不能删除某一列的值(可使用update 设为null或者)
3.使用delete语句仅删除记录不删除表本身。如要删除表使用drop table语句。drop table表名;
4. Select语句(查找数据)(单表)
基本语法
SELECT [DISTINCT] * | { columnlco1umn2. column3. . } FROM tablename;
注意事项(创建测试表学生表)
1. Select指定查询哪些列的数据。
2. column指定列名。
3.*号代表查询所有列。
4.From指定查询哪张表。
5.DISTINCT可选指显示结果时是否去掉重复数据
CREATE TABLE student(id INT NOT NULL DEFAULT 1,NAME VARCHAR(20) NOT NULL DEFAULT ,chinese FLOAT NOT NULL DEFAULT 0.0,english FLOAT NOT NULL DEFAULT 0.0,math FLOAT NOT NULL DEFAULT 0.0
);INSERT INTO student(id,NAME,chinese,english,math) VALUES(1,韩顺平,89,78,90);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(2,张飞,67,98,56);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(3,宋江,87,78,77);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(4,关羽,88,98,90);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(5,赵云,82,84,67);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(6,欧阳锋,55,85,45);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(7,黄蓉,75,65,30);
INSERT INTO student(id,NAME,chinese,english,math) VALUES(8,韩信,45,65,99);SELECT * FROM student;-- 查询表中所有学生的信息。
SELECT * FROM student;
-- 查询表中所有学生的姓名和对应的英语成绩。
SELECT name,english FROM student;
-- 过滤表中重复数据 distinct 。
SELECT DISTINCT english FROM student;
-- 要查询的记录每个字段都相同才会去重
SELECT DISTINCT name, english FROM student; 使用表达式对查询的列进行运算 SELECT*| { column1| expression, column2 | expression,...} FROM tablename; 在select语句中可使用as语句 SELECT column_name as 别名 from 表名; -- select 语句的使用SELECT * FROM student;
-- 统计每个学生的总分
SELECT name, (chineseenglishmath) FROM student;
-- 在所有学生总分加10分的情况
SELECT name, (chinese english math 10) FROM student;
-- 使用别名表示学生分数。
SELECT name AS 名字, (chinese english math 10) AS total_score FROM student;在where子句中经常使用的运算符 -- select 语句
-- 查询姓名为赵云的学生成绩
SELECT * FROM student WHERE name 赵云
-- 查询英语成绩大于90分的同学
SELECT * FROM student WHERE english 90
-- 查询总分大于200分的所有同学SELECT * FROM student WHERE (chinese english math) 200-- 查询math大于60 并且(and) id大于4的学生成绩
SELECT * FROM studentWHERE math 60 AND id 4
-- 查询英语成绩大于语文成绩的同学
SELECT * FROM studentWHERE english chinese
-- 查询总分大于200分 并且 数学成绩小于语文成绩,的姓赵的学生.
-- 赵% 表示 名字以赵开头的就可以
SELECT * FROM studentWHERE (chinese english math) 200 AND math chinese AND name LIKE 赵%
-- 查询英语分数在 8090之间的同学。
SELECT * FROM studentWHERE english 80 AND english 90;
SELECT * FROM studentWHERE english BETWEEN 80 AND 90; -- between .. and .. 是 闭区间
-- 查询数学分数为89,90,91的同学。
SELECT * FROM student WHERE math 89 OR math 90 OR math 91;-- 等价与下面的IN语句
SELECT * FROM student WHERE math IN (89, 90, 91);
-- 查询所有姓韩的学生成绩。
SELECT * FROM student WHERE name LIKE 韩%
-- 查询数学分80语文分80的同学
SELECT * FROM student WHERE math 80 AND chinese 80SELECT * FROM student WHERE chinese BETWEEN 80 AND 90SELECT * FROM studentWHERE (math chinese english) IN (189,190,191)SELECT * FROM studentWHERE name LIKE 李% OR name LIKE 宋%SELECT * FROM studentWHERE (math - chinese) 0使用order by子句排序查询结果 SELECT column1 column2. column3 ... FROM table; order by colum asc | desc,... 1. Order by指定排序的列排序的列既可以是表中的列名也可以是select语句后指定的列名。 2. Asc 升序[默认]、Desc 降序 3. ORDER BY子句应位于SELECT语句的结尾。
-- 演示order by使用
-- 对数学成绩排序后输出【升序】。
SELECT * FROM student ORDER BY math;
-- 对总分按从高到低的顺序输出 [降序] -- 使用别名排序
SELECT name , (chinese english math) AS total_score FROM student ORDER BY total_score DESC;
-- 对姓韩的学生成绩[总分]排序输出(升序) where order by
SELECT name, (chinese english math) AS total_score FROM studentWHERE name LIKE 韩%ORDER BY total_score; 九、数据库函数
1.统计函数
合计/统计函数- count
Count返回行的总数 Select count(*)I count (列名) from tablename [WHERE where defini tion] -- 统计一个班级共有多少学生
SELECT COUNT(*) FROM student;
-- 统计数学成绩大于90的学生有多少个
SELECT COUNT(*) FROM studentWHERE math 90
-- 统计总分大于250的人数有多少
SELECT COUNT(*) FROM studentWHERE (math english chinese) 250
-- count(*) 和 count(列) 的区别
-- 解释 :count(*) 返回满足条件的记录的行数
-- count(列): 统计满足条件的某列有多少个但是会排除 为null的情况
CREATE TABLE t15 (name VARCHAR(20));
INSERT INTO t15 VALUES(tom);
INSERT INTO t15 VALUES(jack);
INSERT INTO t15 VALUES(mary);
INSERT INTO t15 VALUES(NULL);
SELECT * FROM t15;SELECT COUNT(*) FROM t15; -- 4
SELECT COUNT(name) FROM t15;-- 3 合计函数-sum Sum函数返回满足where条件的行的和一般使用在数值列(否则会报错) Select sum (列名) {,sum (列名).. from tablename [WHERE where_definition] -- 演示sum函数的使用
-- 统计一个班级数学总成绩
SELECT SUM(math) FROM student;
-- 统计一个班级语文、英语、数学各科的总成绩
SELECT SUM(math) AS math_total_score,SUM(english),SUM(chinese) FROM student;
-- 统计一个班级语文、英语、数学的成绩总和
SELECT SUM(math english chinese) FROM student;
-- 统计一个班级语文成绩平均分
SELECT SUM(chinese)/ COUNT(*) FROM student;
SELECT SUM(name) FROM student;
合计函数-avg Select avg(列名) {, avg(列名...} from tablename [WHERE where defini tion] -- 演示avg的使用
-- 练习
-- 求一个班级数学平均分
SELECT AVG(math) FROM student;
-- 求一个班级总分平均分
SELECT AVG(math english chinese) FROM student;合计函数-max/min Max/min函数返回满足where条件的一列的最大/最小值 Select max (列名) from tablename [WHERE where defini tion] -- 演示max 和 min的使用
-- 求班级最高分和最低分数值范围在统计中特别有用
SELECT MAX(math english chinese), MIN(math english chinese) FROM student;-- 求出班级数学最高分和最低分
SELECT MAX(math) AS math_high_socre, MIN(math) AS math_low_socreFROM student;
分组查询-GROUP BY
CREATE TABLE dept( /*部门表*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
dname VARCHAR(20) NOT NULL DEFAULT ,
loc VARCHAR(13) NOT NULL DEFAULT
);INSERT INTO dept VALUES(10, ACCOUNTING, NEW YORK),
(20, RESEARCH, DALLAS),
(30, SALES, CHICAGO),
(40, OPERATIONS, BOSTON);SELECT * FROM dept;-- 员工表CREATE TABLE emp
(empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*编号*/
ename VARCHAR(20) NOT NULL DEFAULT , /*名字*/
job VARCHAR(9) NOT NULL DEFAULT ,/*工作*/
mgr MEDIUMINT UNSIGNED ,/*上级编号*/
hiredate DATE NOT NULL,/*入职时间*/
sal DECIMAL(7,2) NOT NULL,/*薪水*/
comm DECIMAL(7,2) ,/*红利 奖金*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/
);-- 添加测试数据INSERT INTO emp VALUES(7369, SMITH, CLERK, 7902, 1990-12-17, 800.00,NULL , 20),
(7499, ALLEN, SALESMAN, 7698, 1991-2-20, 1600.00, 300.00, 30),
(7521, WARD, SALESMAN, 7698, 1991-2-22, 1250.00, 500.00, 30),
(7566, JONES, MANAGER, 7839, 1991-4-2, 2975.00,NULL,20),
(7654, MARTIN, SALESMAN, 7698, 1991-9-28,1250.00,1400.00,30),
(7698, BLAKE,MANAGER, 7839,1991-5-1, 2850.00,NULL,30),
(7782, CLARK,MANAGER, 7839, 1991-6-9,2450.00,NULL,10),
(7788, SCOTT,ANALYST,7566, 1997-4-19,3000.00,NULL,20),
(7839, KING,PRESIDENT,NULL,1991-11-17,5000.00,NULL,10),
(7844, TURNER, SALESMAN,7698, 1991-9-8, 1500.00, NULL,30),
(7900, JAMES,CLERK,7698, 1991-12-3,950.00,NULL,30),
(7902, FORD, ANALYST,7566,1991-12-3,3000.00, NULL,20),
(7934,MILLER,CLERK,7782,1992-1-23, 1300.00, NULL,10);SELECT * FROM emp;-- 工资级别
#工资级别表
CREATE TABLE salgrade
(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*工资级别*/
losal DECIMAL(17,2) NOT NULL, /* 该级别的最低工资 */
hisal DECIMAL(17,2) NOT NULL /* 该级别的最高工资*/
);INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);SELECT * FROM salgrade;
SELECT * FROM dept;
SELECT * FROM emp;# 演示group by having
GROUP by用于对查询的结果分组统计, (示意图)
-- having子句用于限制分组显示结果.
-- ?如何显示每个部门的平均工资和最高工资
-- 老韩分析: avg(sal) max(sal)
-- 按照部分来分组查询
SELECT AVG(sal), MAX(sal) , deptno FROM emp GROUP BY deptno;
-- 使用数学方法对小数点进行处理
SELECT FORMAT(AVG(sal),2), MAX(sal) , deptno FROM emp GROUP BY deptno; -- ?显示每个部门的每种岗位的平均工资和最低工资
-- 老师分析 1. 显示每个部门的平均工资和最低工资
-- 2. 显示每个部门的每种岗位的平均工资和最低工资
SELECT AVG(sal), MIN(sal) , deptno, job FROM emp GROUP BY deptno, job; -- ?显示平均工资低于2000的部门号和它的平均工资 // 别名-- 老师分析 [写sql语句的思路是化繁为简,各个击破]
-- 1. 显示各个部门的平均工资和部门号
-- 2. 在1的结果基础上进行过滤保留 AVG(sal) 2000
-- 3. 使用别名进行过滤 SELECT AVG(sal), deptno FROM emp GROUP BY deptnoHAVING AVG(sal) 2000;
-- 使用别名
SELECT AVG(sal) AS avg_sal, deptno FROM emp GROUP BY deptnoHAVING avg_sal 2000;
2.字符串相关函数 -- 演示字符串相关函数的使用 使用emp表来演示
-- CHARSET(str) 返回字串字符集
SELECT CHARSET(ename) FROM emp;
-- CONCAT (string2 [,... ]) 连接字串, 将多个列拼接成一列
SELECT CONCAT(ename, 工作是 , job) FROM emp;-- INSTR (string ,substring ) 返回substring在string中出现的位置,没有返回0
-- dual 亚元表, 系统表 可以作为测试表使用
SELECT INSTR(hanshunping, ping) FROM DUAL; -- UCASE (string2 ) 转换成大写
SELECT UCASE(ename) FROM emp;-- LCASE (string2 ) 转换成小写SELECT LCASE(ename) FROM emp;
-- LEFT (string2 ,length ) 从string2中的左边起取length个字符
-- RIGHT (string2 ,length ) 从string2中的右边起取length个字符
SELECT LEFT(ename, 2) FROM emp;-- LENGTH (string ) string长度[按照字节]
SELECT LENGTH(ename) FROM emp;
-- REPLACE (str ,search_str ,replace_str )
-- 在str中用replace_str替换search_str
-- 如果是manager 就替换成 经理
SELECT ename, REPLACE(job,MANAGER, 经理) FROM emp;-- STRCMP (string1 ,string2 ) 逐字符比较两字串大小
SELECT STRCMP(hsp, hsp) FROM DUAL;
-- SUBSTRING (str , position [,length ])
-- 从str的position开始【从1开始计算】,取length个字符
-- 从ename 列的第一个位置开始取出2个字符
SELECT SUBSTRING(ename, 1, 2) FROM emp;-- LTRIM (string2 ) RTRIM (string2 ) TRIM(string)
-- 去除前端空格或后端空格
SELECT LTRIM( 韩顺平教育) FROM DUAL;
SELECT RTRIM(韩顺平教育 ) FROM DUAL;
SELECT TRIM( 韩顺平教育 ) FROM DUAL;-- 练习: 以首字母小写的方式显示所有员工emp表的姓名
-- 方法1
-- 思路先取出ename 的第一个字符转成小写的
-- 把他和后面的字符串进行拼接输出即可SELECT CONCAT(LCASE(SUBSTRING(ename,1,1)), SUBSTRING(ename,2)) AS new_nameFROM emp; SELECT CONCAT(LCASE(LEFT(ename,1)), SUBSTRING(ename,2)) AS new_nameFROM emp;
3.数学相关函数 -- 演示数学相关函数-- ABS(num) 绝对值
SELECT ABS(-10) FROM DUAL;
-- BIN (decimal_number )十进制转二进制
SELECT BIN(10) FROM DUAL;
-- CEILING (number2 ) 向上取整, 得到比num2 大的最小整数
SELECT CEILING(-1.1) FROM DUAL;-- CONV(number2,from_base,to_base) 进制转换
-- 下面的含义是 8 是十进制的8, 转成 2进制输出
SELECT CONV(8, 10, 2) FROM DUAL;
-- 下面的含义是 8 是16进制的8, 转成 2进制输出
SELECT CONV(16, 16, 10) FROM DUAL;-- FLOOR (number2 ) 向下取整,得到比 num2 小的最大整数
SELECT FLOOR(-1.1) FROM DUAL;-- FORMAT (number,decimal_places ) 保留小数位数(四舍五入)
SELECT FORMAT(78.125458,2) FROM DUAL;-- HEX (DecimalNumber ) 转十六进制-- LEAST (number , number2 [,..]) 求最小值
SELECT LEAST(0,1, -10, 4) FROM DUAL;
-- MOD (numerator ,denominator ) 求余
SELECT MOD(10, 3) FROM DUAL;-- RAND([seed]) RAND([seed]) 返回随机数 其范围为 0 ≤ v ≤ 1.0
-- 老韩说明
-- 1. 如果使用 rand() 每次返回不同的随机数 在 0 ≤ v ≤ 1.0
-- 2. 如果使用 rand(seed) 返回随机数, 范围 0 ≤ v ≤ 1.0, 如果seed不变
-- 该随机数也不变了
SELECT RAND() FROM DUAL;SELECT CURRENT_TIMESTAMP() FROM DUAL;
4.时间相关函数 -- 日期时间相关函数-- CURRENT_DATE ( ) 当前日期
SELECT CURRENT_DATE() FROM DUAL;
-- CURRENT_TIME ( ) 当前时间
SELECT CURRENT_TIME() FROM DUAL;
-- CURRENT_TIMESTAMP ( ) 当前时间戳
SELECT CURRENT_TIMESTAMP() FROM DUAL;-- 创建测试表 信息表
CREATE TABLE mes(id INT , content VARCHAR(30), send_time DATETIME);-- 添加一条记录
INSERT INTO mes VALUES(1, 北京新闻, CURRENT_TIMESTAMP());
INSERT INTO mes VALUES(2, 上海新闻, NOW());
INSERT INTO mes VALUES(3, 广州新闻, NOW());SELECT * FROM mes;
SELECT NOW() FROM DUAL;-- 上应用实例
-- 显示所有新闻信息发布日期只显示 日期不用显示时间.
SELECT id, content, DATE(send_time) FROM mes;
-- 请查询在10分钟内发布的新闻, 思路一定要梳理一下.
SELECT * FROM mesWHERE DATE_ADD(send_time, INTERVAL 10 MINUTE) NOW()SELECT * FROM mesWHERE send_time DATE_SUB(NOW(), INTERVAL 10 MINUTE) -- 请在mysql 的sql语句中求出 2011-11-11 和 1990-1-1 相差多少天
SELECT DATEDIFF(2011-11-11, 1990-01-01) FROM DUAL;
-- 请用mysql 的sql语句求出你活了多少天? [练习] 1986-11-11 出生
SELECT DATEDIFF(NOW(), 1986-11-11) FROM DUAL;
-- 如果你能活80岁求出你还能活多少天.[练习] 1986-11-11 出生
-- 先求出活80岁 时, 是什么日期 X
-- 然后在使用 datediff(x, now()); 1986-11-11-datetime
-- INTERVAL 80 YEAR YEAR 可以是 年月日时分秒
-- 1986-11-11 可以date,datetime timestamp
SELECT DATEDIFF(DATE_ADD(1986-11-11, INTERVAL 80 YEAR), NOW()) FROM DUAL;SELECT TIMEDIFF(10:11:11, 06:10:10) FROM DUAL;-- YEAR|Month|DAY| DATE (datetime )
SELECT YEAR(NOW()) FROM DUAL;
SELECT MONTH(NOW()) FROM DUAL;
SELECT DAY(NOW()) FROM DUAL;
SELECT MONTH(2013-11-10) FROM DUAL;
-- unix_timestamp() : 返回的是1970-1-1 到现在的秒数
SELECT UNIX_TIMESTAMP() FROM DUAL;
-- FROM_UNIXTIME() : 可以把一个unix_timestamp 秒数[时间戳]转成指定格式的日期
-- %Y-%m-%d 格式是规定好的表示年月日
-- 意义在开发中可以存放一个整数然后表示时间通过FROM_UNIXTIME转换
--
SELECT FROM_UNIXTIME(1618483484, %Y-%m-%d) FROM DUAL;
SELECT FROM_UNIXTIME(1618483100, %Y-%m-%d %H:%i:%s) FROM DUAL;SELECT * FROM mysql.user \G 5.加密和系统函数 -- 演示加密函数和系统函数-- USER() 查询用户
-- 可以查看登录到mysql的有哪些用户以及登录的IP
SELECT USER() FROM DUAL; -- 用户IP地址
-- DATABASE() 查询当前使用数据库名称
SELECT DATABASE();-- MD5(str) 为字符串算出一个 MD5 32的字符串常用(用户密码)加密
-- root 密码是 hsp - 加密md5 - 在数据库中存放的是加密后的密码
SELECT MD5(hsp) FROM DUAL;
SELECT LENGTH(MD5(hsp)) FROM DUAL;-- 演示用户表存放密码时是md5
CREATE TABLE hsp_user(id INT , name VARCHAR(32) NOT NULL DEFAULT , pwd CHAR(32) NOT NULL DEFAULT );
INSERT INTO hsp_user VALUES(100, 韩顺平, MD5(hsp));
SELECT * FROM hsp_user; -- csdnSELECT * FROM hsp_user -- SQL注入问题WHERE name韩顺平 AND pwd MD5(hsp) -- PASSWORD(str) -- 加密函数, MySQL数据库的用户密码就是 PASSWORD函数加密SELECT PASSWORD(hsp) FROM DUAL; -- 数据库的 *81220D972A52D4C51BB1C37518A2613706220DAC-- select * from mysql.user \G 从原文密码str 计算并返回密码字符串
-- 通常用于对mysql数据库的用户密码加密
-- mysql.user 表示 数据库.表
SELECT * FROM mysql.user
6.流程控制函数 # 演示流程控制语句# IF(expr1,expr2,expr3) 如果expr1为True ,则返回 expr2 否则返回 expr3
SELECT IF(TRUE, 北京, 上海) FROM DUAL;
# IFNULL(expr1,expr2) 如果expr1不为空NULL,则返回expr1,否则返回expr2
SELECT IFNULL( NULL, 韩顺平教育) FROM DUAL;
# SELECT CASE WHEN expr1 THEN expr2 WHEN expr3 THEN expr4 ELSE expr5 END; [类似多重分支.]
# 如果expr1 为TRUE,则返回expr2,如果expr2 为t, 返回 expr4, 否则返回 expr5SELECT CASE WHEN TRUE THEN jack -- jackWHEN FALSE THEN tom ELSE mary END-- 1. 查询emp 表, 如果 comm 是null , 则显示0.0
-- 老师说明判断是否为null 要使用 is null, 判断不为空 使用 is not
SELECT ename, IF(comm IS NULL , 0.0, comm)FROM emp;
SELECT ename, IFNULL(comm, 0.0)FROM emp;
-- 2. 如果emp 表的 job 是 CLERK 则显示 职员 如果是 MANAGER 则显示经理
-- 如果是 SALESMAN 则显示 销售人员其它正常显示SELECT ename, (SELECT CASE WHEN job CLERK THEN 职员 WHEN job MANAGER THEN 经理WHEN job SALESMAN THEN 销售人员 ELSE job END) AS jobFROM emp; SELECT * FROM emp;
SELECT * FROM dept;
SELECT * FROM salgrade;