C++ - mysql单词,知识点 函数等等到视图全部语法-语法大全

•	数据库概念:按照数据结构来组织,存储和管理的数据、建立在计算机存储设备上的仓库
•	商用数据库、轻量级数据库、缓存数据库-对于数据读写特别快 数据是放在内存当中的。
•	开源好处:主动,无需在因为依赖封闭的数据库产品而受到牵制。
•	启动mysql net start/stop MYSQL80.没有;号
•	控制台登入命令 MySQL-h -127.0.0.1 -uroot -p“密码”
•	表的每一行称为记录(RECORD),记录是一个逻辑意义上的数据。
•	表的每一列称为字段(COLUMN)同一个表的每一行记录都有相同的诺干字段。
•	字段的作用:定义了数据类型(整形、浮点型、字符串、日期等),以及是否允许为NULL
•	NULL表示字段数据不存在,一个整形字段如果为NULL博鳌是他的值为0,如果是字符串就表示是空串
•	表之间的关系:一对多 多对一 一对一:这样才能按照应用程序的逻辑来组织和存储数据:一对一是后面只有一个,多对一是多个对应一个,一对多是一个对应多个。
•	
•	
•	数据库的操作:
•	创建数据库 create database database_name;创建数据库是指在数据系统中划分一块空间,用来存储相应的数据
•	查看数据库:show databases; #显示当前已存在的数据库,
•	选择数据库:use database_name;在操作数据库对象之前,需要先选择一个数据库。
•	删除数据库 daop database database_name;在MySQL中删除数据库不会提示
•	数据库命名规范,26个英文字母不区分大小写、0-9的自然数加上下划线_组成,多个项目慎用一个数据库,列名命名规范
•	    字段必须描述信息、易理解、不超过三个单词并且不要和表出现同样的名称。 
•	
•	数据表的操作。
•	在mysql中,表是数据库的操作对象。
•	创建表 create table  表名(表定义选项、表选项、分区选项)
•	表定义项:列名(字段名),类型。
•	表名可以 数据库名.表名
•	列/字段的类型定义:类型就是字表定义选项里的第二个
•	整型类型
•	字节数
•	无符号的取值范围
•	有符号在无符号基础上除以2并且正数部分减一
•	Tinyint(3)
•	1
•	0-255
•	-128-127
•	Smallint(5)
•	2
•	0-65535
•	
•	Mediumint(8)
•	3
•	0-16777215 (MB)
•	
•	Int(11)
•	4
•	0-4294967295
•	
•	integer
•	4
•	0-4294967295(10G)
•	
•	Bigint(20)
•	8
•	10T 数据
•	
•	
•	整数类型的附带属性:
•	1.类型名称后面的小括号 :指定显示宽度(并不是该类型占用的字节数)。如果不显示
•	类型宽度默认为.zerofill 就是数字为不够时使用‘0’填充,带上zerofill则默认是无符号。
•	unsigned(无符号):加上负数,下限值是0.
•	auto_increment 产生唯一标识符或顺序值,只适用整数类型。值一般从1开始每一行增加一,一个表中只能有一个。如果要大于2的列想要自增长就需要定义为NOT NULL(不是空值),并定义为primary key或者 unique键;主键和副键,auto_increament primary,这样整个表都可以使用
•	
•	浮点类型和定点类型。
•	浮点类型和定点类型包括 单精度和双精度浮点数,定点就是declmal型
•	类型
•	字节数
•	复数取值范围
•	非负数取值范围
•	Float
•	4
•	-3.402823466E+38~
•	-1.175494351E~38
•	0和1.175494351E -38~3.402823466E+38
•	Double(10)
•	
•	8
•	-1.7(11位)+308~
•	-2.2(16位)E-308
•	0-2.(17位)
•	1.7(14位)
•	Decimal(M,D)
•	M +2
•	同double类型
•	同double类型
•	
•	Mysql浮点型和定点型名称后面都可以加(M,D),M表示该值从长度,D表示小数点后面的长度。M和D又称精度和标度,如(7,4)总长度是7小数点后面是4.MySQL保存值时四舍五入,decimal里的M时1到65,默认是10,D是小数点范围是0-30的并且D不能大于M可以不指定默认值是0.存储精度高的用decimal.
•	日期和时间类型。
•	类型
•	字节数
•	取值范围
•	零值
•	Year(年)
•	1
•	1901~2155
•	0000
•	Date(日期)
•	4
•	1000-01~9999-12-31
•	0000-00-00
•	Time(天)
•	3
•	-838:59:59——838:59:59
•	000:00:00
•	Dateime(日期+天)
•	8
•	1000-01 00:00:00
•	9999-12-23-23:59:59
•	0000-00-00 00:00:00
•	Timestamp(时间戳)
•	4
•	19700101080001-
•	2038011911407
•	
•	
•	每种日期玉时间类型都有一个有效范围,不能超出,插入时 日期年月日和时间时分秒可以用“:_ /”中任意字符表示。
•	常用时间函数 curdate()-获得当前的data
•	Now()获得当前datetime 可以直接插入datetime和timestamp类型中
•	Time()获取残数给定时间串中的时分,可time中
•	Year()获得年份可year中
•	Month(),day(),hour()minute()second() 月日 时 分 秒 。
•	字符串类型:char类型和varchar类型都在创建表时置顶了最大长度。(M指定最大长度)
•	char长度时0-255,存储时,他们呢会用空格右填充到指定长度
•	varchar类型长度时可变的。0-65535之间任意值。实际使用时这个最大值里的数占多少就用多少。实际占用的空间为字符串的实际长度+1或2这样。
•	select concat(‘(’,e_char,‘)’),from char _example 让char后面屏蔽的空格显现
•	建议:
•	char 一定会使用指定空间,varchar时根据数据来定空间
•	char 的数据查询效率比varchar高;varchar是需要通过后面的记录数来计算
•	如果确定 数据长度选char不确定选varchar
•	超过255-65535之间直接用varchar
•	如果字符串尾部要保留空格选择varchar,并且varchar必须要指定类型。
•	   
•	 
•	text类型:

