Mysql学习第三天

1、对表中数据的增删改(DML)
      create table t_user(
      id int primary key auto_increment,
      name varchar(20) not null,
      email varchar(20) unique
     )

为表添加记录 (必须掌握)

insert into 表名[(列名1,列名2...)] values (值1,值2...);
1.插入一条数据

1.1指定要插入那些列
       insert into t_user(name,email) values(‘tom‘,‘[email protected]‘);
****注意: 数据类型为字符串类型的.需要使用单引号包裹.
    1.2不指定插入哪些列, 需要指定每一列的值
        insert into t_user values(null,‘jerry‘,‘[email protected]‘);
        insert into t_user(name,email) values(‘汤姆‘,‘[email protected]‘);
=====================================================================================
SHOW VARIABLES LIKE ‘%character%‘; ==> 查看字符编码配置

| character_set_client | gbk 客户端的编码 ***
      |
      | character_set_results | gbk 结果集的编码 ***
      |
      | character_set_connection | utf8 客户端连接的编码
      |
      | character_set_database | utf8 数据库默认使用的编码
      |
      | character_set_filesystem | BINARY 文件系统存放时使用的编码

|
      | character_set_server | utf8 服务器编码 安装时指定的
      |
      | character_set_system | utf8 内部系统编码
  结论: 如果使用cmd 命令控制台操作 数据库,
  注意character_set_client 和 character_set_results 需要设置成GBK, 因为我们的命令控制航使用gbk码表显示中文.
  使用如下命令设置:
  方式:
      set character_set_client=gbk
      set character_set_results=gbk
 注意:
    每次重新连接数据库都要重新设置.
    如果使用的cmd窗口操作数据库. 就修改如下的码表为gbk(cmd窗口使用的是gbk码表).
    这种做法影响的范围只在你当前链接中.
2、修改一条记录 (必须掌握)

update 表名 set 列名1 = 值 , 列名2 = 值 ....[where 条件1,条件2...]
     create table t_user(
     id int primary key auto_increment,
     name varchar(20) not null,
     email varchar(20) unique
     )
2.1、修改表中id为3 的记录, 将name修改为rose;

update t_user set name=‘rose‘ where id=3;
update t_user set name=‘rose‘;
//-----------------------------------------------------------------------------------------------------
      CREATE TABLE employee (
      id INT,
      NAME VARCHAR(20),
      gender VARCHAR(20),
      birthday DATE,
      entry_date DATE,
      job VARCHAR(30),
      salary DOUBLE,
      RESUME LONGTEXT
      );
      INSERT INTO employee VALUES(1,‘zs‘,‘male‘,‘1980-12-12‘,‘2000-12-12‘,‘coder‘,4000,NULL);
      INSERT INTO employee VALUES(2,‘ls‘,‘male‘,‘1983-10-01‘,‘2010-12-12‘,‘master‘,7000,NULL);
      INSERT INTO employee VALUES(3,‘ww‘,‘female‘,‘1985-03-08‘,‘2008-08-08‘,‘teacher‘,2000,NULL);
      INSERT INTO employee VALUES(4,‘wu‘,‘male‘,‘1986-05-13‘,‘2012-12-22‘,‘hr‘,3000,NULL);
-- 要求
-- 将所有员工薪水修改为5000元。
-- 将姓名为’zs’的员工薪水修改为3000元。
-- 将姓名为’ls’的员工薪水修改为4000元,job改为ccc。

-- 将wu的薪水在原有基础上增加1000元。
3、删除记录语句 (必须掌握)
DELETE FROM 表名 [WHERE 条件];
3.1、 删除表中名称为’rose’的记录。
DELETE FROM employee WHERE NAME=‘rose‘;
3.2、 删除表中所有记录。
DELETE FROM employee ;
3.3、使用truncate删除表中记录。
TRUNCATE TABLE employee;
DELETE 删除 和 TRUNCATE删除(了解) 两者有什么区别?
首先,这两种都是删除表中的记录.

