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,tomm),(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 可以执行的注释代码

使用mybatis框架中mapper Mysql Sql语句错误

如何记录MySQL执行过的SQL语句

mysql sql语句两条合并成一条

mysql sql 语句