类 型
允许的长度
TINYTEXT
0~255字节
TEXT
0~65535字节
MEDIUMTEXT
0~16772150字节
LONGTEXT
0~4294967295字节
TINYTEXT
0~255字节
TEXT
0~65535字节
MEDIUMTEXT
0~16772150字节
LONGTEXT
0~4294967295字节
• 各种text类型的区别在于允许的长度和存储空间不同,
• 特别注意:
• 以上各类型,无需指定的长度
• 允许的长度是指实际存储的字节数,而不是实际的字符个数。
• 字节是一个字符所占的字节数叫做字节
• char长度固定可以用身份号、手机号
• 能用varchar 的地方不用text text最慢
• 姓名用varchar,tinyint年龄


• enum和set类型
• 1:enum又称枚举,属性名 enum(‘值 1’,‘值2’,‘值n’);
• 属性名 参数指定字段的名称,‘值n’参数表示列表中的递n个值,enum类型的值只能取列表中的一个元素。其中列表最多能有65535个值,如果编号1-255一个字节就够。
• 255-65535,采用两个字节保存,
• 列表中的每个值独有一个顺序排列编号,默认编号1开始。可以用编号显示,
• enum实际存储是编号。
6.insert into enum_example values(1);#插入记录可以用编号
7.select e_enum +0 from enum_example;查询enum选项对应的整数值。
8.enum加上not NUll属性,默认值 取列表中的第一个元素,不加将允许插入NULL 9.(可以插入空值),而且NULL为默认。

//set类型

•	 属性名 set(‘值1’,‘值2’)末尾的空格将被系统直接删除,set可以取多个元素需要逗号隔开
•	 
•	 
•	二进制类型:存储二进制数据 如图片,视频等等,

(1.)二进制类型没有字符集,并且排序和比较基本于列值字节的数值,比较
类 型
取值范围
BINARY(M)
字节数为M,允许长度为0~M的定长二进制字符串
VARBINARY(M)
允许长度为0~M的变长二进制字符串,字节数为值的长度加1
BIT(M)
M位二进制数据,M最大值为64
TINYBLOB
可变长二进制数据,最多255个字节
BLOB
可变长二进制数据,最多(216-1)个字节
MEDIUMBLOB
可变长二进制数据,最多(224-1)个字节
LONGBLOB
可变长二进制数据,最多(2³²-1)个字节
• binary,varbinary类型是需要在创建表时候指定最大长度。binary长度固定,创建表时固定,不足最大长度有”\0”补全。
• varbinary实际使用多少就分配多少
• bit(m),m最大值64查询时 bin(),oct()hex()进制。
• 插入数据时用b位插入。
• select bin(b)from bit_example;
• 1.其余类型 无须指定长度,
• 允许的长度时指定实际存储的字节数,不用考虑字符编码
• 实战建议:
• binary长度固定,即每条数据占用等长字节空间,保存长度不超过255字节的二进制数据。
• varbinary可变长,最大65535,
• blob不设置长度,不知道属性最大长度时用blob。binary最varbinary次之,blob最慢
62.
63.
64.列的完整约束。
65.完整约束(条件)是对字段进行限制,要求用户对该属性进行的操作进行约定,如果不满足约束的条件,则数据库将不在执行操作
约束条件
说明
PRIMARY KEY
标识该属性为该表的主键,可以唯一标识对应的元组
FOREIGN KEY
标识该属性为该表的外键,是与之联系的某表的主键
NOT NULL
标识该属性不能为空
UNIQUE
标识该属性的值是唯一的
AUTO INCREMENT
标识该属性的值自动增加,这是MySQL语句的特色
DEFAULT
为该属性设置默认值

• primary key 主键:可以对唯一标识对应的元组,并且可以标识表中的每条信息,主键和记录,主键相当于身份证,记录相当于人,设置表的主键是指在创建表的时候设置某个字段为该表的主键-主要用处,快速查找到表中的某一个信息。并且主键需要唯一。表中和任意两条记录的主键字段的值不能相同,并且是非空值,主键可以是单一的字段也可以是多个字段的组合。
• 1.单字段(primary key,)或primary key(prop type):约束是在类型后面定义的
• 1.给主键设置名字 在主键前面添加 constraint pk_name primary key.知识pk约束名称可以执行 constraint。
• 2.多字段主键:主键由多个属性组合而成时,在属性定义完成之后同一设置主键,
• create table tablename(propname protype,[constarint pk_name]primary key(propname1,propname2)),字段名称1 字段名称2.

