Mysql------SQL语句
Posted wang-jin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql------SQL语句相关的知识,希望对你有一定的参考价值。
关系型数据库的常见组件
数据库:database
表:table
行:row #可以叫记录
列:column #字段,属性,域
索引:index
视图:view
用户:user
权限:privilege
存储过程:procedure,无返回值
存储函数:function有返回值 #与bash里的函数有区别
触发器:trigger
事件调度器:event scheduler,任务计划
SQL语句分类
DDL: Data Defination Language 数据定义语言
CREATE(增,创建表),DROP(删),ALTER(修改数据库的具体资源的架构,如表的结构,不是改数据库中的数据)
DML: Data Manipulation Language 数据操纵语言,#是对数据库中数据的操作
INSERT,DELETE,UPDATE,SELECT
DCL:Data Control Language 数据控制语言,#权限问题
GRANT,REVOKE,COMMIT,ROLLBACK
DQL:Data Query Language 数据查询语言 #主要用来查询语句的
SELECT
SQL语句构成:
Keyword组成clause(字句)
多条clause组成语句
示例:
SELECT * SELECT子句
FROM products(后面跟表名) FROM子句
WHERE price>400 (后面跟条件) WHERE子句
说明:一组SQL语句,由三个子句构成,SELECT,FROM和WHERE是关键字
数据库操作
创建数据库: CREATE DATABASE(关键字,对应的资源,如视图,触发器等)|SCHEMA [IF NOT EXISTS] (可有可无,如果不存 在,就创建数据库,)‘DB_NAME(数据库名)‘; CHARACTER SET ‘character set name‘(字符集)
COLLATE ‘collate name‘(排序方式) eg:[[email protected] ~]# mysql -uroot -S /mysqldb/3307/socket/mysql.sock -p111111 MariaDB [(none)]> show databases 查看当前的数据库列表,默认为4个 -> ; +----------------- -+ | Database | +--------------------+ | information_schema (虚拟的数据库,在内存里)| | mysql | | performance_schema | | test (测试数据库| +-------------------- + 4 rows in set (0.00 sec) MariaDB [(none)]> drop database db1
MariaDB [(none)]> show databases -> ; +--------------------+ | Database | +--------------------+ | db1 | | information_schema | | mysql | | performance_schema | | test | +--------------------+ 1:删除数据库 DROP DATABASE|SCHEMA [IF EXISTS] ‘DB_NAME‘; MariaDB [(none)]> drop database db1:
2:查看支持所有字符集:SHOW CHARACTER SET;
show character set; 3:查看支持所有排序规则:SHOW COLLATION;
show collation; 4:获取命令使用帮助: mysql> HELP KEYWORD;
MYSQL>help keyword; 5:查看数据库列表: mysql> SHOW DATABASES;
mysql>show databases;
6:MariaDB [(none)]> use db1 指定当前数据库db1
Database changed
MariaDB [db1]> show tables; 查看表的列表
Empty set (0.00 sec)
注意:mysql 客户的的命令结束不用加‘;’而SQL标准语句中的需加‘;’
表
1:表:二维关系:
2:设计表:遵循规范
3:定义:字段,索引
字段:字段名,字段数据类型,修饰符
约束,索引:应该创建在经常用作查询条件的字段上
注意:表的名称,字段名,属性,数据类型,一旦定义了,就不要改了,改的话会影响表中的数据
创建表:CREATE TABLE
(1) 直接创建
MariaDB [db1]>create table students ( id tinyint unsigned not null primary key,name
char(10) not null,sex char(1),phone char(11) );
解释:(第一项为创建的id,采用最小的整数,不为空,且为主键;第二项为姓名;给定十个字符;
第四个为性别,给一个字符;第五项为电话号码,设定为11个字符)
(11) 直接创建
MariaDB [db1]> create table emp ( id int unsigned auto_increment primary key, name varchar(30)
not null, sex char(1) default ‘m‘, address varchar(100) ) engine=innodb charset=utf8; (id:正整数,auto_increment自动递增, 主键 name:varchar长度30,性别,default ‘m‘默认值定义为m,
地址varchar(100), engine=innodb定义数据库的存储引擎 charset=utf8定义字符集)
(2) 通过查询现存表创建;新表会被直接插入查询而来的数据 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options]
[partition_options] select_statement
auto_increment:数字自动递增; unsigned 放在int定义数字的后面
注意:一个汉字,字母数字在char里都算一个字符。primary key放在最后;添加各种修饰符要注意前后顺序,如上例中,如果将修饰符的顺序更改则会报错不能生成此表;
eg:MariaDB [db1]> create table user select user,host,password from mysql.user; 利用一个现存的表,创建一个新表,新表会被直接插入查询而来的数据
2:如果只想模仿查询旧表创建一个无记录的表我们可以加入条件 WHERE 0=1;
(3) 通过复制现存的表的表结构创建,但不复制数据 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) }
通过复制现存的表的表结构创建,但不复制数据
CREATE TABLE user3 LIKE mysql.user;
:注意:
Storage Engine是指表类型,也即在表创建时指明其使用的存储引擎,同一 库中不同表可以使用不同的存储引擎
同一个库中表建议要使用同一种存储引擎类型
1:CREATE TABLE [IF NOT EXISTS] ‘tbl_name’ (col1 type1 修饰符, col2 type2 修饰符, ...)
2:字段信息
? col type1
? PRIMARY KEY(col1,...)
? INDEX(col1, ...)
? UNIQUE KEY(col1, ...)
3:表选项:
? ENGINE [=] engine_name
SHOW ENGINES;查看支持的engine类型
? ROW_FORMAT [=]
{DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
4:获取帮助:mysql> HELP CREATE TABLE;
表操作
查看所有的引擎:SHOW ENGINES
查看表:SHOW TABLES [FROM db_name]
查看表结构:desc tbl_name;如:desc students
查看表创建命令:SHOW CREATE TABLE tbl_name
查看表状态:show table status like ‘tbl_name;
查看库中所有表状态:SHOW TABLE STATUS FROM db_name
查看单个表状态:show table status like ‘tbl_name’G; (表名必须要加引号)
查看创建表的命令:show create table tbl_name;
查看指定库中所有表状态:show table status from dbl_name;
查看库里的表;(首先进入到此库中然后查看):show tables;
删除库里的某个表: (首先还是要进入到存放此表的库里,查看后删除):drop table tbl_name;
数据类型
选择正确的数据类型对于获得高性能至关重要
三大原则
1:更小的通常更好,尽量使用可正确存储数据的最小数据类型:
2:简单就好,简单数据类型的操作通常需要更少的CPU周期
3:尽量避免NULL,包含为NULL的列,对MySQL更难优化
1、整型
tinyint(m) 1个字节范围(-128~127)
smallint(m) 2个字节 范围(-32768~32767)
mediumint(m) 3个字节 范围(-8388608~8388607)
int(m) 4个字节 范围(-2147483648~2147483647)
bigint(m) 8个字节 范围(+-9.22*10的18次方)
(无论是几都要占用8个字节)<br><br>取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~255) 取正整数。
加了unsigned,则最大值翻倍,如:tinyint unsigned的取值范围为(0~255) int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范 围,规定了MySQL的一些交互工具(例如MySQL命令行客户端)用来显示字符 的个数。对于存储和计算来说,Int(1)和Int(20)是相同的
BOOL,BOOLEAN:布尔型,是TINYINT(1)的同义词。zero值被视为假, 非zero值视为真
2、浮点型(float和double),近似值
3、定点数
在数据库中存放的是精确值,存为十进制
decimal(m,d) 参数m<65 是总个数,d<30且 d<m是小数位
MySQL5.0和更高版本将数字打包保存到一个二进制字符串中(每4个字节存 9个数字)。例如,decimal(18,9)小数点两边将各存储9个数字,一共使用9 个字节:小数点前的数字用4个 字节,小数点后的数字用4个字节,小数点本 身占1个字节
浮点类型在存储同样范围的值时,通常比decimal使用更少的空间。float使 用4个字节存储。double占用8个字节
因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时 才使用decimal——例如存储财务数据。但在数据量比较大的时候,可以考 虑使用bigint代替decimal
4、字符串(char,varchar,_text)
char(n) 固定长度,最多255个字符
varchar(n) 可变长度,最多65535个字符
tinytext 可变长度,最多255个字符
text 可变长度,最多65535个字符
mediumtext 可变长度,最多2的24次方-1个字符
longtext 可变长度,最多2的32次方-1个字符
BINARY(M) 固定长度,可存二进制或字符,长度为0-M字节
VARBINARY(M) 可变长度,可存二进制或字符,允许长度为0-M字节
内建类型:ENUM枚举, SET集合
char和varchar:
? 1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。 所以char类型存储的字符串末尾不能有空格,varchar不限于此。
? 2.char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar 是存入的实际字符数+1个字节(n< n>255),所以varchar(4),存入3个字符将 占用4个字节。
? 3.char类型的字符串检索速度要比varchar类型的快
varchar和text:
? 1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个 字节(n< n>255),text是实际字符数+2个字节。
? 2.text类型不能有默认值
? 3.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速 度快于text
5.二进制数据:BLOB
? BLOB和text存储方式不同,TEXT以文本方式存储,英文存储区分大小写, 而Blob是以二进制方式存储,不分大小写
? BLOB存储的数据只能整体读出
? TEXT可以指定字符集,BLOB不用指定字符集
6.日期时间类型
? date 日期 ‘2008-12-2‘
? time 时间 ‘12:25:36‘
? datetime 日期时间 ‘2008-12-2 22:06:44‘
? timestamp 自动存储记录修改时间 ? YEAR(2), YEAR(4):年份
timestamp字段里的时间数据会随其他字段修改的时候自动刷新,这个数据类 型的字段可以存放这条记录最后被修改的时间
修饰符
所有类型:
? NULL 数据列可包含NULL值
? NOT NULL 数据列不允许包含NULL值
? DEFAULT 默认值 ? PRIMARY KEY 主键
? UNIQUE KEY 唯一键
? CHARACTER SET name 指定一个字符集
数值型
? AUTO_INCREMENT 自动递增,适用于整数类型 (数字自动增长不需要手动在添加了)
? UNSIGNED 无符号
表操作
DROP TABLE [IF EXISTS] ‘tbl_name‘;
ALTER TABLE ‘tbl_name‘
字段:
添加字段:add
ADD col1 data_type [FIRST|AFTER col_name]
删除字段:drop
修改字段: alter(默认值), change(字段名), modify(字段属性)
索引:
添加索引:add index
删除索引:drop index
表选项
修改:
查看表上的索引:SHOW INDEXES FROM [db_name.]tbl_name;
查看帮助:Help ALTER TABLE
eg:
DML 对数据的操作语言,就是对数据的,增,改,删,
1、INSERT 插入数据 数字不用加引号,但字符串一定要加引号
单条记录插入
MariaDB [db1]> insert students values(1,‘bai‘,‘10086‘,‘m‘);
Query OK, 1 row affected (0.00 sec)
MariaDB [db1]> desc students;
+-------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id | tinyint(3) unsigned | NO | PRI | NULL | |
| name | char(10) | NO | | NULL | |
| phone | char(11) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
+-------+---------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
MariaDB [db1]> select * from students;
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 1 | bai | 10086 | m |
+----+------+-------+------+
1 row in set (0.00 sec)
单条记录插入
MariaDB [db1]> insert students(id,name,sex) values (2,‘liui‘,‘m‘),(3,‘lin‘,‘f‘);
Query OK, 2 rows affected (0.00 sec)Records: 2 Duplicates: 0 Warnings: 0
MariaDB [db1]> select * from students;
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 1 | bai | 10086 | m |
| 2 | liui | NULL | m |
| 3 | lin | NULL | f |
| 70 | wang | NULL | NULL |
+----+------+-------+------+
4 rows in set (0.00 sec)
MariaDB [db1]> insert students set id=4,name=‘zhao‘;
Query OK, 1 row affected (0.00 sec)
MariaDB [db1]> select * from students;
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 1 | bai | 10086 | m |
| 2 | liui | NULL | m |
| 3 | lin | NULL | f |
| 4 | zhao | NULL | NULL |
| 70 | wang | NULL | NULL |
+----+------+-------+------+
5 rows in set (0.00 sec)
从其他表查询数据保存到此表中
MariaDB [db1]> select *from user
-> ;
+------+-----------+-------------------------------------------+
| user | host | password |
+------+-----------+-------------------------------------------+
| root | localhost | *FD571203974BA9AFE270FE62151AE967ECA5E0AA |
| root | centos7 | |
| root | 127.0.0.1 | |
| root | ::1 | |
| | localhost | |
| | centos7 | |
+------+-----------+-------------------------------------------+
MariaDB [db1]> desc emp
-> ;
+---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(30) | NO | | NULL | |
| sex | char(1) | YES | | m | |
| address | varchar(100) | YES | | NULL | |
+---------+------------------+------+-----+---------+----------------+
MariaDB [db1]> insert emp(name,address) select user,host from user;
MariaDB [db1]> select * from emp;
+----+------+------+-----------+
| id | name | sex | address |
+----+------+------+-----------+
| 1 | root | m | localhost |
| 2 | root | m | centos7 |
| 3 | root | m | 127.0.0.1 |
| 4 | root | m | ::1 |
| 5 | | m | localhost |
| 6 | | m | centos7 |
+----+------+------+-----------+
2、UPDATE 修改数据 where是限定要改那条记录
MariaDB [db1]> select * from emp; +----+------+------+-----------+ | id | name | sex | address | +----+------+------+-----------+ | 1 | root | m | localhost | | 2 | root | m | centos7 | | 3 | root | m | 127.0.0.1 | | 4 | root | m | ::1 | | 5 | | m | localhost | | 6 | | m | centos7 | +----+------+------+-----------+ MariaDB [db1]> update emp set name=‘admin‘,address=‘beijing‘ where id=1; MariaDB [db1]> select * from emp ; +----+-------+------+-----------+ | id | name | sex | address | +----+-------+------+-----------+ | 1 | admin | m | beijing | | 2 | root | m | centos7 | | 3 | root | m | 127.0.0.1 | | 4 | root | m | ::1 | | 5 | | m | localhost | | 6 | | m | centos7 | +----+-------+------+-----------+
MariaDB [db1]> update emp set name=‘admin‘,addre ss=‘beijing‘ where name=‘root‘ L
IMIT 2 ; LIMIT 限定修改的记录数,,一共是三个root,,限定改2个
MariaDB [db1]> select * from emp ;
+----+-------+------+-----------+
| id | name | sex | address |
+----+-------+------+-----------+
| 1 | admin | m | beijing |
| 2 | admin | m | beijing |
| 3 | admin | m | beijing |
| 4 | root | m | ::1 |
| 5 | | m | localhost |
| 6 | | m | centos7 |
+----+-------+------+-----------+
3、DELETE 删除数据
MariaDB [db1]> delete from emp ;
MariaDB [db1]> truncate table emp; #快速删除,不可恢复
注意:
delete from students where id=4; (删除id=4的哪一行)
delete from students;如果不写where限定条件,默认会删除此表的所有内容,如果在配置文件里面添加
vim /etc/my.cnf.d/mysql-clients.cnf #当然加限制条件是要退出mysql
[mysql]
safe-updates
[[email protected] ~]# mysql --safe-updates 添加此行内容就不会删除所有的内容了。比较安全
DQL语句
SELECT
- AS:别名
- WHERE:指明过滤条件以实现“选择”的功能
- +, -, *, /, %:算术操作符
- =, !=, <>, >, <, >=, <=:比较操作符 #=是精确匹配
- between min_num AND max_num:在min_num和max_mun之间
- IN (element1,element2,...):在element...中的
- IS NULL:为空
- IS NOT NULL:不为空
- LIKE:做匹配,像。。。RLIKE:正则表达式,不建议用
- %:任意长度的任意字符
- _:单个任意字符
- REGEXP:同上
- NOT, AND, OR, XOR:逻辑操作符
- GROUP BY:根据指定的条件把查询结果进行“分组”以用于做“聚合”运算
- AVG() 平均数
- MAX() 最大数
- MIN() 最小数
- COUNT() 统计
- SUM() 求和
- HAVING :对分组聚合运算后的结果指定过滤条件。类似WHERE的作用,但只能在分组中使用
- ORDER BY:排序
- ASC:正序,默认
- DESC:倒序
- -KEYWORD:在排序时在关键字前加-可以避免把NULL排在前边
- LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制
示例 DESC students;
INSERT INTO students VALUES(1,‘tom‘,‘m‘),(2,‘alice‘,‘f‘);
INSERT INTO students(id,name) VALUES(3,‘jack‘),(4,‘allen‘);
SELECT * FROM students WHERE id < 3;
SELECT * FROM students WHERE gender=‘m‘;
SELECT * FROM students WHERE gender IS NULL;
SELECT * FROM students WHERE gender IS NOT NULL;
SELECT * FROM students ORDER BY name DESC LIMIT 2;
SELECT * FROM students ORDER BY name DESC LIMIT 1,2;
SELECT * FROM students WHERE id >=2 and id <=4
SELECT * FROM students WHERE BETWEEN 2 AND 4
SELECT * FROM students WHERE name LIKE ‘t%’
SELECT * FROM students WHERE name RLIKE ‘.*[lo].*‘;
SELECT id stuid,name as stuname FROM student
eg1:
eg2:
MariaDB [db1]> select * from students;
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 1 | bai | 10086 | m |
| 2 | liui | NULL | m |
| 3 | lin | NULL | f |
| 4 | zhao | NULL | NULL |
| 70 | wang | NULL | NULL |
+----+------+-------+------+
MariaDB [db1]> insert students values (5,‘wang‘,10000,‘m‘); 插入5号学员信息
MariaDB [db1]> select * from students;
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 1 | bai | 10086 | m |
| 2 | liui | NULL | m |
| 3 | lin | NULL | f |
| 4 | zhao | NULL | NULL |
| 5 | wang | 10000 | m |
| 70 | wang | NULL | NULL |
+----+------+-------+------+
MariaDB [db1]> select * from students where id >=2 and id<=5;#查询2到5号学生的信息
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 2 | liui | NULL | m |
| 3 | lin | NULL | f |
| 4 | zhao | NULL | NULL |
| 5 | wang | 10000 | m |
+----+------+-------+------+
MariaDB [db1]> select * from students where id between 2 and 5;#查询2到5号学生的信息
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 2 | liui | NULL | m |
| 3 | lin | NULL | f |
| 4 | zhao | NULL | NULL |
| 5 | wang | 10000 | m |
+----+------+-------+------+
MariaDB [db1]> select * from students where sex in (‘f‘,‘m‘);#查询性别中包含‘m‘‘f’的信息
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 1 | bai | 10086 | m |
| 2 | liui | NULL | m |
| 3 | lin | NULL | f |
| 5 | wang | 10000 | m |
+----+------+-------+------+
MariaDB [db1]> select st.id as 编号,name 姓名 from students as st where sex in (
‘f‘,‘m‘);
+--------+--------+
| 编号 | 姓名 |
+--------+--------+
| 1 | bai |
| 2 | liui |
| 3 | lin |
| 5 | wang |
+--------+--------+
以上是关于Mysql------SQL语句的主要内容,如果未能解决你的问题,请参考以下文章
MySql SQL 脚本的可移植性,MySql 可以执行的注释代码
MySql SQL 脚本的可移植性,MySql 可以执行的注释代码