不同的是:
1、 delete 是逐行标记删除. TRUNCATE 是将整张表包括表结构都移除,然后将表重新创建.
2、 delete DML语句。 TRUNCATE DDL语句。
3、delete 删除的记录可以被恢复,TRUNCATE 不能回复。
4.、delete 不释放空间,TRUNCATE 释放空间.
5、 TRUNCATE 会提交事务. (还没学)

//-------------------------以上就是 增加 修改 删除 表记录 相关语句 ,(DML)-----------------------------------------------------------
DQL语句(DML) 查询语句. (必须掌握)

语法:
      SELECT selection_list /*要查询的列名称*/
      FROM table_list /*要查询的表名称*/
      WHERE condition /*行条件*/
      GROUP BY grouping_columns /*对结果分组*/
      HAVING condition /*分组后的行条件*/
      ORDER BY sorting_columns /*对结果排序*/
       LIMIT offset_start, row_count /*结果限定*/
//---------------------------------------------------------------------------------------
      CREATE TABLE stu ( --学生表
      sid CHAR(6), -- 学生编号
      sname VARCHAR(50), -- 学生姓名
      age INT, -- 年龄
     gender VARCHAR(50) -- 性别
      );
      INSERT INTO stu VALUES(‘S_1001‘, ‘liuYi‘, 35, ‘male‘);
      INSERT INTO stu VALUES(‘S_1002‘, ‘chenEr‘, 15, ‘female‘);
      INSERT INTO stu VALUES(‘S_1003‘, ‘zhangSan‘, 95, ‘male‘);
      INSERT INTO stu VALUES(‘S_1004‘, ‘liSi‘, 65, ‘female‘);
      INSERT INTO stu VALUES(‘S_1005‘, ‘wangWu‘, 55, ‘male‘);
      INSERT INTO stu VALUES(‘S_1006‘, ‘zhaoLiu‘, 75, ‘female‘);
      INSERT INTO stu VALUES(‘S_1007‘, ‘sunQi‘, 25, ‘male‘);
      INSERT INTO stu VALUES(‘S_1008‘, ‘zhouBa‘, 45, ‘female‘);
      INSERT INTO stu VALUES(‘S_1009‘, ‘wuJiu‘, 85, ‘male‘);
      INSERT INTO stu VALUES(‘S_1010‘, ‘zhengShi‘, 5, ‘female‘);
      INSERT INTO stu VALUES(‘S_1011‘, ‘xxx‘, NULL, NULL);
//---------------------------------------------------------------
      CREATE TABLE emp( -- 员工表
      empno INT, -- 员工编号
      ename VARCHAR(50), -- 员工姓名
      job VARCHAR(50), -- 工作
      mgr INT, -- 员工上司的编号
      hiredate DATE, -- 入职日期
      sal DECIMAL(7,2), -- 工资
      comm DECIMAL(7,2), -- 奖金
      deptno INT -- 部门编号
);
      INSERT INTO emp VALUES(7369,‘SMITH‘,‘CLERK‘,7902,‘1980-12-17‘,800,NULL,20);
      INSERT INTO emp VALUES(7499,‘ALLEN‘,‘SALESMAN‘,7698,‘1981-02-20‘,1600,300,30);
      INSERT INTO emp VALUES(7521,‘WARD‘,‘SALESMAN‘,7698,‘1981-02-22‘,1250,500,30);
      INSERT INTO emp VALUES(7566,‘JONES‘,‘MANAGER‘,7839,‘1981-04-02‘,2975,NULL,20);
      INSERT INTO emp VALUES(7654,‘MARTIN‘,‘SALESMAN‘,7698,‘1981-09-28‘,1250,1400,30);
      INSERT INTO emp VALUES(7698,‘BLAKE‘,‘MANAGER‘,7839,‘1981-05-01‘,2850,NULL,30);
      INSERT INTO emp VALUES(7782,‘CLARK‘,‘MANAGER‘,7839,‘1981-06-09‘,2450,NULL,10);
      INSERT INTO emp VALUES(7788,‘SCOTT‘,‘ANALYST‘,7566,‘1987-04-19‘,3000,NULL,20);
      INSERT INTO emp VALUES(7839,‘KING‘,‘PRESIDENT‘,NULL,‘1981-11-17‘,5000,NULL,10);
      INSERT INTO emp VALUES(7844,‘TURNER‘,‘SALESMAN‘,7698,‘1981-09-08‘,1500,0,30);
      INSERT INTO emp VALUES(7876,‘ADAMS‘,‘CLERK‘,7788,‘1987-05-23‘,1100,NULL,20);
      INSERT INTO emp VALUES(7900,‘JAMES‘,‘CLERK‘,7698,‘1981-12-03‘,950,NULL,30);
      INSERT INTO emp VALUES(7902,‘FORD‘,‘ANALYST‘,7566,‘1981-12-03‘,3000,NULL,20);
      INSERT INTO emp VALUES(7934,‘MILLER‘,‘CLERK‘,7782,‘1982-01-23‘,1300,NULL,10);
