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语句支持的条件操作符
  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;

常用文本处理函数



  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';

常用日期处理函数

  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. 数值处理函数


12-汇总数据

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

  1. 聚合函数



    比如

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-分组数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容