Mysql-sql基础语法

基础概念

  1. 并不直接访问数据库;你使用的是DBMS,它替你访问数据库
  2. 模式(schema)与表( table) 的区别?
  • 表(table):某种特定类型数据的结构化清单,一种结构化的文件,可用来存储某种特定类型的数据
  • 模式(schema):关于数据库和表的布局及特性的信息。表具有一些特性,这些特性定义了数据在表中如何存储,
    如可以存储什么样的数据,数据如何分解,各部分信息如何命名,等等。描述表的这组信息就是所谓的模式,
    模式可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)
  1. 主键
  • 主键通常定义在表的一列上,但这并不是必需的,也可以一起使用多个列作为主键。在使用多列作为主键时,
    上述条件必须应用到构成主键的所有列,所有列值的组合必须是唯一的(但单个列的值可以不唯一)。
  1. 客户端和服务端
  • 如果你请求一个按字母顺序列出的产品表,则客户机软件通过网络提交该请求给服务器软件。服务器软件处理这个请求,
    根据需要过滤、丢弃和排序数据;然后把结果送回到你的客户机软件。
  • 服务器软件为MySQL DBMS
  • 客户机可以是MySQL提供的工具、脚本语言(如Perl)、 Web应用开发语言(如ASP、 ColdFusion、 JSP和PHP)、程序设计语言(如
    C、 C++、 Java)等
  1. Mysql客户端命令行
  • 命令用;或\g结束,换句话说,仅按Enter不执行命令;
  • 输入help select获得使用SELECT语句的帮助
  • 输入quit或exit退出命令行实用程序。

chapter3-使用数据库

  1. use databasename;

在你最初连接到MySQL时,没有任何数据库打开供你使用。在你能
执行任意数据库操作前,需要选择一个数据库

  1. show databases;

返回可用数据库的一个列表。

  1. show tables;

获得一个数据库内的表的列表

  1. show columns from tablename;

它对每个字段返回一行,行中包含字段名、数据类型、是否允许NULL、键信息、默认值以及其他信息
等同于DESCRIBE tablename;

  1. show create database databasename;/show create table tablename;

分别用来显示创建特定数据库或表的MySQL语句;

  1. show grants;

显示授予用户(所有用户或特定用户)的安全权限;

chapter4-检索数据

使用SELECT检索表数据,必须至少给出两条信息——想选择什么,以及从什么地方选择。

  1. select name from user;
  2. SQL语句不区分大小写,所有SQL关键字使用大写,而对所有
    列和表名使用小写,这样做使代码更易于阅读和调试
  3. select name, age from user;
  4. select * from user;

检索所有列,但是不推荐使用,通常会降低检索和应用程序的性能

  1. select distinct name from user;

对检索的数据进行去重。使用DISTINCT关键字,它必须直接放在列名的前面。

  1. select distinct name, age from user;

DISTINCT关键字应用于所有列而不仅是前置它的列

  1. select age from user limit 5;

选择要检索的行数

  1. select age from user limit 5, 2;

limit 5, 2 第一个数为开始位置,第二个数为要检索的行数,行计数从0开始
等价于 limit 2 offset 5

chapter5-排序检索

检索出的数据并不是以纯粹的随机顺序显示的。如果不排序,数据一般将以它在底层表中出现的顺序显示。
这可以是数据最初添加到表中的顺序。但是,如果数据后来进行过更新或删除,则此顺
序将会受到MySQL重用回收存储空间的影响。因此,如果不明确控制的话,不能(也不应该)依赖该排序顺序

  1. select name, age, addr
    from user
    order by age, name;

先对age排序,然后在对name排序,然后选择name, age, addr

  1. select name, age, addr
    from user
    order by age desc, name;

先对age降序,然后在对name升序,然后选择name, age, addr
DESC关键字只应用到直接位于其前面的列名,
如果想在多个列上进行降序排序, 必须对每个列指定DESC关键字。
与DESC相反的关键字是ASC(ASCENDING)

  1. 区分大小写和排序顺序

在字典 ( dictionary)排序顺序中,A被视为与a相同,这是MySQL(和大多数数据库管理系统)的默认行为。

但是,许多数据库管理员能够在需要时改变这种行为(如果你的数据库包含大量外语字符,可能必须这样做)

  1. select name, age, addr
    from user
    order by age desc
    limit 1;

先对age降序,然后选择name, age, addr 的一行
在给出ORDER BY子句时,应该保证它位于FROM子句之后。如果使用LIMIT,它必须位于ORDER BY之后。
否则使用次序不对将发生错误

chapter6-过滤数据

使用SELECT语句的WHERE子句指定搜索条件

  1. select name, age, addr
    from user
    where age = 18;

  2. select name, age, addr
    from user
    where age = 18
    order by name desc;

在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后, 否则将会产生错误

  1. where语句支持的条件操作符
Mysql-sql基础语法_第1张图片
  1. select name, age, addr
    from user
    where name = ’zss‘;

不区分大小写,将会检索所有zss的大写变化形式。

  1. select name, age, addr
    from user
    where age between 5 and 10;

** between 应该和and配合,包含左右边界的值**

  1. select name, age, addr
    from user
    where name is null;