1.1 查询所有行所有列
select * from stu;
*号 是通配符.通配所有列. 上面语句与下面是一模一样的
select sid,sname,age,gender from stu;
谁的效率更高?
下面的效率更高. *需要运算.
1.2 查询所有行指定列
select sname from stu;
2.1 条件查询介绍
条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:
? =、!=、<>、<、<=、>、>=;
? BETWEEN…AND;
? IN(SET);
? IS NULL;
//---条件连接符
? AND; &&
? OR; ||
? NOT; !
2.2 查询性别为女,并且年龄小于50的记录
select * from stu where gender=‘female‘ and age<50;
2.3 查询学号为S_1001,或者姓名为liSi的记录
select * from stu where sid=‘S_1001‘ or sname=‘liSi‘;
数据库中,sql语句不区分大小写 ,但是 数据区分大小写.
2.4 查询学号为S_1001,S_1002,S_1003的记录
select * from stu where sid=‘S_1001‘ or sid=‘S_1002‘ or sid=‘S_1003‘;
select * from stu where sid in(‘S_1001‘,‘S_1002‘,‘S_1003‘);
2.5 查询学号不是S_1001,S_1002,S_1003的记录
select * from stu where not (sid=‘S_1001‘ or sid=‘S_1002‘ or sid=‘S_1003‘);
select * from stu where sid not in(‘S_1001‘,‘S_1002‘,‘S_1003‘);
2.6 查询年龄为null的记录
select * from stu where age=null;
null的特性: null不等于null 所以判断时应如下写法:
select * from stu where age is null;
2.7 查询年龄在20到40之间的学生记录
select * from stu where age >= 20 and age <= 40;
select * from stu where age between 20 and 40;
2.8查询性别非男的学生记录
select * from stu where gender!= ‘male‘;
select * from stu where not gender=‘male‘;
select * from stu where gender not in (‘male‘);
2.9 查询姓名不为null的学生记录
select * from stu where sname is not null;
select * from stu where not sname is null;
//--------------------------------------------------------------------------------------------------
where 字段 like ‘表达式‘;
% => 通配 通配任意个字符.
_ => 通配 通配单个字符.
说明: LIKE 条件后 根模糊查询表达式, "_"==> 代表一个任意字符
3.1查询姓名由5个字母构成的学生记录
select * from stu where sname like ‘_____‘;
3.2查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
select * from stu where sname like ‘____i‘;
3.3 查询姓名以“z”开头的学生记录
说明: "%"该通配符匹配任意长度的字符.
select * from stu where sname like ‘z%‘;
3.4查询姓名中第2个字母为“i”的学生记录
select * from stu where sname like ‘_i%‘;
3.5 查询姓名中包含“a”字母的学生记录
select * from stu where sname like ‘%a%‘;
//-----------------------------------------------------------------
4.1 去除重复记录
关键词: distinct => 去除重复查询结果记录.
select gender from stu; ==> 出现大量重复的记录
select distinct gender from stu; =>去除重复的记录
4.2查看雇员的月薪与佣金之和
select sal*12+comm from emp;
null与任何数字计算结果都是null.上面的写法是错误的.
使用IFNULL(参数1,参数2) 函数解决. 判断参数1的值是否为null,如果为null返回参数2的值.
select sal*12 + IFNULL(comm,0) from emp;
*这个函数在所有数据库通用吗?
不通用.
4.3 给列名添加别名
select sal*12 + IFNULL(comm,0) as ‘年收入‘ from emp;
** select sal*12 + IFNULL(comm,0) ‘年收入‘ from emp;
select sal*12 + IFNULL(comm,0) 年收入 from emp;
//------------------------------------------------------------------------------------------------------------------------------
5.1 查询所有学生记录,按年龄升序排序
asc: 升序
desc:降序
select * from stu order by age asc;
默认就是升序
select * from stu order by age;
5.2 查询所有学生记录,按年龄降序排序
select * from stu order by age desc;
5.3 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
select * from emp order by sal desc , empno asc;
聚合函数
聚合函数是用来做纵向运算的函数:
? COUNT():统计指定列不为NULL的记录行数;
? MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
? MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
? SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
? AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
6.1 COUNT
当需要纵向统计时可以使用COUNT()。
? 1>查询emp表中记录数:
select count(*) from emp;
2>查询emp表中有佣金的人数:
select count(*) from emp where comm is not null and comm >0;
3>查询emp表中月薪大于2500的人数:
select count(*) from emp where sal > 2500;
4>统计月薪与佣金之和大于2500元的人数:
select count(*) from emp where sal+IFNULL(comm,0) > 2500;
5>查询有佣金的人数并且有领导的人数:
select count(*) from emp where comm > 0 and mgr is not null;
6.2 SUM(计算总和)和AVG(计算平均值)
当需要纵向求和时使用sum()函数。
1>查询所有雇员月薪和:
select sum(sal) from emp;
2>查询所有雇员月薪和,以及所有雇员佣金和:
select sum(sal),sum(comm) from emp;
3>查询所有雇员月薪+佣金和:
select sum(sal+IFNULL(comm,0)) from emp;
4>统计所有员工平均工资:
select avg(sal) from emp;
6.3 MAX和MIN
? 查询最高工资和最低工资:
select max(sal),min(sal) from emp;
//---------------------------------------------------------------------------------------------------------------------------------------
分组查询
当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要使用部分来分组。
? 1>查询每个部门的部门编号和每个部门的工资和:
select deptno,sum(sal) from emp group by deptno;
2>查询每个部门的部门编号以及每个部门的人数:
select deptno,count(ename) from emp group by deptno;
3>查询每个部门的部门编号以及每个部门工资大于1500的人数:
select deptno,count(ename) from emp where sal>1500 group by deptno ;
HAVING子句
4>查询工资总和大于9000的部门编号以及工资和:
select deptno,sum(sal) from emp group by deptno having sum(sal)>9000;
使用having在分组之后加条件.
where和having都可以加条件?
1.where在分组之前加条件.
2.having在分组之后加条件.
where的效率要远远高于having. 分组本身消耗资源非常大.
//----------------------------------------------以下是分页相关知识---------------------------------------------------------------------------------------
LIMIT(MySQL方言) (必须掌握)
LIMIT用来限定查询结果的起始行,以及总行数。
1>查询5行记录,起始行从0开始
select * from emp limit 0,5;
2> 查询10行记录,起始行从3开始
select * from emp limit 3,10;
3>如果一页记录为5条,希望查看第3页记录应该怎么查呢?
? 第一页记录起始行为0,一共查询5行;
select * from emp limit 0,5;
? 第二页记录起始行为5,一共查询5行;
select * from emp limit 5,5;
? 第三页记录起始行为10,一共查询5行;
select * from emp limit 10,5;