• foreign key 表外的键 和某表的主键联系,外键时表的一个特殊字段,外键约束时为了保证多个表之间的参照完整性,并且确认两表之间是什么关系。
• 设置外键约束的两表之间是有父子关系,即子表中某个字段的取值范围是由父表决定的,
• 表之间关系有一对一,一对多 ,多对一。比如,表1:班级表,表二学生表。
• 班级表1
ID
名称
班主任
101
六年级一班
马老师
102
六年级二班
潘老师
• 学生表1
ID
姓名
班级ID
性别
年龄
1
小花
101
M
9
2
小红
102
F
8
3
小军
102
M
8
4
小白
101
F
9
• 每一行对应着一个班级,而一个班级对应着多个学生,所以班级表和学生表的关系就是“一对多”
班级表 为学生表<班级ID >的外键
• 注意:在设置fk约束时候,约束的字段必须依赖数据库中已存在的父表的主键,同时外键也可以是空。
• 具体设置方法:create table tablename_1(
• propname1 proptype,
• foreign key(propname1)references table2_name(table2_column));

• 其中 tablename_1参数是要设置外键的表名,propname1参数设置外键的字段,table2_name是父表的名称,table2_colunmn是父表中设置主键字段的名称。
• 创建表,我要设置这个表中的外键名称 主键的名称

• 79:not null 标识该属性不能为空也是非空约束:不希望字段设置NULL(空时),可以使用nk约束进行设置,在字段类型后面加上 not null,这样插入这个字段数值是空的时候就会报错。
• 如果想要查看执行sql语句,describe :具体操作 desc class;/或者describe class;
• 80.pk是主键,fk是外键,nk是非空约束,首字母缩写。
• 81:unique 这个属性是唯一的(简称uk)保证所有记录中该字段上的值不会和其他字段的值重复,如果重复会保存,方法也是在字段类型后面加unique,注意空值不算重复,


• 82:atuo_increment 自动增加。唯一空战完整性约束,该类型必须是整数,方法也是在字段类型后面加atuo_increment
• ak从1开始。在mysql 版本8中必须先设置主键然后在加ak示例:id int PRIMARY KEY AUTO_INCREMENT,。mysql8 中,AUTO_INCREMENT 必须设为键(主键、外键和唯一键均可)! 否则会报错!

• default 该属性设置字段默认值,当数据库插入新的记录时,如果这个字段没有赋值,defauly会自动为这个字段插入默认值。也是在类型后面直接加default,
• CREATE TABLE tablename(
• propName propType DEFAULT defaultvalue, …
• 如果没有设置则默认为空。


• 调整列的完整约束性:
• 主键PK、外键FK和 唯一键UK、
• 新增属性
• alter table [table_name] add constraint [constraint_name] [unique key| primary key|foreign key] ([column_name])
• 删除
• 通过如下命令查询键值的约束名:
• show index或keys from 表名;
• 执行如下命令删除:
• 主键: alter table 表名 drop primary key;
• 外键或唯一键: alter table 表名 drop index 约束名;
• 修改:按照上述步骤 先执行 删除 然后再 新增 即可!
• 示例:修改默认值DEFAULT、自增长和非空NK
• 使用如下语法重新定义列即可:
• alter table 表名 modify 列名 类定义;

create table class(id int PRIMARY KEY AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); #创建表class,设置字段id为自增长
mysql> alter table class modify teacher varchar(64) DEFAULT ‘Martin’ NOT NULL ; #设置默认值和非空
• mysql> alter table class modify teacher varchar(64) ; #取消默认值和非空
• 103.

• 104.
• 105.
• 表索引
• 索引概念:日常生活中查找电话薄的时候 需要姓或者名字,字母在这里都可以看出时索引,按照 什么来查找。按索引规则查询
• 索引时一种特殊的数据结构,可以查找特定记录,在mysql中所有数据类型都可以被索引。
• 索引只查询索引列,索引相当于新华字典的音序表,通过拼音快速找到。
• 索引存储:底层索引实现主要有两种存储类型,B树(BTREE)和哈希(HASH)索引,InnoDB和MyISAM 使用BTREE索引;而MEMORY 存储引擎可以使用BTREE 和HASH 索引,默认用BTREE.在没有指定的情况下,数据库使用的引擎是 InnoDB。
• 优点速度快,缺点 耗费实际的数量随着数据量的增加而增加,索引需要占用物理空间,并且需要动态维护索引。
• 索引可以提高查询的速度,但是会影响插入记录的速度,因为插入时会按照索引排列可以先删除索引插入好之后在创建索引。
• 索引类型 :普通索引,唯一索引,全文索引,单列索引,多列索引 空间索引
• 创建和查看索引:创建索引是在表的列上创建,有三种方式 :1.创建表的时候创建索引、在已经存在的表上创建索引和使用alter table语句来创建索引
• 1.普通索引:在创建表的时候创建索引,并且不附加任何条件(比如:唯一、非空等限制)普通索引可以在任何类型的字段上。index|KEY。在表字段类型后面加上index或者key,这两个都是用来指定字段索引,两者选择其一就行,作用一样 参数 :indexname 是索引的名字可以省略;参数propname是索引对应的字段名称,该字段必须为i前面定义好的字段。
• INDEX | KEY
• [indexname] (propnamen [(length)] [ ASC | DESC ] ) );
• 【indexname】(字段索引名(索引长度,必须是字符串才能使用)【上升|下降】)
• 可以不指定不指定是上升。
• create table class(id int, name varchar(128) UNIQUE, teacher varchar(64), INDEX index_no(id DESC)); #创建表class, 并建立为id 字段索引
• index索引index_no索引名(字段索引名 下降)
• 查看索引清空 explain 查询语句
• 输出结果 key 实际使用的索引,如果为null为没有使用索引
• possible_keys:显示可能应用在这张表中的索引会列出来 ,但不一样被查询实际使用。
• key_len:表示索引使用的字节数,可以通过该列计算,查询中使用的索引长度,越短越好