判断为null值,需要注意的null值,既不在匹配过滤时返回,也不再不匹配过滤时返回,即不通过 is null 条件为null的行始终得不到返回。

chapter7-过滤数据

  1. 组合WHERE子句以建立功能更强的更高级的搜索条件。

我们还将学习如何使用NOT和IN操作符。

  1. MySQL允许给出多个WHERE子句。这些子句可以两种方式使用:以AND子句的方式或OR子句的方式使用

  2. select name, age, addr
    from user
    where age=5 and name = 'zss';

and逻辑操作符在where中一般用来限定不同列的条件,同一列用between and

  1. 逻辑条件运算符的运算顺序

优先级:() > and > or, 同级从左到右,但是一般为了明确语义,用()来限定分组操作。

  1. select name, age, addr
    from user
    where age in (13,18);

in 操作符的运算效果为and或or的组合的效果,但是效率较高,当实现相同的功能是应该首先考虑 in。

  1. select name, age, addr
    from user
    where age not in (13,18);

not 用来否定where子句中它后跟条件

chapter8-用通配符进行过滤

where 子句中使用like关键字后跟搜索模式,就能够对字符类型的列进行内容里的匹配,当匹配成功时将返回指定的数据,在搜索模式中就需要使用通配符。注意通配符区分大小写

%表示任何字符出现任意次数
  1. select name, age, addr
    from user
    where name like 'z%';

检索name中以z字符开头的记录

  1. select name, age, addr
    from user
    where name like '%shuai%';

检索name中不管以什么字符开始也不管以什么字符结束但是中间包含字符shuai的记录

  1. select name, age, addr
    from user
    where name like 's%i';

检索name中不管中间是什么字符(可以没有任何字符),但是以s字符开始并以i字符结束的记录。

  1. 尾空格与null
  • 通配符对列为null的行没有任何效果;
  • 尾空格会影响通配符的匹配,匹配的模式包含对空格的判断。
_ 用途和%一样,但是一次只能匹配一个字符

注意:不应过多的使用通配符,这会极度的损耗性能

chapter9-用正则表达式进行搜索

需要注意的是sql支持的正则表达式只是完整正则表达式的很少的一部分。

  1. 使用方式
    select name, age, addr
    from user
    where name regexp 'zss';

  2. 与like的区别
    select name, age, addr
    from user
    where name like 'zss';
    select name, age, addr
    from user
    where name regexp 'zss';

10-创建计算字段

创建字段指的是不存在数据库表中,但是由多个不同列值组成或者相关计算生成并返回给客户端的字段。

  1. 字符串拼接Concat

select Concat(name, ' (', addr, ')' )
from user
order by age;

Concat(str1,str2,..)将所有参数字符串拼接

  1. Trim(), RTrim(), LTrim()去除空格

select RTrim(name)
from user
order by age;

RTrim(str)用于删除str右侧的所有空格,同样LTrim(str)删除str左边所有空格,Trim(str)删除左右两边所有空格

  1. 别名 select as

select Concat(name, ' (', addr, ')' ) as nameaddr
from user
order by age;

这样使用别名,客户端程序就能使用这部分数据啦

  1. 算术计算

select age*2 as doubleage
from user
order by age;

11-使用数据处理函数

  1. 文本处理函数
    select Upper(name) as uppername
    from user
    order by age;

常用文本处理函数


Mysql-sql基础语法_第2张图片

Mysql-sql基础语法_第3张图片
  1. 日期和时间处理函数

需要注意的是Mysql使用的日期格式,不管你什么时候指定一个日期,不管是插入还是更新或者where子句过滤,日期格式必须为 yyyy-mm-dd

比如

select name
from user
where birthday = '2015-01-05';

但是有些列的数据类型可能是date类型,也可能是datetime类型,在这两种类型进行比较之前需要进行转换
比如

select name
from user

where Date(jointime) = '2015-01-05';

常用日期处理函数

Mysql-sql基础语法_第4张图片
  1. between and 日期边界问题

select name
from user
where Date(jointime) between '2015-01-05' and '2015-01-07';

如果jointime的数据类型是datetime类型,那么查找出的结果将是从2015-01-05 00:00:00 ~ 2015-01-06 23:59:59

  1. 数值处理函数


    Mysql-sql基础语法_第5张图片

12-汇总数据

即在所有行进行的函数,用于统计和汇总

  1. 聚合函数


    Mysql-sql基础语法_第6张图片

    比如

select avg(age) as avage
from user
where Date(jointime) between '2015-01-05' and '2015-01-07';

如果没有where子句将在所有行上进行平均操作

count(*)用于统计满足条件的行数,不管行中某列是否为null还是非null
count(age)用于对满足条件的所有行的age列的进行累加求值,忽略null值
max(age)返回age列的最大值,忽略null值
sum(age*2)用于复合运算求和,忽略null值

  1. 聚合不同的值

select avg(distinct age) as avage
from user
where Date(jointime) between '2015-01-05' and '2015-01-07';

distinct 必须后跟列名

  1. 组合聚集函数

select子句中包含多个聚集函数

select avg(distinct age) as avage,
count(*) as num_user,
max(age) as avage
from user
where Date(jointime) between '2015-01-05' and '2015-01-07';

13-分组数据

你可能感兴趣的:(Mysql-sql基础语法)