原文地址:https://www.cnblogs.com/java0619/p/8375892.html

时间: 2024-11-08 07:41:33

Mysql学习第三天的相关文章

基于CentOS的MySQL学习补充三--使用Shell批量创建数据库表

本文出处:http://blog.csdn.net/u012377333/article/details/47006087 接上篇介绍<基于CentOS的Mysql学习补充二--使用Shell创建数据库>,本文继续探索关于Shell和MySQL的结合使用,我不知道当一个数据库设计完成之后如何快速的创建设计好的数据库表和添加相应基本数据,我目前知道的就是使用Shell和SQL脚本来达到我的目的--快速的.多次的.可重复利用的创建数据库表. 创建一个数据库表的SQL脚本: /***********

转MYSQL学习(三) 函数

这一节主要介绍MYSQL里的函数,MYSQL里的函数很多,我这里主要介绍MYSQL里有而SQLSERVER没有的函数 数学函数 1.求余函数MOD(X,Y) MOD(X,Y)返回x被y除后的余数,MOD()对于带有小数部分的数值也起作用,他返回除法运算后的精确余数 SELECT MOD(31,8) 2.四舍五入函数TRUNCATE(X,Y) TRUNCATE(X,Y)返回被舍去至小数点后y位的数字x.若y的值为0,则结果不带有小数点或不带有小数部分. 若y设为负数,则截去(归零)x小数点左边起第