• 唯一索引:
• 所谓唯一索引就是在创建索引时候,限制唯一性,比普通更快
• 在创建表的时候create table tablename(propname1 type1,unique index|key【indexname】【propname【(length)】】)。方法和之前一样只需要在索引前面价格unique约束就行。
• indexname索引名字 参数propname索引对应字段的名字,
• 方法一:
• CREATE UNIQUE INDEX indexname
• ON tablename (propname [(length)] [ASC|DESC]);
• 方法二:
• ALTER TABLE tablename ADD UNIQUE INDEX | KEY indexname (propname [(length)] [ASC|DESC]);


• 全文索引:对字符串类型建立基于粉刺的索引,查询数据量较大的字符串类型字段,
• 全文索引以词为基础,mysql默认的分词是所有非字母和数字的特殊符号都是分词符。
• 默认情况下 全文索引执行不区分大小写,如果关联字段为二进制类型,就以区分大小写搜索。
• 1.创建表使用全文索引:CREATE TABLE tablename(
• propname1 type1,
• FULLTEXT INDEX | KEY
• [indexname] (propnamen [(length)] ) );
• fulltext 全文索引。
• create table class(id int, name varchar(128) UNIQUE, teacher varchar(64),comment varchar(1024),FULLTEXT INDEX index_comm(comment)); #创建表class, 并建立为comment 字段为全文索引
• 2.已存在的表上创建索引
• 方法一: 执行create 语句
• CREATE FULLTEXT INDEX indexname
• ON tablename( propname1 [ ( length ) ] );
• 方法二: 执行ALTER TABLE 语句
• ALTER TABLE tablename
• ADD FULLTEXT INDEX|KEY indexname(propname [(length)]);


• 中文分词支持mysql8
• 配置my.ini(windows 10 默认路径Windows 10默认路径: C:\ProgramData\MySQL\MySQL Server 8.0)同时启动mysql8.
• select * from class where match(comment) AGAINST(‘百姓’);#利用全文检索索引快速查询记录