Mysql++学习(三)------举个栗子

下面例子显示了如何建立利用Sql++建立一个连接,执行查询操作,返回一个结果集,并且打印. 1 #include <iostream> 2 #include <mysql++.h> 3 #include <errno.h> 4 #include <stdlib.h> 5 #include <stdio.h> 6 7 using namespace std; 8 9 int main() 10 { 11 mysqlpp::Connection co

MySQL学习日志(三)

#用户管理 查询优化 日志  ##MySQL 用户管理  用户账号: [email protected] 用户账号管理: CREATE USER   创建用户         CREATE USER [email protected]    [        IDENTIFIED BY [PASSWORD] 'password'           ]        主机也可以使用通配符: create user [email protected]'172.16.100.1_ _'  IDENT

MySQL学习笔记(三)&mdash;索引

一.概述 1.基本概念       在大型数据库中,一张表中要容纳几万.几十万,甚至几百万的的数据,而当这些表与其他表连接后,所得到的新的数据数目更是要大大超出原来的表.当用户检索这么大量的数据时,经常会感觉慢.这个时候要提高数据库的检索性能,就必须要用到索引.给表追加合适的索引能极大的改善数据检索的效率,提供数据库性能.      索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,而且每种存储引擎也不一定支持所有的索引类型.      所有存储引擎支持每个表至多16个索引,总索

mysql学习之-三种安装方式与版本介绍

MYSQL版本介绍 mysql分alpha,beta,rc,GA四个版本. alpha  暗示这是一个以展示新特性为目的的版本,存在比较多的不稳定因素,还会向代码中添加新新特性 beta 以后的beta版.发布版或产品发布中,所有API.外部可视结构和SQL命令列均不再更改,不再向代码中添加影响代码稳定性的新特性. rc 是指 Release Candidate. Release candidates被认为是稳定的, 通过了mysql所有的内部测试, 修正了所有已知的致命bug. 但是rc版本还

MySQL学习笔记(三):常用函数

一:字符串函数 需要注意的几个细节: 1.cancat中有一个字符串为null,则结果为null. 2.left(str,x) 和 right(str,x)中x为null,则不返回任何字符串,不是null. 二:数值函数 注意的几个细节: 1.truncate(x,y) 和 round(x,y) 都能截断,只是round会四舍五入,而truncate不会. 三:日期和时间函数 四:流程函数 五:其他函数

Mysql学习(三)之数据库管理工具Navicat

前言 mysql安装完后默认只有命令行工具,所以我们可以下载一些数据库管理工具Navicat Navicat使用 首先建立一个连接选择mysql,填写信息 发现多了一个localhost,双击,打开连接,右键可以取消连接 右键新建数据库,输入数据库名.字符集(utf-8).排序规则(utf8_general_ci/通用规则) 点击确定发现多了一个数据库,但是是灰色的,双击可以打开,需要的话右键可以关闭 右键新建表,填写字段信息(长度够用就好,太长会浪费空间降低性能,最长255),勾选不是null

MYSQL学习笔记三:日期和时间函数

1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ #CURDATE()与CURRENT_DATE()作用同样,返回同样的系统当前日期 #CURDATE()+0则将当前日期值转换成数值类型 SELECT CURDATE(), CURRENT_DATE(), CURDATE()+0; /* CURTIME()和CURRENT_TIME()作用同样.将当前时间以'HH:MM:SS'或者'HH