• 多列索引 是指在创建的时候关联的是多个字段,且查询条件中使用了所关联字段中的第一个字段,多列索引才会被使用。
• 创建表时定义索引
• CREATE TABLE tablename(
• propname1 type1,
• INDEX | KEY [indexname] (propname1 [(length)] [ ASC | DESC ],
• Propname2 [(length)] [ ASC | DESC ], )

• create table class(id int, name varchar(128) UNIQUE, teacher varchar(64), INDEX index_mult_columns(id, teacher));

• 已存在的表上创建索引
• 方法一: 执行create 语句
• CREATE INDEX indexname
• ON tablename( propname1 [(length)] [ ASC | DESC ],
• Propname2 [(length)] [ ASC | DESC ],
• 方法二: 执行ALTER TABLE 语句
• ALTER TABLE tablename
• ADD INDEX|KEY indexname(propname1 [(length)] [ ASC | DESC ],
• Propname2 [(length)] [ ASC | DESC ],
• 隐藏索引。
• 让索引暂时不可见,不会被优化器使用。默认情况下索引是可见的
• 可以用来测试索引的性能

• ALTER TABLE tablename ALTER INDEX index_name INVISIBLE; #隐藏索引
• ALTER TABLE tablename ALTER INDEX index_name VISIBLE; #取消隐藏
• 删除索引
• 在MySQL中删除索引通过SQL语句DROP INDEX来实现,其语法形式如下:
• DROP INDEX indexname ON tablename;
• 修改索引: 先删除,后增加


• 索引的设计原则
• 1. 选择唯一性索引:值唯一可以选的,快速命中值
• 2.为经常需要排序、分组和联合操作的字段建立索引:使用字段来排序会浪费时间可以使用索引来。
• 为经常作为查询条件的字段建立索引:经常查询的可以建立索引
• 限制索引的数目:索引能少就少
• 尽量使用数据量少的索引,索引需要先把数据包含到索引里面(索引排序)
• 尽量使用前缀来索引 text类型尽量用前缀索引
• 删除不再使用或者很少使用的索引:定期找出不需要的索引。


• 表的插入:常用的操作,有4种方式使用:
• 插入完整数据记录、
• 插入部分数据记录、
• 插入多条数据记录
• 插入JSON结构的数据(暂时不讲)


• 插入完整数据记录
• 在MySQL中插入完整的数据记录可通过SQL语句INSERT来实现,其语法形式如下:
• INSERT INTO tablename(field1, field2, field3, …, field n) VALUES(value1, value2, value3, …, valuen);
• 可以缩写为:
• INSERT INTO tablename VALUES(value1, value2, value3, …, valuen);
• 参数: tablename表示所要插入完整记录的表名,参数fieldn表示表中的字段名字,参数valuen表示所要插入的数值,并且参数fieldn与参数valuen一一对应。
• insert into class(id, name, teacher) values(1, ‘一班’, ‘Martin’); # 插入完整记录
• mysql> insert into class values(2, ‘二班’, ‘Rock’); # 方式二,完整插入可缩写


• 插入部分数据记录
• INSERT INTO tablename(field1, field2, field3, …, fieldn) VALUES(value1, value2, value3, …, valuen);
• 注意: 如果区域没有设定默认值,也没有设定为自增长,则插入记录时必须插入值
• insert into class(id, name, teacher) values(1, ‘一班’, ‘Martin’); # 插入完整记录
• mysql> insert into class (name, teacher)values(‘二班’, ‘Rock’); # 插入部分记录
• 和完整没有区别就是不可以省略写。
• 插入多条数据记录
• INSERT INTO tablename(field1, field2, field3, …, fieldn)
• VALUES(value11, value12, value13, …, value1n),
• (value21, value22, value23, …, value2n),
• insert into class(id, name, teacher) values(1, ‘一班’, ‘Martin’),(2,‘二班’, ‘Rock’),(3, ‘三班’, ‘Janny’); # 插入多条记录



• 更新表中的数据记录:更新特定数据记录、更新所有数据记录、更新JSON结构的数据记录。可以更新表中已经存在数据记录中的值

• 在MySQL中更新特定数据记录可通过SQL语句UPDATE来实现,其语法形式如下:
• UPDATE tablename SET field1 = value1, field2 = value2, field3 = value3, …, fieldn = valuen)
• WHERE CONDITION;
• 参数tablename表示所要更新数据记录的表名,参数field表示表中所要更新数值的字段名字,参数valuen表示更新后的数值,参数CONDITION指定更新满足条件的特定数据记录。
• insert into class(id, name, teacher) values(1, ‘一班’, ‘Martin’),(2,‘二班’, ‘Rock’),(3, ‘三班’, ‘Janny’); # 插入多条记录
• mysql> update class set teacher = ‘如花老师’ where teacher = ‘Rock’; #通过teacher 字段匹配更新记录 或
• mysql> update class set teacher = ‘如花老师’ where id = 2; #通过id 字段匹配更新记录

• 更新所有数据记录
• UPDATE tablename SET field1 = value1, field2 = value2, field3 = value3, …, fieldn = valuen)
• WHERE CONDITION; 或
• UPDATE tablename SET field1 = value1, field2 = value2, field3 = value3, …, fieldn = valuen) ;
• 在上述语句中,参数tablename表示所要更新数据记录的表名,参数field表示表中所要更新数值的字段名字,参数valuen表示更新后的数值,参数CONDITION表示满足表tablename中的所有数据记录,或不使用关键字WHERE语句。


• 删除特定数据记录
• 在MySQL中删除特定数据记录可通过SQL语句DELETE来实现,其语法形式如下:
• DELETE FROM tablename WHERE CONDITION;
• 删除所有记录
• DELETE FROM tablename WHERE CONDITION; 或
• DELETE FROM tablename;

• 数据查询:查询所有字段数据、查询指定字段数据、避免重复数据查询、对结果进行排序和分组等查询。
• 可以通过select来查询
• 在MySQL中,SELECT语句的基本语法形式如下:
• SELECT field1 field2 … fieldn
• FROM tablename
• [WHERE CONDITION1]
• [GROUP BY fieldm [HAVING CONDITION2]]
• [ORDER BY fieldn [ASC|DESC]];
• 其中,filed1~fieldn参数表示需要查询的字段名;tablename参数表示表的名称;CONDITION1参数表示查询条件;fieldm参数表示按该字段中的数据进行分组;CONDITION2参数表示满足该表达式的数据才能输出;fieldn参数指按该字段中数据进行排序。排序方式由ASC和DESC两个参数指出;ASC参数表示按升序的顺序进行排序,是默认参数;DESC参数表示按降序的顺序进行排序。
• 查询所有字段数据
• 第一种:通过SQL语句SELECT列出表的所有字段,具体语法形式如下:
• SELECT field1,field2,…,fieldn FROM tablename;
• filed1-fieldn从那火速表示需要查询的字段名,tablename参数表示表的名称,
• 269.2。“”符号表示所有字段,
• 查询所有字段数据,select from tablename
• 其中 “
”表示所有字段名,tablename 表示表的名称。
• 3.查询指定字段数据,
• 查询指定字段数据,只需修改关键字SELECT后的字段列表为指定字段即可。
• SELECT field1,field2,…,fieldn FROM tablename;
• 把
号替换称字段名。
• 4.distinct查询。:查询不重复数据。
• SELECT DISTINCT field1,field2,…,fieldn FROM tablename;
• 关键词 distinct去除重复数据,
• in查询 目标/对象是不是在某个集合当中
• SELECT field1,field2,…,fieldn
• FROM tablename WHERE filedm IN(value1,value2,value3,…,valuen);
• 通过in来判断filed 是不是在这个集合当中使用not in可以反响查询。
• 如果使用not in时候表中有空则任何数据都查不到。
• between and查询:指定范围查询。

• SELECT field1,field2,…,fieldn
• FROM tablename WHERE fieldm BETWEEN minvalue AND maxvalue
• 参数fieldn表示名称为tablename的表中的字段名,通过关键字BETWEEN和AND来设置字段field的取值范围,如果字段field的值在所指定的范围内,那么满足查询条件,该记录会被查询出来,否则不会被查询出来。
• BETWEEN minvalue AND maxvalue,表示的是一个范围间的判断过程,只针对数字类型。
• select * from class where chinese between 80 and 90 ; #查询成绩表中语文成绩在80 和 90 之间的学员记录
• mysql> select * from grade where create_date between ‘2020-05-01’ and ‘2020-06-04’
• 通过关键字NOT设置反向查询非查询范围的条件,具体SQL语句如下:
• SELECT name,chinese
• FROM grade WHERE Chinese NOT BETWEEN 85 AND 90;
• 上面语句等同于:
• select name,chinese from grade where chinese <85 or chinese >90;
• like 模糊查询,
• SELECT field1,field2,…,fieldn
• FROM tablename WHERE fieldm LIKE value;
• 通过关键字LIKE来判断字段field的值是否与value字符串匹配,,如果一样就查出来。

• 字符串必须加上单引号(‘’)和双引号(″″)。字符串和通配符

符号
功能描述
_
该通配符值能匹配单个字符
%
该通配符可以匹配任意长度的字符串,既可以是0个字符、1个字符,也可以是很多字符








• 的
• 查找某个字段含有‘三’字的记录:
• SELECT * FROM class WHERE teacher LIKE ‘%三%’;
• 2.查找teacher字段中既有“三”又有“猫”的记录,请使用and条件
• SELECT * FROM class WHERE teacher LIKE ‘%三%’ AND teacher LIKE ‘%猫%’;

• 3.查询teacher字段中既有“三”又有“猫”的记录,同时“猫”在“三”之后的记录
• SELECT * FROM class WHERE teacher LIKE ‘%三%猫%’;
• 只找出“唐三藏”这样teacher为三个字且中间一个字是“三”的;
• SELECT * FROM [user] WHERE u_name LIKE ‘’;
• 注意:表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:(可以代表一个中文 字符)
• 虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”
• 5.只找出“三脚猫”这样teacher为三个字且第一个字是“三”的;
• SELECT * FROM class WHERE teacher LIKE ‘三
_’;
• 2. 带有“_”通配符的查询
• (1)查询字段teacher中第二个字母为A的数据记录,具体SQL语句如下:
• SELECT * FROM class WHERE teacher LIKE ‘_A%’;
• (2)如果想查询第二个字母不是A的全部老师,可以执行逻辑非运算符(NOT),具体SQL语句如下:
• SELECT * FROM class WHERE NOT teacher LIKE ‘_A%’;
• (3)如果想查询第二个字母不是A的全部老师,也可以用以下SQL语句查询:
• SELECT * FROM class WHERE teacher NOT LIKE ‘_A%’;

• 3.使用LIKE关键字查询其他类型数据
• (1)执行SQL语句SELECT,查询grade表字段english带有数字9的全部学生,具体SQL语句如下:
• SELECT name,english FROM grade WHERE english LIKE ‘%9%’;
• (2)对于LIKE关键字,如果匹配“%%”,就表示查询所有数据记录。
• SELECT name FROM grade WHERE name LIKE ‘%%’;
• 对查询结果排序
• select field1 field2 From tablename ORDER BY fieldm【asc|Desc】
• tablename表示所要进行的排序的表名,参数fieldn 表示表中的字段名字,fidlem按照该字段进行排序
• 记录字段的值为空那么升排序时候含空值优先控制是最小字段
• 简单分组查询
• 5个统计函数帮助用户统计数据,计算和,计算平均数,计算最大和最小值,
• select function()[filed]
• from tablename where condition GRoup BY field
• field 表示字段名 通过该字段名称为tablename的表数据记录进行分组
• 1.统计数量
• count()该种方式可以实现对表记录进行统计,不管表字段中包含的是NULL还是非空
• count(field)该种方式可以实现对指定字段的记录进行统计,在具体统计时将忽略NULL值
• 2统计计算平均值额
• 该函数只有一种方式
• AVG(field)使用方式:该种方式可以实现对指定字段的平均值进行计算,在具体统计时将忽略NULL值
• 3.
• 统计集合求和 该函数只有一种使用方式
• sum(field )使用方式:该种方式可以实现计算指定字段值之和,在具体统计时将忽律NULL值
• 统计最大值
• max(field)使用方式:该种方式可以实现计算指定字段值中的最大值在具体计算时将忽略NULL值
• 统计最大值
• max(field)使用方式:该方式可以实现计算指定字段最大值,在具体统计时将忽略NUUL值
• 统计最小值额
• min(field)使用该方式可以实现计算指定字段最小值额在具体统计时将忽略、
nsert into grade values(1, ‘甲’, 80, 87, 91, 1),(2,‘乙’, 72, 64, 89,2),(3, ‘丙’, 54, 69, 87,2),(4,‘丁’, 78, 79, 89, 1); #插入多条记录
mysql> select class_id, sum(math) from grade group by class_id; #对两个班级的数学成绩进行统计
mysql> select class_id, avg(math), avg(chinese), avg(english) from grade group by class_id; #统计平均分,会忽略掉NULL 记录
• 样式
• 统计分组查询
• 因为关键字GROUP BY单独使用时,默认查询出每个分组中随机的一条记录可以通过函数GROUP_CONCAT()来实现函数可以实现显示每个分组中的指定字段,函数的具体语法形式如下:
• SELECT GROUP_CONCAT(field)
• FROM tablename
• WHERE CONDITION GROUP BY field;
SELECT GROUP_CONCAT(name) name, sum(math) FROM grade GROUP BY class_id; #按class_id 进行分组,统计数学总分并显示每个分组中的姓名

• 联合查询
• 1,内连查询inner join 在mysql中内连数据查询通过 inner join 。。on语句来实现
• INNER JOIN tablename2 [INNER JOIN tablenamen] ON CONDITION
• 参数fieldn表示要查询的字段名,来源于所连接的表tablename1和tablename2,关键字INNER JOIN表示表进行内连接,参数CONDITION表示进行匹配的条件
• elect * from class inner join student on class.id = student.class_id; #查询class 表和student 表中班级字段相同的记录并进行内连接
• mysql> select * from class as a inner join student as b where a.id = b.class_id; #同上,使用别名查询
• 名字很长时候所以使用别名
• SELECT field1, field2, …,fieldn [AS] otherfieldn
• FROM tablename1 [AS] othertablename1, …,
• Tablenamen [AS] othertablenamen … where othertablename1.fieldx = othertablenamen.fieldx … ;
• 参数tablename
为表原来的名字,参数othertablename*为新表名,之所以要为表设置新的名字,是为了让SQL语句代码更加直观、更加人性化和实现更加复杂的功能。
• 内连接查询中存在一种特殊的等值连接——自连接。所谓自连接,就是指表与其自身进行连接。
• use school; #选择数据库school
• mysql> select t1.id, t1.name, t1.class_id from student t1 inner join student t2 on t1.class_id = t2.class_id and t2.name= ‘小红’; #查询学生 ”小红 ”所在班级的其他学生
• 等值链接
• 内连接查询中的等值连接就是在关键字ON后的匹配条件中通过等于关系运算符(=)来实现等值条件。
• mysql> select * from class as a inner join student as b where a.id = b.class_id;
• 不等值连接
• 连接查询中的不等连接就是在关键字ON后的匹配条件中通过除了等于关系运算符来实现不等条件外,还可以使用关系运算符,包含“>”“>=”“<”“<=”和“!=”等运算符号。
• mysql> select * from class as a inner join student as b where a.id != b.class_id;
• 外连接查询
• 当我们在查询数据时,要求返回所操作表中至少一个表的所有数据记录,通过SQL语句“OUTER JOIN…ON”来实现。外连接数据查询语法形式如下:
• SELECT field1,field2,…,fieldn
• FROM tablename1 LEFT|RIGHT [OUTER] JOIN tablename2
• 数fieldn表示所要查询的字段名字,来源于所连接的表tablename1和tablename2,关键字OUTER JOIN表示表进行外连接,参数CONDITION表示进行匹配的条件。
• 377.外连接查询可以分为以下二类:
• 388.左连接和外连接
• 399.左连接:新关系中执行匹配条件时,以关键字LEFT JOIN左边的表为参考表结果包括LEFT OUTER字句中指定的左表的所有行
• 400.如果左表的某行在右表中没有匹配行,则在相关联的结果行中,右表的所有选择列表均为空值。
• 401.
• select * from student as a left join class as b on a.class_id = b.id; #左连接查询所有学生对应的班级信息
• 右连接:外连接查询中的右外连接在新关系中执行匹配条件时,以关键字RIGHT JOIN右边的表为参考表,如果右表的某行在左表中没有匹配行,左表将返回空值。
• select * from student as a right join class as b on a.class_id = b.id; #右连接查询所有班级对应的学员信息
• 合并查询数据记录

• 在MySQL中通过关键字UNION来实现合并操作将多个SELECT语句的查询结果合并在一个表中。
• SELECT field1,field2,…,fieldn FROM tablename1
• UNION | UNION ALL
• SELECT field1,field2,…,fieldn FROM tablename2
• 选择语句select 的列数相同就可以合并,union和union all的主要区别是union all是把结果集直接合并在一起,而union 是将union all后的结果再执行一次distinct,去除重复的记录后的结果。
• select teacher as people from class union all select name as people from student; #同上,使用别名查询
• mysql> select teacher,id from class union all select name,class_id from student; #查询班级表所有(老师、班级ID)和学生表中所有学生(姓名、班级ID)
• 子查询
• 是指在一个查询中嵌套了其他的若干查询,
• select teacher from class where id = (select class_id from student where name=‘小花’); #查询“小花”所在班级班主任的姓名
• 使用比较运算符时,select 子句获得的记录数不能大于1条!!!
• 带关键字IN的子查询
• 个查询语句的条件可能落在另一个SELECT语句的查询结果中,这时可以使用IN关键字
• select teacher from class where id in (select class_id from student where name=‘小花’); #查询student 表中“小花”所在班级班主任的名字
• mysql> select teacher from class where id in (select class_id from student where name like ‘小%’); #查询姓名以“小”字开头的学生所在班级班主任的姓名
• 关键字EXISTS的子查询
• 关键字EXISTS表示存在,后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行;如果至少返回一行,那么EXISTS的结果为true,此时外层语句将进行查询;如果子查询没有返回任何行,那么EXISTS返回的结果是false,此时外层语句将不进行查询。
• select * from class where id=102 and exists (select * from student where class_id=102); #如果102班存在学生记录,就查询102班的班级信息
• 带关键字ANY的子查询
• 关键字ANY表示满足其中任一条件。只要满足内层查询语句返回的结果中的任何一个就可以通过该条件来执行外层查询语句
• select st.id, st.name, st.math+st.chinese+st.english total from grade st where (math+chinese+english) >= ANY (select score from scholarship); #查询能获得奖学金的学院记录
• 带关键字ALL的子查询
• 关键字ALL表示满足所有条件。使用关键字ALL时,只有满足内层查询语句返回的所有结果才可以执行外层查询语句。
• select st.id, st.name, st.math+st.chinese+st.english total from grade st where (math+chinese+english) >= ALL (select score from scholarship); #查询能获得一等奖学金的同学记录
• mysql> select st.id, st.name, st.math+st.chinese+st.english total from grade st where (math+chinese+english) < ALL (select score from scholarship); #查询不能获得奖学金的同学记录
• 视图操作:小学的时候,每年都会举办一次抽考活动,意思是从每一个班级里面筛选出几个优秀的同学去参加考试。这时候很多班级筛选出来的这些同学就可以临时组成一个班级,如果我们把每一个班级都当做是一张真实的表,这个临时的班级在数据库里就可以当做一个视图,也就是说,这个临时的班级其实不是真实存在的,当考试过后,这些学生还是各回各家各找各妈。。。。
• 视图是从一个或多个表中导出来的表,是一种虚拟存在的表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据,这样用户可以不看整个数据库表中的数据,而只关心对自己有用的数据。视图可以使用户的操作更方便,而且可以保障数据库系统的安全性。
• 虽然视图可以被看成是一种虚拟表,但是其物理上是不存在的,即MySQL并没有专门的位置为视图存储数据。根据视图的概念可以发现其数据来源于查询语句,因此创建视图的基本语法为:
• CREATE[OR REPLACE] VIEW viewname[columnlist]
• AS SELECT statement 其中,CREATE表示创建新的视图;REPLACE表示替换已经创建的视图;viewname为视图的名称;columnlist为属性列;SELECT statement表示SELECT语句;
• 注意! 创建视图需要登陆用户有相应的权限,查看权限方法:
• select user, Select_priv, Create_view_priv FROM mysql.user;#查询数据库用户创建和选择视图权限
• alter table student add privacy varchar(64);# 增加私隐列
• mysql> ;#查询数据库用户创建和选择视图权限
• mysql> CREATE VIEW view_student AS select id, class_id, name from student ;#为学生表创建视图
• mysql> desc view_student;#查看视图
• mysql> select * from view_student; #根据视图进行查询

• 在多表上创建视图
• CREATE[OR REPLACE] VIEW viewname[columnlist]
• AS SELECT statement
• CREATE表示创建新的视图;REPLACE表示替换已经创建的视图;viewname为视图的名称;columnlist为属性列;SELECT statement表示SELECT语句;与单表上创建视图不同的是,SELECT子句是涉及到多表的联合查询语句。
• use school; #选择数据库school
• mysql> alter table student add privacy varchar(64);# 增加私隐列
• mysql> ;#查询数据库用户创建和选择视图权限
• mysql> CREATE VIEW view_student_class AS select student.id, student.name, class.name, class.teacher from class inner join student on class.id = student.class_id;#为学生表创建视图
• mysql> desc view_student_class;#查看视图
• mysql> select * from view_student_class; #根据视图进行查询

• 创建完视图后,像表一样,我们经常需要查看视图信息DESCRIBE、SHOW TABLES、SHOW CREATE VIEW。
• 首先要确保拥有SHOW VIEW的权限。
• 用DESCRIBE | DESC语句查看视图基本信息
• DESCRIBE | DESC viewname;
• 参数viewname表示所要查看设计信息的视图名称。
• 从MySQL 5.1版本开始,执行SHOW TABLES语句时不仅会显示表的名字,同时也会显示视图的名字。
• SHOW TABLES;
• 显示视图名字
• 使用 show create view/table 语句查看视图创建信息
• 更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。
• 为视图实质是一个虚拟表,其中没有数据,通过视图更新时都是转换到基本表更新。
• alter table student add privacy varchar(64);# 增加私隐列
• mysql> ;#查询数据库用户创建和选择视图权限
• mysql> CREATE VIEW view_student AS select id, class_id, name from student ;#为学生表创建视图
• mysql> desc view_student;#查看视图
• mysql> select * from view_student; #根据视图进行查询
• mysql> update view_student set name=‘小花花’ where name=‘小花’; #通过视图更新小花为小花花
• 不能更新的情况:
• 视图中包含SUM()、COUNT()、MAX()和MIN()等函数
• 视图中包含UNION、UNION ALL、DISTINCT、GROUP BY和HAVING等关键字
• 视图对应的表存在没有默认值的列,而且该列没有包含在视图里
• 包含子查询的视图
• 其他特殊情况

你可能感兴趣的:(C++-MYSQL,c语言/c++管理,开发语言,c++,mysql,oracle,c语言,开发语言,数据库)